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

02|从 0x7c00 到 0x90000

你好,我是闪客。
你可能会问,这一讲操作系统是不是就该做一些更高深的事情了?想多了,完全没有,等你读完这一讲后,你就知道了。
上一讲,我们讲了 CPU 执行操作系统的最开始的两行代码:
mov ax,0x07c0
mov ds,ax
这两行代码将数据段寄存器 ds 的值变成了 0x07c0,方便之后访问内存时,利用这个段基址进行寻址。
接下来我们带着这两行代码,继续往下看 6 行,代码如下:
mov ax,0x9000
mov es,ax
mov cx,#256
sub si,si
sub di,di
rep movw
此时,ds 寄存器的值已经是 0x07c0 了,然后又通过同样的方式将 es 寄存器的值变成 0x9000,接着又把 cx 寄存器的值变成 256(代码里确实是用十进制表示的,与其他地方有些不一致,不过不影响)。
现在 dsescx 寄存器的值就都被赋上了确定的值了,我们先接着往下看。
再往下看有两个 sub 指令:
sub si,si
sub di,di
这个 sub 指令很简单,比如:
sub a,b
表示的意思是:
a = a - b
那么这行代码:
sub si,si
就表示:
si = si - si
也就是说,如果 sub 后面的两个寄存器一模一样,就相当于把这个寄存器里的值清零,这是一个基本玩法。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

文章标题为《从 0x7c00 到 0x90000 你好,我是闪客》,文章内容主要讲述了操作系统启动过程中的一些关键代码和指令。文章首先介绍了CPU执行操作系统最开始的两行代码,然后详细解释了接下来的指令和寄存器赋值过程。通过对代码和指令的解析,读者可以了解到操作系统启动过程中的内存地址变化和跳转指令的执行。文章以简洁的语言和图文并茂的方式,帮助读者快速了解操作系统启动过程中的关键步骤和技术特点。通过对文章内容的总结,读者可以快速了解操作系统启动过程中的关键代码和指令执行过程,为进一步深入学习操作系统提供了基础知识。

该试读文章来自《Linux0.11 源码趣读》,如需阅读全部文章,
请先通过赠一得一解锁课程
赠一得一
登录 后留言

全部留言(14)

  • 最新
  • 精选
  • xueerfei007
    弱弱的问下,给es寄存器赋值的时候为什么不直接赋值,非要从ax寄存器中转一下

    作者回复: 很简单,Intel 手册上没有直接赋值的指令,如果你设计一款 CPU,可以帮忙加上这个功能

    2022-11-03归属地:北京
    3
    13
  • NULL
    为什么bios不直接拷贝到地址90000处

    作者回复: 你可以设计一个拷贝到这里的 bios,更合理,但晚了,历史背景罢了。看有网友分享这段历史背景,可以参考下:http://www.ruanyifeng.com/blog/2015/09/0x7c00.html

    2022-11-02归属地:北京
    11
  • Geek_73c432
    请教老师,这里的 go 跟 C 语言的 goto 是一回事吗?

    作者回复: 不是... 这就是个标签...

    2022-11-10归属地:北京
    2
  • JeFFery..
    《cpu中的关键寄存器》一图中,es附加段的值为什么是已经左移4位后的结果?而ds的值是左移前的结果?求解答~

    作者回复: 图错了,已更正

    2023-02-17归属地:浙江
    1
  • 西格玛
    课程很nice,什么时候出续集?

    作者回复: 规划中,很快了

    2022-11-11归属地:北京
    1
  • 柒城
    从 ds:si 处复制到 es:di 处是怎么确定的?那条命令为啥能关联到这两个寄存器?

    作者回复: 阅读 Intel 手册关于这个指令的介绍,规定罢了。

    2022-11-03归属地:北京
    4
    1
  • Geek_2d276a
    bootsect.s中的汇编语法是AT&T还是Intel?,对比看了下,好象都不是呀。哪位同学给说明下。

    作者回复: 当时的 as86 语法,已过时,更接近于 Intel 吧,可以当作 Intel 来看

    2023-02-18归属地:北京
  • 杨立剑
    老师讲的真好

    编辑回复: 感谢肯定~后面内容更精彩哦,学习加油

    2022-11-08归属地:北京
  • weihebuken
    jmpi go,0x9000 go: mov ax,cs mov ds,ax 这段代码会不会把原先拷贝到0x90000 这个位置的bios代码中的部分给覆盖了?

    作者回复: Linux 0.11 最开始的代码会有各种覆盖,但一定是没用了才会覆盖,就本着这个原则看即可,要是覆盖了有用的那就是 bug

    2022-11-07归属地:北京
  • 艾恩凝
    start: mov ax,#BOOTSEG mov ds,ax mov ax,#INITSEG mov es,ax mov cx,#256 sub si,si sub di,di rep movw jmpi go,INITSEG 把这几行简单的代码用这么多文字讲解,真的是好人,哈哈哈哈
    2022-11-09归属地:辽宁
    8
收起评论
显示
设置
留言
14
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部