上篇文章为了吸引读者(其实也没吸引几个人),先介绍了怎么让自己的系统镜像跑起来

VictorYXL:30天自制操作系统-初版镜像和启动​zhuanlan.zhihu.com

这篇回归正题,介绍这个镜像的实现。

系统引导扇区

一个操作系统,想要被BIOS找到,依靠的就是引导扇区。所以操作系统的第一步就是实现引导扇区,上一篇的镜像其实就是一个引导扇区+空的系统,这篇的重点就是怎么实现引导扇区。

关于汇编语言,书中用的工具是作者自己写的nask工具,我这里还是用通用的nasm给大家介绍。实现引导的code在这里,是我第一版代码的整理,以后的代码也都放在这里。

VictorYXL/MyOSRefine​github.com

2.13.03下测试可以运行,和作者代码差距不大,整个代码包含四段,前三段是512个字节的引导扇区,最后是引导扇区以外的内容。

引导扇区的实现

第一段指明程序加载的位置。

    ORG     0x7c00

ORG命令指明将整个程序加载到内存的0x7c00处,0x7c00是人为规定的地址,不能更改。

第二段标准FAT12格式软盘的结构

为了方便大家理解,我加了一些中文注释

; Format of floppy disk in fat12JMP     entry           ; JMP跳转指令,跳转到目标内存地址; 注意1 这列的跳转指的是计算机执行时候的跳转,而不是汇编的时候跳转; 注意2 entry表示entry代码段在内存中的起始位置DB      0x90            ; DB,DD和DW分别是向镜像中写单字节,双字节和四字节DB      "MyOS IPL"      ; 写入启动区名字,必须是8字节DW      512             ; 启动扇区大小512字节DB      1               ; 1个簇大小是1个扇区DW      1               ; FAT从第一个扇区启动DB      2               ; FAT个数为2个DW      224             ; 根目录大小224DW      2880            ; 磁盘包含2880个扇区DB      0xf0            ; 磁盘种类必须为0xf0DW      9               ; FAT长度为9扇区DW      18              ; 1个磁道18个扇区DW      2               ; 2个磁头DD      0               ; 不使用分区DD      2880            ; 同上,磁盘大小DB      0, 0, 0x29      ; 无意义,固定这么写DD      0xffffffff      ; 无意义,固定这么写DB      "MyOS       "   ; 磁盘名,11字节DB      "FAT12   "      ; 磁盘格式名,8字节RESB    18              ; 空18个字节,填充0x00

这里的代码基本都是写死的,如果对磁头磁道扇区这些概念不熟悉,后面在读写磁盘的时候也会讲到,其他的细节都是基于fat12格式软盘的信息,不必细究。

第三段是核心代码,调用中断显示Hello, world

初始化寄存器

这里先简单介绍下寄存器,对此比较了解的同学可以跳过。寄存器是CPU里的存储电路,存储CPU需要处理的数据和处理的结果,这里使用的是16位寄存器,主要的是以下几个(图来自书本)。

基础寄存器
段寄存器

其中基础寄存器的前四种可以拆分为高位和低位单独处理,如AX包含AL(低位)和AH(高位)。在32位电脑中用EAX、ECX等表示32为寄存器,我们这里使用16位寄存器就够了,对各个寄存器作用这里只做简单介绍,更多细节不清楚的同学自己百度下吧。

; Boot kernel
entry:; Init registerMOV     AX, 0MOV     SS, AXMOV     SP, 0x7c00MOV     DS, AXMOV     ES, AXMOV     SI, msg

SS:SP是指向栈顶的单元,这里通过AX赋值成0:0x7c00,指向我们这段代码本身,并且初始化DS和ES为0,最后把msg的地址赋给SI,和entry一样,msg也是代码段的起始位置,。

接下来进入循环打印的阶段

; Loop: print string with interrupt
print:MOV     AL, [SI]ADD     SI, 1CMP     AL, 0JE      endMOV     AH, 0x0eMOV     BX, 15INT     0x10JMP     print

