Linux0.11 源码趣读
闪客
低并发编程公号作者
18650 人已学习
赠一得一
课程目录
已完结/共 22 讲
Linux0.11 源码趣读
15
15
1.0x
00:00/00:00
登录|注册

08|重新设置 idt 和 gdt

你好,我是闪客。
上一讲咱们说到,CPU 进入了 32 位保护模式,最后是跳到了内存地址 0 处开始执行代码。
0 位置处存储着操作系统全部核心代码,是由 head.s 和 main.c 以及后面的无数源代码文件编译并链接在一起而成的 system 模块,如图所示:
今天我们一起看看,正式进入 C 语言写的 main.c 之前,head.s 究竟写了点啥?

重新设置栈

head.s 文件很短,我们一点点看。
_pg_dir:
_startup_32:
mov eax,0x10
mov ds,ax
mov es,ax
mov fs,ax
mov gs,ax
lss esp,_stack_start
你有没有注意到开头有个标号 _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归属地:上海
    3
    13
  • 龍蝦
    第06讲 讲到设置 idt 和 gdt,但是设置了之后,似乎也没有用到。 这里又重新设置一遍,所以前面的设置是不是多余了?
    2023-08-16归属地:江苏
    2
  • lm a cat
    再往下连续五个 mov 操作,分别给 ds、es、fs、gs 这几个段寄存器赋值为 0x10,根据段描述符结构解析,表示这几个段寄存器的值为指向全局描述符表中的第二个段描述符,也就是数据段描述符。 这个是不是根据段选择子的结构啊,16进制10 段描述符索引正好对应2
    2023-02-16归属地:河南
    2
  • Tiffany
    最后一张图画错了吧,应该指向system里面的head吧
    2023-02-27归属地:广东
收起评论
显示
设置
留言
4
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部