读书人

Head.s有关问题 多谢了

发布时间: 2012-06-23 14:52:43 作者: rapoo

Head.s问题 谢谢了

C/C++ code
setup_gdt:lgdt gdt_descr # 加载全局描述符表寄存器(内容已设置好,见232-238 行)。retgdt_descr: # 下面两行是lgdt 指令的6 字节操作数:长度,基址。.word 256*8-1 # so does gdt (not that that's any.long _gdt # magic number, but it works for me :^)# 全局表。前4 项分别是空项(不用)、代码段描述符、数据段描述符、系统段描述符,其中# 系统段描述符linux 没有派用处。后面还预留了252 项的空间,用于放置所创建任务的# 局部描述符(LDT)和对应的任务状态段TSS 的描述符。# (0-nul, 1-cs, 2-ds, 3-sys, 4-TSS0, 5-LDT0, 6-TSS1, 7-LDT1, 8-TSS2 etc...)_gdt: .quad 0x0000000000000000 /* NULL descriptor */.quad 0x00c09a0000000fff /* 16Mb */ # 代码段最大长度16M。.quad 0x00c0920000000fff /* 16Mb */ # 数据段最大长度16M。.quad 0x0000000000000000 /* TEMPORARY - don't use */.fill 252,8,0 /* space for LDT's and TSS's etc */

上面是我看的 带中文注释的Linux 0.11 源代码 head.s文件 我想问的是 这面这个命令是怎么加载_gdt:里面的数据到内存的呢 的相应位置呢,也就是 怎么初始化 全局描述符表呢 没看明白 这点 “内容已设置好,见232-238 行” 有点不明白 那位帮忙看看 谢谢了 !!


C/C++ code
lea _idt,%edi # _idt 是中断描述符表的地址。mov $256,%ecxrp_sidt:movl %eax,(%edi) # 将哑中断门描述符存入表中。movl %edx,4(%edi)addl $8,%edi # edi 指向表中下一项。dec %ecxjne rp_sidtlidt idt_descr # 加载中断描述符表寄存器值。ret

这个设置中断的 我还知道一点 就是 把 _idt标号的数据 用 movl写的相应的内存单元里去

[解决办法]
_gdt:里面的数据,存放在head.s 编译后的文件里面,
在linux引导启动的过程中,将head.s 加载到内存,具体位置,仔细看看,启动过程就可以明白大概位置。

_gdt表的内容就是:(在代码中已经初始化...)
_gdt: .quad 0x0000000000000000 /* NULL descriptor */
.quad 0x00c09a0000000fff /* 16Mb */ # 代码段最大长度16M。
.quad 0x00c0920000000fff /* 16Mb */ # 数据段最大长度16M。
.quad 0x0000000000000000 /* TEMPORARY - don't use */
.fill 252,8,0 /* space for LDT's and TSS's etc */

[解决办法]
cpu有个gdt寄存器吧 ,就给基地址存进去

读书人网 >UNIXLINUX

热点推荐