linux011版本 head.s首条语句
本帖最后由 qiuhonglie 于 2015-01-05 16:51 编辑head.s源码中的首条语句:
movl $0x10,%eax
疑问:此时的段描述符放在哪里呢? 呵呵,问题没描述清楚~ 回复 2# humjb_1983
movl $0x10,%eax
mov %ax,%ds
mov %ax,%es
mov %ax,%fs
mov %ax,%gs
如下解释:
;// 再次注意!!! 这里已经处于32 位运行模式,因此这里的$0x10 并不是把地址0x10 装入各
;// 个段寄存器,它现在其实是全局段描述符表中的偏移值,或者更正确地说是一个描述符表
;// 项的选择符。有关选择符的说明请参见setup.s 中的说明。这里$0x10 的含义是请求特权
;// 级0(位0-1=0)、选择全局描述符表(位2=0)、选择表中第2 项(位3-15=2)。它正好指向表中
;// 的数据段描述符项。(描述符的具体数值参见前面setup.s )。下面代码的含义是:
;// 置ds,es,fs,gs 中的选择符为setup.s 中构造的数据段(全局段描述符表的第2 项)=0x10,
;// 并将堆栈放置在数据段中的_stack_start 数组内,然后使用新的中断描述符表和全局段
;// 描述表.新的全局段描述表中初始内容与setup.s 中的完全一样。
疑问:
%ds:段基址寄存器,此时值为0x10。
很难理解为什么上面5句语句之后就指向了全局描述符表的数据段描述符项?
qiuhonglie 发表于 2015-01-10 17:34 static/image/common/back.gif
回复 2# humjb_1983
movl $0x10,%eax
呵呵,上面不是有注释么?
段寄存器中存放的是段选择符,用于在全局(或局部)描述符表中索引相应的段描述符~
页:
[1]