Linux0.11第一回最开始的两行代码
从这篇文章开始,你将跟随我进入这个操作系统的梦想之旅! 不用担心,每一章的内容都会很少,不用带着沉重的负担去学习像读小说一样跟我读 话不多说,直奔主题当你按下开机键,主板上预先写好的固件程序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,方便以后的基址寻址这两件事在你脑子里是认可的,没有疑问,方便后面继续 我们身后的世界越来越精彩欲知后事如何,且听下回分解 。郑重声明:此文内容为本网站转载企业宣传资讯,目的在于传播更多信息,与本站立场无关。仅供读者参考,并请自行核实相关内容。 (编辑:安远) |