exercise 1.9
要求:找出内核初始化内核栈的地方(代码),和内核栈加载到主存的位置。内核是如何为栈保存这个区域的?这个栈指针初始化指向的保存区域的终点是哪里?
解答:
打开路径为lab/obj/kernel.asm的文件,这是内核的反汇编文件,其中的第58行指出了对esp的赋值,
f0100034: bc 00 00 11 f0 mov $0xf0110000,%esp
则内核栈加载到主存0xf0110000的位置。这个逻辑地址的物理地址映像是0x00110000.
查找entry.s,得到如下代码
relocated:
# Clear the frame pointer register (EBP)
# so that once we get into debugging C code,
# stack backtraces will be terminated properly.
movl $0x0,%ebp # nuke frame pointer
# Set the stack pointer
movl $(bootstacktop),%esp
# now to C code
call i386_init
# Should never get here, but in case we do, just spin.
spin: jmp spin
.data
###################################################################
# boot stack
###################################################################
.p2align PGSHIFT # force page alignment
.globl bootstack
bootstack:
.space KSTKSIZE
.globl bootstacktop
bootstacktop:
可以看到line 9也是将栈顶位置赋给esp。下面是栈的声明。分配了一块空间大小KSTKSIZE给从bootstack地址开始的栈,已经知道当前栈顶是0xf0110000,按执行顺序看,是先执行bootstack再执行bootstacktop,则后者高,虽然当前栈为空。则栈是向低地址生长的,栈的最低位置为0xf0110000-KSTKSIZE。
PS:下面是GNU assembler手册,我查了好一会儿才找到,国内网上根本没有.space是个什么意思,全是些无聊的抄来抄去的博客。