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

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/11WND
    2023-02-13归属地:北京
    1
  • 果果
    所有的这些知识要区分32位系统还是64位吗,64位系统也是加载到0x7c00吗

    作者回复: 不区分的,注意,加载到 0x7c00 这个地方 CPU 还处于 16 位的实模式下,切换到 32 位和 64 位是后面的事情,所以老祖宗的位置他们都得兼容。

    2022-11-02归属地:北京
    2
    20
  • 志豪
    内存地址为何是0x7c00,可以参考这篇文章 http://www.ruanyifeng.com/blog/2015/09/0x7c00.html

    作者回复: 赞!物有本末,事有终始。

    2022-11-02归属地:北京
    3
    17
  • 志豪
    大学很讨厌的汇编、计算机原理,现在反而很有兴趣去学习了

    作者回复: 哇,有这个作用,才是最棒的!

    2022-11-02归属地:北京
    2
    5
  • wong ka seng
    请问执行以下代码前,ds 寄存器的值是不是0? mov ax,0x07c0 mov ds,ax

    作者回复: 给你留个作业,去 Intel 手册里找到 CPU 初始化的章节,也就是刚刚开机启动时的状态,在那里找到这个寄存器的初始值是多少,这是手册的规定,并不是我说了算,也不是谁猜或者分析出来的,更不需要去百度。同时,执行这行代码前,ds 寄存器的值是几都无所谓。

    2022-11-02归属地:北京
    4
    3
  • xpxdx
    讲稿和代码好像写错了。写成了0x07c0。应该是0x7c00?

    编辑回复: 和老师确认了一下:没写错,段基地址需要左移四位哦,你再看看~

    2022-11-07归属地:北京
    3
    1
  • 无笔秀才
    开机后 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
  • good
    bootsect.s就这两行代码吗?它和 512字节是啥关系?

    作者回复: ...

    2022-11-09归属地:北京
    4
收起评论
显示
设置
留言
19
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部