6.828: Operating System Engineering (67)
よくよく見てみるに
(gdb) x/24x $esp 0xfffffc: 0x0010287b 0x00000000 0x00000000 0x00000000
なソレは stack pointer が指してるアドレス
esp 0xfffffc 0xfffffc
に、0x0010287b という値が入っている、と。
で、この番地ですが、kernel.asm によると
char *top = kstack + PGSIZE; asm volatile("movl %0,%%esp" : : "r" (top)); 10286f: 05 00 10 00 00 add $0x1000,%eax 102874: 89 c4 mov %eax,%esp asm volatile("call mainc"); 102876: e8 d5 fe ff ff call 102750 <mainc> panic("jkstack"); 10287b: c7 04 24 a1 68 10 00 movl $0x1068a1,(%esp)
mainc を呼び出した後の戻り番地になっております。
そりゃ良いのですが
Which part of the stack printout is actually the stack? (Hint: not all of it.) Identify all the non-zero values on the stack.
みたいな記述があるのですが、x/24 な出力は先頭以外全部 0x0 だな。結構遡ってみたのですが 0x0 です。というか見てるポイントが違うような気がするなぁ。
例えば、main 手続きで止めた場合はちょっと違う出力。
(gdb) b * 0x1028a0 Breakpoint 1 at 0x1028a0: file main.c, line 16. (gdb) c Continuing. The target architecture is assumed to be i386 => 0x1028a0 <main>: push %ebp Breakpoint 1, main () at main.c:16 16 { (gdb) info reg eax 0x1028a0 1058976 ecx 0x0 0 edx 0x1f0 496 ebx 0x10094 65684 esp 0x7bbc 0x7bbc ebp 0x7bf8 0x7bf8 esi 0x0 0 edi 0x10d824 1103908 eip 0x1028a0 0x1028a0 <main> eflags 0x6 [ PF ] cs 0x8 8 ss 0x10 16 ds 0x10 16 es 0x10 16 fs 0x0 0 gs 0x0 0 (gdb) x/24x $esp 0x7bbc: 0x00007dd0 0x00000000 0x00000000 0x00000000 0x7bcc: 0x00000000 0x00000000 0x00000000 0x00000000 0x7bdc: 0x00010094 0x00000000 0x00000000 0x00000000 0x7bec: 0x00000000 0x00000000 0x00000000 0x00000000 0x7bfc: 0x00007c4d 0x8ec031fa 0x8ec08ed8 0xa864e4d0 0x7c0c: 0xb0fa7502 0xe464e6d1 0x7502a864 0xe6dfb0fa (gdb)
ここでもスタックのてっぺんに bootblock なソレへの戻り番地が格納されてますね。あと、eax は main な手続きの先頭番地だな。
とりあえずソースを見つつ mem.pdf を読みます。