MIT 6.828 Lab1 exercise9

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是个什么意思,全是些无聊的抄来抄去的博客。

GNU assembler

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值