2015-07-02 2 views
0

После того, как ядро ​​Linux остыло на платформе ARM, регистры сбрасываются на консоль. Но я смутился с анализом этих регистров.Как понять регистры ARM, сбрасываемые паникой ядра?

Например,

Unable to handle kernel paging request at virtual address 0b56e8b8 
pgd = c0004000 
[0b56e8b8] *pgd=00000000 
Internal error: Oops: 5 [#1] PREEMPT SMP ARM 
    ...... 
pc : [<bf65e7c0>] lr : [<bf65ec14>] psr: 20000113 
sp : c07059f0 ip : 00008d4c fp : c0705a3c 
r10: 00000003 r9 : e8bcd800 r8 : e88b006c 
r7 : 0000e203 r6 : c0705a44 r5 : e88b0000 r4 : 0b56e8b8 
r3 : 00000000 r2 : 00000b56 r1 : e4592e10 r0 : e889570c 
Flags: nzCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment kernel 
Control: 10c5787d Table: 69fec06a DAC: 00000015 

SP: 0xc0705970: 
5970 e8e70000 e45de100 00000181 00000180 c070599c bf65e7c0 20000113 ffffffff 
5990 c07059dc e88b006c c0705a3c c07059a8 c000e318 c0008360 e889570c e4592e10 
59b0 00000b56 00000000 0b56e8b8 e88b0000 c0705a44 0000e203 e88b006c e8bcd800 
59d0 00000003 c0705a3c 00008d4c c07059f0 bf65ec14 bf65e7c0 20000113 ffffffff 
59f0 e8b80000 e2030b56 00000000 e889570c 00000003 e88b006c c007eccc c007ebb4 
5a10 00000000 eacc0480 e88b0000 00002098 e9c80480 e8c08000 00000000 e8bcdc80 
5a30 c0705a5c c0705a40 bf65ec14 bf65e6c0 bf5e51c4 00000000 e88b0000 00000000 
5a50 c0705a74 c0705a60 bf65ecfc bf65ebe4 e4554500 e4554500 c0705a84 c0705a78 

R5: 0xe88aff80: 
ff80 bf10f0b0 e8aca4c0 e88aff8c e88b1680 00000000 bf05b70c e87c3580 00000000 
ffa0 bf095024 e87c3580 00000000 bf095024 e87c3580 00000000 bf095024 00000001 
ffc0 00000004 ebd83000 00000793 e8cc2500 00000002 00000004 00000043 ffffffff 
ffe0 40320354 be9ee8d8 00030444 40320380 20000010 00000000 70cfe821 70cfec21 
0000 bf81e1f8 e88b0018 e88b000c e88e9a00 00000000 bf095024 00000000 fffffffe 
0020 00000000 00000000 fffffffe 00000000 00000000 fffffffe 00000000 00000000 
0040 00000001 e91dd000 00001073 0010051b 00080000 f1e4d900 00000001 00000002 
0060 000000c8 6df9eca0 00008044 e8895700 00000040 00000026 00000003 0b56e8b8 

R8: 0xe88affec: 
ffec 40320380 20000010 00000000 70cfe821 70cfec21 bf81e1f8 e88b0018 e88b000c 
000c e88e9a00 00000000 bf095024 00000000 fffffffe 00000000 00000000 fffffffe 
002c 00000000 00000000 fffffffe 00000000 00000000 00000001 e91dd000 00001073 
004c 0010051b 00060000 f1e4d900 00000001 00000002 000000c8 6df9eca0 00008044 
006c e8895700 00000040 00000026 00000003 0b56e8b8 e4604000 0000026c 000000da 
008c 00000000 21d7ff6e 000078a9 bf05add4 e88b0000 e88b0000 ebd02600 f1015a05 
00ac 00000001 000000a6 000000c4 00000000 e88b0000 1e1e1e1e 1e1e1e1e 1e1e1e1e 
00cc 1e1e1e1e 1e1e1e1e 1e1e1e1e 1e1e1e1e 1e1e1e1e 1e1e1e1e 1e1e1e1e 1e1e1e1e 

Вопросы:

  1. , что делает 0xc0705970 стенды для в SP: 0xc0705970:? Адрес кода или адрес данных? Где его найти?

  2. Почему sp : c07059f0 не в начале или конце SP? Как стеки организованы в этом регистре?

  3. Что означает первый столбец каждого регистра? Если они выступают за относительный адрес, почему они не являются непрерывными?

  4. Есть 0b56e8b8 указатель, указывающий на страницу? Как к нему можно обратиться в R5 и R8?

+0

SP - указатели стека. Таким образом, он указывает на верхнюю часть стека вызовов функций. Для текущей инструкции, которая выполняется, вам нужен счетчик программ, ПК. –

ответ

1

Как регистры используются в ОС что-то до ABI, a.k.a Application Binary Interface.

Однако мы можем дать быстрое, неформальной и упрощенного объяснения отвала.

Я не эксперт по Linux на ARM, но некоторые названия кажутся вполне интуитивно:

  • зр является указатель стека. Указатель на полезную область памяти, называемую стеком.
  • fp является Указатель рамки. Указатель, используемый программой для доступа к локальным варам.
  • lr является Ссылка Зарегистрироваться. Регистр, содержащий адрес возврата вызова.
  • nzCv - это флаги, если флаг находится в верхнем регистре, он установлен, в противном случае - ясный.
    • п = Последний результат был отрицательный
    • г = Последний результат был нулевой
    • С = Последним результата необходим/произвел битый перенос
    • v = Последний результат разливался
  • IRQ on. Разрешены аппаратные прерывания.
  • FIRQ означает, что некоторые аппаратные прерывания обрабатываются с помощью быстрого переключателя контекста.
  • Режим - это режим CPU, указывающий, что код был привилегирован.
  • Следующая информация - это структуры управления для ЦП, установленные ядром.

Свалка сделать вам одолжение, принимая во внимание значения регистра sp, r5 и r8 как указатели и показывая память при этом обращается.
Блок ниже SP: 0xc0705970:, например, является дампом памяти на 0xc0705970. Каждая строка отформатирована следующим образом:

  • Первый столбец - текущий адрес. Только последние четыре цифры показаны, так как это очевидно, что полный адрес (т.е. нет двусмысленности, адреса начинаются с 0xc0705970).

  • Следующие восемь столбцов представляют собой 32-разрядные значения, выгруженные из памяти. Каждая строка показывает вам 32 байт памяти.

Например, глядя на

R5: 0xe88aff80: 
ff80 bf10f0b0 e8aca4c0 e88aff8c e88b1680 00000000 bf05b70c e87c3580 00000000 
ffa0 bf095024 e87c3580 00000000 bf095024 e87c3580 00000000 bf095024 00000001 
ffc0 00000004 ebd83000 00000793 e8cc2500 00000002 00000004 00000043 ffffffff 
ffe0 40320354 be9ee8d8 00030444 40320380 20000010 00000000 70cfe821 70cfec21 
0000 bf81e1f8 e88b0018 e88b000c e88e9a00 00000000 bf095024 00000000 fffffffe 
0020 00000000 00000000 fffffffe 00000000 00000000 fffffffe 00000000 00000000 
0040 00000001 e91dd000 00001073 0010051b 00080000 f1e4d900 00000001 00000002 
0060 000000c8 6df9eca0 00008044 e8895700 00000040 00000026 00000003 0b56e8b8 

Вы можете сказать, что 32 битное значение r5 указывал было 0xbf10f0b0 или что 32 битное значение в 0xe88a0000 было 0xbf81e1f8 или что значение бита 32 в 0xe88a0028 был 0xfffffffe.

Вся эта информация полезна для разработчика кода, который запаниковал.

Смежные вопросы