在拖了一个月后终于开始写《30天自制操作系统》的第一天内容记录,在写本文时对应的项目已经进行到第21天运行由C编写的应用程序,但也卡在该部分暂时没有进展。

开始自制操作系统的第一天,我们的目标是要实现启动虚拟机并在屏幕上打印hello, world文字。下面就开始第一天的内容吧。

汇编实现

; 第一部分:FAT文件系统信息DB    0xeb, 0x4e        ; 跳转指令DB    0x90              ; NOP指令; 略DB    "FAT12   "        ; 文件系统类型(8字节)RESB  18                ; 空18字节; 第二部分:程序主体DB    0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7cDB    0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8aDB    0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09DB    0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xebDB    0xee, 0xf4, 0xeb, 0xfd; 第三部分:信息显示部分数据DB    0x0a, 0x0a        ; 两个换行DB    "hello, world"DB    0x0a              ; 换行DB    0RESB  0x1fe - ($ - $$)  ; 填写0x00,直到0x001feDB    0x55, 0xaa; 第四部分:启动区外的内容DB    0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00RESB  4600DB    0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00RESB  1469432

文中假定读者对汇编已经有一定的了解,但在此处也对出现的指令做简单的介绍。在NASM汇编中,DB指令的作用为写入一个字节指定内容,RESB伪指令为预留一定长度的的空间,并在其中使用0x00进行填充。RESB指令之所以称之为伪指令,是因为该类指令并非真实的x86指令,而是用于指示汇编器的指令。

程序的第一部分为FAT12文件系统的头部信息,在书中作者对该部分的内容做了大致的描述。在后面笔者计划将通过另外的文章具体介绍FAT系列文件系统,对该文件系统有兴趣的读者也可另外查阅相关资料,在最后的参考资料中将给出部分FAT文件系统的相关资料。

第二部分为程序指令的主体部分,但我们在本文中先不介绍该部分的内容,在第二天的内容中我们将具体分析该部分的内容。

第三部分为信息数据部分,本文中我们将只关注其中两行指令。RESB 0x1fe - ($ - $$)指令的作用为从当前位置起至0x1fe的空间将被预留并使用0x00进行填充。这里也是我们使用NASM改写后与原文代码出现不同的地方。在NASM中,$代表当前行汇编后的地址,$$代表当前程序开始处的地址。

接下去一行的DB 0x55, 0xaa是将0x55aa写入到0x1fe0x1ff两个位置。0x55aa是MBP(Main Boot Partition,主引导分区)结束的标识符。在计算机的Legacy启动模式下,硬盘、软盘等介质的第一个扇区将作为主引导分区使用,该扇区使用0x55aa作为结束的标识符。

最后,是FAT文件系统的其它填充数据。同样,我们在本文中也不关注该部分的内容,只需要知道我们会将镜像文件填充至1.44MB大小。

制作镜像文件

在了解了程序的构成后,我们需要将该汇编程序制作为img镜像来使用。

在前文中我们提到了将使用NASM作为汇编器,在这里我们可以使用下面的命令将helloos.asm制作为helloos.img镜像文件。

$ nasm -f bin helloos.asm -o helloos.img

在上面的命令中,主要由几个部分构成:

  • -f binNASM-f选项用于指定输出文件的格式,可选的格式包括由elfmachowinbin等。在此处我们选择输出的格式为bin,即二进制文件。
  • helloos.asm:不使用选项指定的为源文件列表,该部分可包括多个源文件。
  • -o helloos.imgNASM-o参数用于指定输出文件的路径,此处我们将输出文件保存为当前文件夹下的helloos.img文件。

运行与结果

《30天自制操作系统》该书编写的年代流行的主要介质还是软盘,所以编写后会将程序安装至软盘上。但是现在软盘与软盘驱动器早就被淘汰了,所以我们使用qemu模拟器来运行上述程序(当然作者在书中也是使用了qemu,只是写在了第1天第一部分靠后的内容里)。

因为笔者本身使用Mac而非Windows,便也不使用作者提供的qemu程序,而是至今使用当前较新的版本。qemu提供了许多不同架构的模拟程序,例如qemu-system-i386(32位x86)、qemu-system-x86_64(64位x86)、qemu-system-armqemu-system-mips等。因为我们的主要是编写针对32位x86平台的操作系统,所以此处我们选择qemu-system-i386作为使用的模拟程序。

因为我们是模拟软盘运行,所以需要使用qemu-fda选项。-fda <file>选项即将<file>所指的文件当作软件镜像使用。

$ qemu-system-i386 -fda helloos.img

通过运行上述命令,我们可以得到类似于下图所示的结果:

本文代码保存于https://github.com/ghosind/HariboteOS/tree/main/day1中,其中部分代码与文中可能存在部分差异。

参考资料

  • 川合秀实, 30天自制操作系统.
  • NASM Documentation
  • FAT File System

