- 论坛徽章:
- 0
|
首先看源代码:
startup_32:
movl $0x10,%eax # 0x10是GDT中数据段选择符。
mov %ax,%ds
lss init_stack,%esp
call setup_idt # 设置IDT。先把256个中断门都填默认处理过程的描述符。
call setup_gdt
这汇编段代码在head.s中,左边部分是编译出的.o二进制代码,如下:
0: b8 10 00 00 00 mov $0x10,%eax
5: 8e d8 mov %eax,%ds
7: 0f b2 25 b0 0a 00 00 lss 0xab0,%esp
e: e8 0f 00 00 00 call 22 <setup_idt>
13: e8 02 00 00 00 call 1a <setup_gdt>
ld 链接之后,去掉头部88字节(为什么不是84字节?)之后,查看相应的 lss 0xab0,%esp二进制代码为如下蓝色部分,
0000050 1000 0000 0000 0000 10b8 0000 8e00 0fd8
0000060 25b2 8b08 0804 0fe8 0000 e800 0002 0000
0000070 feeb 010f c215 0480 c308 158d 80aa 0804
问题是 : ld对head.o 代码做了什么工作
注: 以上是学习kernel 0.11的结果,Makefile 大致如下:
AS86 =as86 -0 -a
LD86 =ld86
AS =as
LD =ld
LDFLAGS =-s -x -M
CC =gcc
CFLAGS =-Wall -O -g -fstrength-reduce -fomit-frame-pointer
CPP =cpp -nostdinc -Iinclude
...
boot/head.o: boot/head.s
boot/head:boot/head.o
$(LD) $(LDFLAGS) boot/head.o -o boot/head
...
非常感谢大家的回答!
[ 本帖最后由 tonutu 于 2008-11-20 21:33 编辑 ] |
|