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