Имеется отладочная плата на базе AM3517 (Cortex-A8) с запущенным Linux на базе ядра 2.6.32. Пытаюсь разобраться с отладкой ядра с помощью встроенного отладчика kgdb.
Ядро собрано с отладочной информацией и поддержкой отладчика KGDB. С компьютера по последовательному порту подключаюсь к плате с помощью gdb. Установка точек останова, просмотр глобальных переменных ядра работают без проблем. Однако столнулся с тем, что никак не удается прочитать значения регистров UART.
Допустим, пытаемся прочитать регистр MCR UART3.
В ядре информация о UART3 находится в следующей структуре.
Код
static struct plat_serial8250_port serial_platform_data2[] = {
{
.mapbase = OMAP_UART3_BASE,
.irq = 74,
.iotype = UPIO_MEM,
.regshift = 2,
{
.mapbase = OMAP_UART3_BASE,
.irq = 74,
.iotype = UPIO_MEM,
.regshift = 2,
mapbase - это физический адрес из Technical Reference Manual, для UART3 он будет 0x49020000.
Через gdb можем проверить содержимое этой структуры и попробовать обратиться к регистру MCR, находящемся по смещению 0x10.
Код
(gdb) p/x serial_platform_data2.mapbase
$34 = 0x49020000
(gdb) p/x serial_platform_data2.membase
$35 = 0xfb020000
(gdb) x serial_platform_data2.membase+0x10
0xfb020000: Cannot access memory at address 0xfb020000
(gdb) x serial_platform_data2.mapbase+0x10
0x49020000: Cannot access memory at address 0x49020000
$34 = 0x49020000
(gdb) p/x serial_platform_data2.membase
$35 = 0xfb020000
(gdb) x serial_platform_data2.membase+0x10
0xfb020000: Cannot access memory at address 0xfb020000
(gdb) x serial_platform_data2.mapbase+0x10
0x49020000: Cannot access memory at address 0x49020000
Поле membase содержит виртуальный базовый адрес получаемый после вызова ioremap(). Насколько я понимаю, что "рабочими" адресами для ядра являются все-таки виртуальные.
Однако ни по физическому, ни по виртуальному адресу прочитать не удалось. В чем проблема?
Заранее спасибо за помощь.