08|重新设置 idt 和 gdt
闪客
你好,我是闪客。
上一讲咱们说到,CPU 进入了 32 位保护模式,最后是跳到了内存地址 0 处开始执行代码。
0 位置处存储着操作系统全部核心代码,是由 head.s 和 main.c 以及后面的无数源代码文件编译并链接在一起而成的 system 模块,如图所示:
今天我们一起看看,正式进入 C 语言写的 main.c 之前,head.s 究竟写了点啥?
重新设置栈
head.s 文件很短,我们一点点看。
你有没有注意到开头有个标号 _pg_dir?这个表示页目录,之后在设置分页机制时,页目录会存放在这里,也会覆盖这里的代码,你这里有个印象就行。
再往下连续五个 mov 操作,分别给 ds、es、fs、gs 这几个段寄存器赋值为 0x10,根据段描述符结构解析,表示这几个段寄存器的值为指向全局描述符表中的第二个段描述符,也就是数据段描述符。
最后 lss 指令相当于让 ss:esp 这个栈顶指针,指向了 _stack_start 这个标号的位置。还记得图里的那个原来的栈顶指针在哪里吧?往上翻一下,0x9FF00,现在要变咯。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文介绍了在操作系统内核代码执行之前,通过重新设置栈和中断描述符表(IDT)以及全局描述符表(GDT)来准备CPU进入32位保护模式。文章首先讲解了在汇编代码中重新设置栈的过程,包括给段寄存器赋值和设置栈顶指针的操作。接着详细解释了设置IDT的过程,包括设置中断描述符表中的中断程序地址。然后介绍了重新设置GDT的过程,展示了新的全局描述符表的结构。最后,文章提到了开启分页机制并跳转到C语言编写的操作系统核心代码的功能。总的来说,本文通过重新设置栈、IDT和GDT,为CPU进入保护模式和执行操作系统核心代码做好了准备。
该试读文章来自《Linux0.11 源码趣读》,如需阅读全部文章,
请先通过赠一得一解锁课程
请先通过赠一得一解锁课程
赠一得一
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(4)
- 最新
- 精选
- 周平总结里的图不是没有重新设置之前的glt和ilt吗?2022-11-09归属地:上海313
- 龍蝦第06讲 讲到设置 idt 和 gdt,但是设置了之后,似乎也没有用到。 这里又重新设置一遍,所以前面的设置是不是多余了?2023-08-16归属地:江苏2
- lm a cat再往下连续五个 mov 操作,分别给 ds、es、fs、gs 这几个段寄存器赋值为 0x10,根据段描述符结构解析,表示这几个段寄存器的值为指向全局描述符表中的第二个段描述符,也就是数据段描述符。 这个是不是根据段选择子的结构啊,16进制10 段描述符索引正好对应22023-02-16归属地:河南2
- Tiffany最后一张图画错了吧,应该指向system里面的head吧2023-02-27归属地:广东
收起评论