linux0.11第一回最开始的两行代码-尊龙凯时官方网站

linux0.11第一回最开始的两行代码-尊龙凯时官方网站

中国新闻联播
来源:it之家   发布时间:2022-09-29 16:31

从这篇文章开始,你将跟随我进入这个操作系统的梦想之旅!

不用担心,每一章的内容都会很少,不用带着沉重的负担去学习像读小说一样跟我读

话不多说,直奔主题当你按下开机键,主板上预先写好的固件程序bios会将硬盘引导区的512字节数据原封不动的复制到内存中的0x7c00,跳转到那个位置执行

引导区的定义非常简单只要硬盘中0盘0通道1扇区512字节的后两个字节分别是0x55和0xaa,bios就会认为是引导区

所以对于我们理解操作系统来说,此时的bios只是一个代码搬运工,将512字节的二进制数据从硬盘运送到内存中所以作为操作系统的开发者,只需要将操作系统的初始代码编译存储在硬盘的磁盘0,通道0,扇区1即可之后,bios会帮我们把它放在内存里,跳过去执行

linux—0.11的初始代码就是这个用汇编语言写的bootsect.s,位于boot文件夹下。

通过编译,这个bootsect.s会被编译成二进制文件,存储在引导区的第一个扇区。

然后就像刚才说的,会从bios移到内存0x7c00,cpu从这个位置开始,继续无脑的执行一条又一条语句。

那么我们的梦想之旅就从这个文件的第一行代码开始吧!

movax,0x07c0movds,ax

好了,先看两行。

这段代码是用汇编语言编写的,这意味着将值0x07c0复制到ax寄存器中,然后将ax寄存器中的值复制到ds寄存器中实际上,所有这些折腾的结果是,这个寄存器ds中的值变成了0x07c0

ds是一个16位段寄存器,它专门代表数据段寄存器,并在寻址存储器时充当段基址你什么意思

movax,

实际上相当于

movax,

默认添加ds,这意味着在ds的这一段的基址,未来偏移0x0001个单位,并将该位置的存储器数据复制到ax寄存器中。

打个比喻,你跟朋友商量一下去哪里玩比较好你说天安门广场,南锣鼓巷,颐和园等等都是偏置地址,省略了北京的基址

当然,你可以说北京的天安门广场和北京的南锣鼓巷,每次都加上前缀北京但是,如果你提前和朋友约定好,我下面说的地方都是北京的,那你就不用每次都背北京二字了方便吗

这是数据段寄存器ds的功能描述一个内存地址很方便,可以省略一个基址这没什么神奇的

ds : 0x0001

北京:南锣鼓巷

看,这个ds是赋给0x07c0的由于x86要在16位实模式下访问20位地址线的历史因素,段基址必须先左移4位然后0x07c0左移四位为0x7c00,与bios加载此代码的存储器地址0x7c00完全相同

也就是说后面写的代码和里面访问的数据的内存地址都默认加0x7c00,然后在内存中寻址。

为什么统一加数字0x7c00这很容易解释bios规定,当操作系统代码加载到内存0x7c00时,里面的各种数据自然会偏移这么多因此,将数据段寄存器ds设置为该值便于将来通过该基地址访问存储器中的数据

好了,快速消化前面的知识,那么这篇文章就结束了,只有两行代码,小知识,我不骗你。

我希望你能做到可以通过bios将操作系统代码加载到内存0x7c00中,我们可以通过mov指令将默认数据段寄存器ds寄存器的值改为0x 07c 00,方便以后的基址寻址这两件事在你脑子里是认可的,没有疑问,方便后面继续

我们身后的世界越来越精彩欲知后事如何,且听下回分解

0
网友吐槽

推荐阅读

图文推荐

尊龙凯时国际的友情链接

财经科技教育健康房产汽车旅游娱乐时尚图片

尊龙凯时国际 copyright © 2002-2021中国新闻联播尊龙凯时国际的版权所有 网站地图

本站部分资源来源于网络,尊龙凯时国际的版权归原作者或者来源机构所有,如作者或来源机构不同意本站转载采用,请通知我们,我们将第一时间删除内容。本站刊载文章出于传递更多信息之目的,所刊文章观点仅代表作者本人观点,并不意味着本站赞同作者观点或证实其描述,其原创性及对文章内容的真实性、完整性、及时性本站亦不作任何保证或承诺,请读者仅作参考。