这里的核心就是打印SI的内容,[SI]表示SI内存中的值,理解成C语言的指针,SI和[SI]的关系大概就是就是p和*p的关系。把SI指向的字符赋给AX的低位,SI自身再向后移动一位,接下来是判断,CMP和JE实现,如果CMP的两个值相同则跳转到JE的内容,这里就是判断如果读到了0字符则进入end。后面是调用0x10中断显示字符,调用的格式如下:

0x10中断

中断结束再跳回到开头继续打印。

打印结束

; Wait
end:HLTJMP     end

这段是打印结束的等待,HLT是操作系统交出CPU控制权等待外部信号,我们这里不做任何处理,表示程序结束。

打印内容

; msg
msg:DB      0x0a, 0x0a, 0x0aDB      "Hello,world!"DB      0x0aDB      0

这段很好理解, 0x0a是换行,中间是要打印的字符串,最后的0是结束标志,对应前面循环打印的结束。

引导扇区结尾

; Boot endTIMES   510 - ($ - $$) DB 0DB      0x55, 0xaa

引导区最后一段是引导扇区结束,引导扇区结束一定要以0x55, 0xaa结束,所以前面补充在510字节前补充0。TIMES的重复执行,格式是TIMES 循环次数 执行内容,$ 和 $$分别表示当前地址和段首地址,所以就是到当前职位到510字节前全部写0,最后写上0x55, 0xaa两个字节结束。

第四段是引导扇区意外的内容

; Output outside booting sectionDB      0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00RESB    4600DB      0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00RESB    1468432

满足2880*512个字节就好,内容不重要,反正也不会被执行。

执行汇编

最后用nasm将这段汇编翻译成机器码。

nasm IPL.nsm -o MyOS.img

如果对汇编不是很熟悉,在写这段汇编的时候,一定要想明白自己是在填充镜像的内容,还是在模拟镜像的运行,否则很容易陷入结构上的混乱,是在不行就多写几次。

写的比较随意,如有疏漏欢迎指正。

TIMES 0x510 - ($ - $$) DB 0

处有失误,应该是

TIMES 510 - ($ - $$) DB 0

感谢 @qiujian2008 的指正。

