操作系统编写详解

这篇博客详细介绍了操作系统的引导过程,从BIOS加载MBR到进入保护模式的转变。作者通过讲解GDT(全局描述符表)的作用,阐述了如何在64位环境下进行段描述符的管理和切换,最后演示了如何编写一个简单的引导记录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近阅读了一大堆介绍操作系统的书,终于也小有所成,感觉写操作系统是件很简单的事

写操作系统,就不得不从引导开始

电脑在按下开关之后经过一连串的Reset...CPU就会运行BIOS(这个就不多说了),在POST(加电自检,Power On Self Test)后,BIOS就会按CMOS里的引导设备顺序为序(eg:硬盘,软盘,USB Device,LAN...)开始读每个设备的引导扇区(0面0磁道1扇区,简单来说就是第一扇区),假如找到一个以(0x)55 AA结尾,且大小为512B(字节)的执行码,就会将它当成MBR(Master Boot Record,主引导记录)加载到内存的0000:7c00处,并跳转到0000:7c00处开始执行,最后将控制权交给它,这时候操作系统将开始运行

所以一般的操作系统一般都会有Boot.s||Boot.asm一个汇编码文件(Linux为Boot.s,GAS(GNU Assembler,GNU汇编器)编译)这就是MBR,一般来说会编译成Bin(Binary,二进制文件),也有编译成Com(Command,区别于www.XXXX.com,事实上后者是HTML)的

由于是加载到0000:7c00,所以Boot.asm第一句一般为

ORG 7c00h

ORG 0x7c00

(h和0x都表示16进制)它告诉编译器加载到7c00处

过来

       Mov ax,cs
       Mov ds,ax

初始一下

过来就要进入保护模式了(现如今的操作系统都用保护模式了,这应该是启动时完成的第一个工作,为了增强性能,详情自行Google)

首先是GDT(全局描述符表,Global Descriptor Table)

GDT的作用是因为段模式使用Segment:Offset(段基址:偏移值)的方式时,由于只占16bit,而Intel的段寄存器因为向后兼容,也为16bit,所以刚好放下;但到了PMode(Protect Mode,保护模式)下,由于段描述变为了[Base Address,limit,access],它们加起来为64bit,段寄存器就放不下了,所以将这些段描述符塞进一个数组,段寄存器的值就变为所寻段描述符的下标,这样间接寻址

(打个比方就是规定了你只能用一个 BX:byte来获取所需变量值,但都是integer变量,byte装不下integer,所以另开一数组GDT:array  [1..n] of integer;来储存每一个变量的值,BX存储下标,获取值时以GDT[BX]取值)

这里只讲GDT,你也可以看看LDT

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值