01|开机后最开始的两行代码是什么?
闪客
你好,我是闪客。
从这一讲开始,我将带你一起进入操作系统的梦幻之旅!
一提起操作系统,是不是感觉很硬核?不过你别担心,每一讲的内容都很精练,而且你也不要带着很大的负担去学习,只需要像读小说一样,跟着我一讲一讲地看下去就好。
这一讲我们要讨论的问题是,开机后执行的第一行操作系统代码是什么?在这行代码之前又发生了什么?看完这一讲,你就知道答案了。
当你按下开机键的那一刻,在主板上提前写死的固件程序 BIOS 会将硬盘中启动区的 512 字节的数据,原封不动复制到内存中的 0x7c00 位置处,并跳转到这里运行。
如果你能理解我上面说的话,那么恭喜你,接下来你只需要跟着代码一点点往后推导和品味,就会慢慢建立起整个操作系统的大厦。
但如果上面的这个过程你很困惑,那可能会在这卡一阵子。不过没关系,很多人都会卡在这个原本很简单的问题上,然后就从入坑到放弃了,我曾经也在这卡了很久。
接下来,我们一步一步地梳理。
开机后初始化指向 BIOS
首先,CPU 中有个 PC 寄存器,这里面存储着将要执行的指令在内存中的地址。当我们按下开机键后,CPU 就会有个初始化 PC 寄存器的过程,然后 CPU 就按照 PC 寄存器中的数值,去内存中对应的地址处寻找这条指令,然后进行执行。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
开机后最开始的两行代码是什么?这篇文章从开机后执行的第一行操作系统代码开始,详细介绍了BIOS将硬盘中启动区的数据加载到内存中的过程。文章首先解释了CPU中PC寄存器的初始化过程,然后介绍了BIOS将操作系统代码加载到内存0x7c00位置的步骤。接着,文章解释了启动区的定义和作用,以及BIOS将操作系统代码加载到内存并跳转执行的过程。最后,文章分析了汇编语言中的两行代码的含义,以及数据段寄存器ds的作用和赋值原因。总的来说,文章通过简洁的语言和清晰的逻辑,帮助读者快速了解了开机后最开始的两行代码的含义和执行过程。
该试读文章来自《Linux0.11 源码趣读》,如需阅读全部文章,
请先通过赠一得一解锁课程
请先通过赠一得一解锁课程
赠一得一
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(19)
- 最新
- 精选
- 极客时间置顶不仅是操作系统,还可以看看 84W 程序员都在看的计算机基础学习路径,选课试读 >> http://gk.link/a/11WND2023-02-13归属地:北京1
- 果果所有的这些知识要区分32位系统还是64位吗,64位系统也是加载到0x7c00吗
作者回复: 不区分的,注意,加载到 0x7c00 这个地方 CPU 还处于 16 位的实模式下,切换到 32 位和 64 位是后面的事情,所以老祖宗的位置他们都得兼容。
2022-11-02归属地:北京220 - 志豪内存地址为何是0x7c00,可以参考这篇文章 http://www.ruanyifeng.com/blog/2015/09/0x7c00.html
作者回复: 赞!物有本末,事有终始。
2022-11-02归属地:北京317 - 志豪大学很讨厌的汇编、计算机原理,现在反而很有兴趣去学习了
作者回复: 哇,有这个作用,才是最棒的!
2022-11-02归属地:北京25 - wong ka seng请问执行以下代码前,ds 寄存器的值是不是0? mov ax,0x07c0 mov ds,ax
作者回复: 给你留个作业,去 Intel 手册里找到 CPU 初始化的章节,也就是刚刚开机启动时的状态,在那里找到这个寄存器的初始值是多少,这是手册的规定,并不是我说了算,也不是谁猜或者分析出来的,更不需要去百度。同时,执行这行代码前,ds 寄存器的值是几都无所谓。
2022-11-02归属地:北京43 - xpxdx讲稿和代码好像写错了。写成了0x07c0。应该是0x7c00?
编辑回复: 和老师确认了一下:没写错,段基地址需要左移四位哦,你再看看~
2022-11-07归属地:北京31 - 无笔秀才开机后 PC 寄存器要初始化为 0xFFFF0,也就是从这个内存地址开始,执行 CPU 的第一条指令。 老师这句话是指 我们装系统的时候 会把操作系统的代码放到这里吗?
作者回复: 装系统是装在硬盘里,启动系统时才会被 bios 程序加载到内存
2023-02-16归属地:北京 - 无笔秀才老师,这句话最后的那个“个”字,让我感觉不止有一个启动区?是这样的吗?我之前理解启动区就只有一个呢。 启动区的定义非常简单,只要硬盘中的 0 盘 0 道 1 扇区(第一扇区)的 512 个字节的最后两个字节分别是 0x55 和 0xaa,那么 BIOS 就会认为它是个启动区。
作者回复: 可能个字去掉更合适,一个磁盘只有一个启动区
2023-02-16归属地:北京3 - Slience-0°C有没有Linux 0.11版本的源代码
作者回复: 搜下 oldlinux
2023-02-15归属地:山东2 - goodbootsect.s就这两行代码吗?它和 512字节是啥关系?
作者回复: ...
2022-11-09归属地:北京4
收起评论