30天自制操作系统 pdf_30天自制操作系统-汇编实现初版镜像相关推荐

  1. 30天自制操作系统 pdf_30天自制操作系统:第三天:系统引导完成

    对第二天代码进行了修改,只打印hello ,uos没一点意思. 读取磁盘上10个柱面的1-18个扇区,(目前ssd已经没有柱面这个概念了).读出来的数据放入内存0x8200起始的地方. 启动区放在0x ...

  2. 30天自制操作系统 pdf_30天自制操作系统:第四天:系统界面绘制

    第四天: OUT:让cpu给设备发送电信号. IN:让cpu从设备获取电信号. 为了区别不同的设备,要使用设备号码,用port表示. pushad: 将所有的32位通用寄存器压入堆栈 pusha:将所 ...

  3. 操作系统精讲(0) | 操作系统详细简介

    操作系统(英语:Operating System,缩写:OS)是一组主管并控制计算机操作.运用和运行硬件.软件资源和提供公共服务来组织用户交互的相互关联的系统软件程序,同时也是计算机系统的内核与基石. ...

  4. linux操作系统 第09章 操作系统接口

    第9章  操作系统接口 ( 好多人看这篇博客,应该是为了 9.1.2  操作系统的接口 那段描述吧,不知道是不是你们想要的答案 ... ... ) 9.1  操作系统接口概述 9.1.1  作业与作业 ...

  5. 了解操作系统,什么是操作系统Operation System?

    1.操作系统(Operation System,oS):是一个特殊的软件. 操作系统作为接口的示意图 1.没有安装操作系统的计算机,通常被称为裸机. 2.如果想在裸机上运行自己所编写的程序,就必须用机 ...

  6. 麒麟操作系统基于linux哪个版本_linux操作系统排行_桌面操作系统难在哪?国产麒麟系统应用仅为Windows十...

    桌面操作系统难在哪?国产麒麟系统应用仅为Windows十万分之一 10平台上差不多有70完款应用软件,而中标麒麟桌面操作系统只有8款,只有Windows平台的十万分之一左右. 公平地说,中标麒麟是基于 ...

  7. 深度操作系统和鸿蒙操作系统,深度操作系统与华为鸿蒙操作系统,都是操作系统,有什么不联系和区别?...

    华为推出的鸿蒙系统是基于Linux内核的,采用了微内核的架构,相比Android系统更加轻巧,可以适配PC.手机.智能穿戴设备.车载设备等,面向下一代网络的操作系统.华为的鸿蒙系统的祖先是UNIX操作 ...

  8. 数据服务器 操作系统,服务器如何选择操作系统

    因为对windows系统比较熟悉,加上操作简单.管理方便,所以与Linux相比,得到了更多服务器客户的青睐,但是windows系统又分为多个版本,甚至每个版本又分为32位和64位,那么,我们该怎么选择 ...

  9. 在Windows操作系统下,由操作系统分配的内存就叫做堆

    堆(Heap) 上面的工作是编译器做的,即程序员并不参与堆栈的维护.但上面已经说了,堆栈相当于在编译时期分配内存,因此一旦计算好某块内存的偏移,则这块内存就只能那么大,不能变化了(如果变化会导致其他内 ...

  10. 计算机操作系统_计算机理论(操作系统概念及常见操作系统类型)

    操作系统,对于我们来说是一个经常会听到的名词,如我们日常使用的Window系统等.但是,对于操作系统的概念,大部分人都是一知半解的.本节我们主要简单介绍下操作系统的定义,以及常见的操作系统的类型. 现 ...

最新文章

  1. 进虚拟ftp服务器跳网页,ftp服务器总是自动跳到网页
  2. ad20如何导入库_脱水防锈油如何使用才正确?
  3. python异常(高级) Exception
  4. 10年经验总结,华为fellow教你如何成为一名优秀的架构师?
  5. 华为海外女科学家为您揭秘:GaussDB(for MySQL)云栈垂直集成的力量有多大?
  6. 苹果电脑删除软件_5款Mac查杀恶意流氓软件,防护你的MacOS电脑,随时清理优化更加安全!...
  7. 面试题:synchronized的底层实现(偏向锁,轻量级锁,重量级锁)
  8. drools视频教程(drool实战实例+数据库+视频讲解)
  9. 各种气象数据下载地址推荐
  10. 比例尺分辨率转换(openlayers)
  11. 金融学习之八——ARCH和GARCH模型应用
  12. 福田中心区20个楼盘航拍全景
  13. html页眉页脚独立,页眉页脚怎么单独设置
  14. 纯干货,dp和px,那些不得不吐槽的故事—Android平台图片文字元素单位浅析
  15. 非接触物体尺寸形态测量(G 题)
  16. Springboot 阿里云OSS修改下载文件名称
  17. 一位医疗 AI 创业者的自述:这个行业到底需要什么样的产品?...
  18. 关于无盘产品市场调查
  19. 百度2018营收破千亿,AI成发展主要驱动力
  20. 计算机系统在英语中的运用,在应用系统中探究计算机屏幕英语句法规律.doc

热门文章

  1. WPF 动态添加控件以及样式字典的引用(Style introduction)
  2. C#与.NET Framework c#编程语言,和java是一样的。(c#,java) --javaweb,asp.net
  3. C++ 怎么自己创建头文件
  4. 20171208校内训练
  5. 如何在 Linux 终端中知道你的公有 IP
  6. 画图解释 SQL join 语句
  7. 又给人家当分母了,顺便介绍一下GIS领域的顶级国际会议
  8. apache恢复服务器文件,apache服务器的配置文件是
  9. 理解J.U.C中的ReentrantLock
  10. Dubbo集群容错策略源码分析