10|进入 main 函数前的最后一跃!
闪客
你好,我是闪客。
这一讲,我们将欣赏从汇编语言跳转到 C 语言的最后几行代码,并且对整个第一部分做个回顾。
这样就跳跃到了主函数
上一讲我们设置好了 idt、gdt、页表,还开启了保护模式。那么接下来,我们怎么跳到主函数呢?
来看看设置分页代码的那个地方(head.s 里),后面这个操作就是用来跳转到 main.c 的。
直接解释起来非常简单。
push 指令就是压栈,五个 push 指令过去后,栈会变成这个样子。
然后你要注意,setup_paging 最后一个指令是 ret,也就是我们上一讲设置分页的代码里的最后一个指令,形象地说它叫返回指令。不过 CPU 可没有那么聪明,它并不知道该返回到哪里执行,只是很机械地把栈顶的元素值当做返回地址,跳转去那里执行。
我再描述一下具体细节,CPU 会把 esp 寄存器(栈顶地址)所指向的内存处的值,赋值给 eip 寄存器,而 cs:eip 就是 CPU 要执行的下一条指令的地址。而此时栈顶刚好是 main.c 里写的 main 函数的内存地址,是我们刚刚特意压入栈的,所以 CPU 就自然而然跳过来了。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文深入探讨了操作系统从汇编语言跳转到C语言的关键代码,并对第一部分进行了全面回顾。文章首先详细解释了通过汇编代码中的跳转指令实现从设置分页代码跳转到主函数的过程,包括压栈、出栈和CPU执行返回指令的机制。随后展示了C语言主函数的代码,并解释了其中的关键操作,如内存初始化、中断初始化和设备初始化。全文总结了操作系统加载到内存中的过程、内存布局的调整、保护模式与内存管理的设置等内容。通过设置分段和分页机制以及相关寄存器,为进入主函数做了充分的准备。整个第一部分的工作被称为“进入内核前的苦力活”,为操作系统的后续工作奠定了基础。文章以此结束,并展望了后续内容的精彩。
该试读文章来自《Linux0.11 源码趣读》,如需阅读全部文章,
请先通过赠一得一解锁课程
请先通过赠一得一解锁课程
赠一得一
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(20)
- 最新
- 精选
- 极客时间置顶操作系统学完了?还有计算机组成原理、网络协议、算法等计算机基础知识等你继续学...... 84W人都在看的计算机基础学习路径,立即选课试读 >> http://gk.link/a/11WND2023-02-13归属地:北京11
- xueerfei007话说,如果换了arm架构,是不是这些汇编就要另换一套了?
作者回复: 那肯定呀,汇编语言是 ISA 的助记符而已,arm 和 Intel 的 ISA 是不同的必然导致汇编语言不同呀。高版本内核里的 arch 文件夹,就是不同体系结构的代码,不仅仅是汇编语言这点不同,所有体系结构的不同都会加以区分。
2022-11-03归属地:北京4 - Geek_73c432老师最后的总结太棒了,而且有图对理解流程帮助很大。期待后续的课程
作者回复: 谢谢哟
2022-11-13归属地:北京2 - 天择详略得当是最大特色,紧扣操作系统主题,期待后续课程。有计划吗?
作者回复: 有计划,可以看课程介绍的后几部分
2022-11-10归属地:北京1 - asdf有一点想不明白,main函数最后进入死循环后,是不是不会再让出cpu,那么那些fork出的子进程来说,是怎么获得运行的呢,求指教,谢谢。
作者回复: 咋得出的不会再让出 cpu.... 那进程调度哪去了...
2022-11-25归属地:北京2 - 郑童文请问老师是在什么时候,移动了system 的512K的代码 给页目录项和页表腾出从0开始的位置的啊?
作者回复: 不用移动呀,system 本身就包含留出了位置的页目录表和页表
2022-11-12归属地:北京3 - return非常 nice,感谢大佬,期待后续。
编辑回复: 握手~
2022-11-08归属地:北京 - 浩仔是程序员打卡
编辑回复: 恭喜学完第一部分
2022-11-08归属地:北京 - Max从微信跟过来的,支持😁
编辑回复: 谢谢支持
2022-11-07归属地:北京 - 青鸟飞鱼第三,哈哈哈,坐等后续
作者回复: 前三名哈哈
2022-11-03归属地:北京
收起评论