日期:2014-05-16  浏览次数:20658 次

Head.s问题 谢谢了
C/C++ code

setup_gdt:
lgdt gdt_descr # 加载全局描述符表寄存器(内容已设置好,见232-238 行)。
ret


gdt_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,%ecx
rp_sidt:
movl %eax,(%edi) # 将哑中断门描述符存入表中。
movl %edx,4(%edi)
addl $8,%edi # edi 指向表中下一项。
dec %ecx
jne rp_sidt
lidt 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寄存器吧 ,就给基地址存进去