30天自制操作系统第1天 - Hello World相关推荐

  1. 为什么《30天自制操作系统》封面中的猫是两只尾巴

    刚刚在一社区,发了一贴,被指出一问题,询一高人,得一答案.这便是我没有关注到的封面上的那只猫,我想这也是很多读者没有关注到的.因为在我微博的200转发贴中,并没有人提到封面中的猫为何有两只尾巴.于是咨 ...

  2. 发布在《30天自制操作系统》之前的帮助阅读贴

    说明:这是8月15日即将上市的一本新书,本文的摘选也可以命名为<30天自制操作系统>上市之前必读.本书幽默,有趣,可以说是技术书里的幽默书,让您读起来绝对不会感到乏味.在本书上市之前,您一 ...

  3. 《30天自制操作系统》笔记(01)——hello bitzhuwei’s OS!

    <30天自制操作系统>笔记(01)--hello bitzhuwei's OS! 最初的OS代码 1 ; hello-os 2 ; TAB=4 3 4 ORG 0x7c00 ; 指明程序的 ...

  4. 写在《30天自制操作系统》上市之前

       这本<30天自制操作系统>马上就要在各大书店和网上商城全面上架了,作为本书的4位译者之一,我负责翻译了本书约三分之二的内容.这是我参与翻译的第一本译著,我感到很激动也很紧张,因为我知 ...

  5. 《30天自制操作系统》笔记(04)——显示器256色

    <30天自制操作系统>笔记(04)--显示器256色 进度回顾 从最开始的(01)篇到上一篇为止,已经解决了开发环境问题和OS项目的顶层设计问题. 本篇做一个小练习:设置显卡显示256色. ...

  6. 《30天自制操作系统》学习笔记--第好多天

    之前看<30天自制操作系统>,参考而成,和书中系统并不完全一致,是在原有基础上按照自己的习惯而成,由于水平和工作原因,未完成内存管理和文件系统,有兴趣者可以通过以下网址https://gi ...

  7. 由《30天自制操作系统》引发的漫画创作

    大家可还记得<30天自制操作系统>的封面上的那只猫吗?记得当时,在果壳网有人问,为何这只猫长了两只尾巴呢,延着这条线,我把这本书捧上了展示的舞台.事隔四个多月,我又重提此书. 这本经我手宣 ...

  8. 30天自制操作系统——第二十三天窗口操作

    窗口及输入切换 我们先来实现用键盘切换窗口,按下F11键,将最下面的窗口移动到最上面,这里F11按键的编码为0x57. bootpack.c节选: void HariMain(void) {(略)fo ...

  9. 30天自制操作系统-初体验

    最近在图书馆翻阅关于操作系统的书籍,看到川和秀实的自制操作系统决定也动手尝试一下,这本书书名就叫做30天自制操作系统.首先还是附上光盘镜像的获取地址吧.30天自制操作系统光盘镜像ISO完整版下载 - ...

  10. 《30天自制操作系统》---第一天

    <30天自制操作系统>---第一天 二进制编译与文本编译器大家用自己顺手的就可以,今天通过两种方法运行虚拟机,第一种通过作者提供的工具运行在QEMU中,第二种方法运行到VMWare中,直接 ...

最新文章

  1. Initializing Spring root WebApplicationContext
  2. #脱贫攻坚#彭蕾卸任蚂蚁金服后首次现身:女性脱贫亮三招
  3. DPDK vhost-user研究(九)
  4. Cacti auth.php,Cacti微信企业号图文报警
  5. javaEE的开发模式
  6. 《走进SAP(第2版)》——2.8 SAP的目标是什么
  7. 泪目!连拿3份 offer,AI 程序员求职经历火爆 IT圈!
  8. 最详细的Faster RCNN论文笔记
  9. RayMarching2:给球加上光照
  10. 五步完成Spring整合Mybatis的完整示例
  11. comsol积分函数_COMSOL教程- 巧用PDE、ODE耦合方程实现变量的时间积分或者空间微分...
  12. jquery视频教程(jquery视频教程全集)
  13. 如何把64GB或以上的SD卡格式化为FAT32的格式
  14. UEFI 文件类型 .efi (二)
  15. 装饰器模式Decorate
  16. 关联分析(Association Analysis)--挖掘啤酒与尿布的关联规则
  17. Codeforces - Pokémon Army
  18. Java中的时间、时区和夏令时
  19. logging日志管理
  20. 用Python做了鉴黄模型,内含多20万张“不可描述”图片!

热门文章

  1. 解决鼠标滚动时页面上下跳动的问题
  2. 虚拟摄像头(拉rtsp流或桌面作为图像源)
  3. @Secured()、 @PreAuthorize() 、 @RolesAllowed()
  4. python print end参数_python print的参数详解
  5. linux ipad 视频,是否可以在iPad或iPad上同时播放多个视频文件?
  6. “海纳百川”下载器的使用方法
  7. 风行python_Python曾是程序员的“瑞士军刀”,而如今正被慢慢取代
  8. 七牛云存储使用经历到底怎么样
  9. 钢琴网页制作教程_钢琴
  10. 在nameSilo购买域名