本书依靠的教材是于渊的《Orange'S:一个操作系统的实现》

实验环境及工具

  • ArchLinux(windows也可以)
  • 代码编辑器Emacs(你尽情使用自己喜欢的编辑器)
  • nasm (一个开源的汇编器,可以从sourceforge下载,也可以从Linux发行版的软件仓库安装)

思路:

  • 写一段汇编代码,输出 Hello, World
  • 将该段代码写入软盘镜像的第一个扇区
  • 安装virtualbox创建一个操作系统,从软盘镜像引导,查看结果

引导区代码

    ;; BIOS会把512字节的引导扇区加载到 0000:7c00 处,;; 然后跳转到0000:7c00处,将控制权交给引导代码。org 07c00h                  ;这一行告诉编译器,我们的代码将被加载到7c00处。mov ax, cs                  ;将代码段寄存器的值送入AXmov ds, ax                  ;将数据段的地址置为代码段的地址?mov es, ax                  ;将附加段的地址置为代码段的地址?call  DispStr               ;调用显示字符串例程jmp $                       ;无限循环, $表示当前行编译后的地址;; 以上就是整个程序的执行过程了;; 下面是DispStr子程序
DispStr:mov ax, BootMessage         ;将字符串首地址传给寄存器axmov bp, ax                  ;CPU将用ES:BP来寻址字符串mov cx, 16                  ;通过CX,CPU知道字符串的长度mov ax, 01301h              ;AH=13表示13号中断, AL=01H,表示目标字符串仅仅包含字符,属性在BL中包含,移动光标mov bx, 000ch               ;黑底红字, BL=0CH,高亮mov dl, 0                   ;dh表示在第几行显示,dl表示第几列显示int 10h                     ;BIOS的10H中断的13号中断用于显示字符串ret
BootMessage:    db "Hello, OS world!" ;对NASM来讲,标号和变量的作用一样, db表示define byte;; $当前行被汇编后的地址,$$表示一个section开始处的地址,本程序只有一个section,所以指0x7c00times 510-($-$$) db 0           ;填充剩下空间,使生成的二进制恰好为512字节dw 0xaa55                       ;结束标志,如果发现扇区以0xAA55结束,则BIOS认为它是一个引导扇区,dw表示define word

关于中断显示字符串的细节,可参见使用BIOS中断显示字符串笔记(int 10h 13号中断)。

编译生成二进制

需要nasm。如果你使用Linux,可以直接从软件仓库安装。
nasm即可以从汇编代码生成目标代码,也带了一个反汇编工具ndisasm, 可以从目标代码生成汇编代码。

编译我们的扇区代码生成二进制:

nasm boot.asm -o boot.bin

写入软盘的第一个扇区

我们用软盘镜像来模拟软盘。

dd if=/dev/zero of=emptydisk.img bs=512 count=2880 #生成空白软盘镜像文件
dd if=boot.bin of=boot.img bs=512 count=1 #用 bin file 生成对应的镜像文件
dd if=emptydisk.img of=boot.img skip=1 seek=1 bs=512 count=2879 #在 bin 生成的镜像文件后补上空白,成为合适大小的软盘镜像

这样,我们引导系统用的虚拟软盘就准备好了。

安装virtualbox,建立系统

可以直接从Linux软件仓库安装virtualbox。

把当前用户加入vboxusers组:gpasswd -a <username> vboxusers

启动virtualbox,可能提示vboxdrv未能成功加载。如果发生这种情况,需要重新编译vboxdrv模块。安装linux-headersdkms,然后sudo dkms autoinstall就会编译生成vboxdrv模块。

手动执行sudo modprobe vboxdrv加载vboxdrv模块,启动virtualbox应该不会有问题了。

建立一个虚拟机,有没有硬盘都可以,增加一个软驱,把我们的boot.img加载到软驱中,启动虚拟机,成功的话,可以看到:

virtualbox可能出现的问题:

  1. Failed to open a session for the virtual machine a. Failed to load VMMR0.r0 (VERR_SUPLIB_OWNER_NOT_ROOT). Unknown error creating VM (VERR_SUPLIB_OWNER_NOT_ROOT). 解决方法:sudo chown -R root:root /usr/lib/virtualbox

  2. Effective UID is not root. 解决方法: sudo chmod 4711 /usr/lib/virtualbox/VirtualBox

参见: https://www.virtualbox.org/ticket/7889

参考文章:

Hacking 《自己动手写操作系统》Chapter 1&2

自制操作系统:引导扇区的实现相关推荐

  1. 主引导扇区(MBR),分区表(DPT)及活动分区(DBR)

    主引导扇区:硬盘的0柱面.0磁头.1扇区(也叫主引导记录MBR),大小为512Byte. 分区表(DPT):位于主引导分区,从偏移01BEH开始到偏移01FDH结束的64字节. 活动分区DBR:DBR ...

  2. 操作系统引导的那点事

    系统引导环节是操作系统启动过程中的最重要环节,也是最容易出问题的环节之一.按照个人计算机的硬件标准,引导环节发生在计算机的硬件系统检测完毕之后.具体的引导工作,是由BIOS完成的.BIOS维持一个可用 ...

  3. 30天自制操作系统 - 取代软盘,用U盘写入引导扇区

    背景 作者是在2006年发布此书的(翻译版是在2012年在中国发售),当时可能还能找到带有软驱的计算机.但是时过境迁,现在已经不存在这种老古董东西了. 简单总结一下学习到第三天的一些更变. 更变 书籍 ...

  4. 操作系统编写之引导扇区

    操作系统编写之引导扇区 你可能还没有从刚刚的兴奋中走出来,可是我不得不告诉你,实际上,你刚刚所完成的并不是一个完整的操作系统,而仅仅是一个最最简单的引导扇区(Boot Sector).然而不管我们完成 ...

  5. 操作系统1——引导扇区的理解

    在操作系统这个方面,我记得自己经常听到主引导记录这个名词,但是对于它的理解并不深,只知道它在系统加载的时候很重要.现在我想自己写一个操作系统,但是想到第一步该怎么做呢?书上说是用汇编写引导程序.那么这 ...

  6. 如何读emmc里的引导程序_自制操作系统学习1 引导程序

    本系列学习有前面的汇编学习基础最好,如果没有影响也不大本系列学习主要资源来自<[30天自制操作系统].(川合秀实)>,<自己动手写操作系统>两本书 一.准备工作 bochs v ...

  7. 操作系统源代码_计算机自制操作系统(八):仿生DOS操作系统源代码

    一.真机运行 我们已经完成了仿生DOS操作系统的制作,并在上一章的末尾给大家在虚拟机上做了演示.今天,我们要将该操作系统在真机上启动运行,是不是非常期待自己做出的第一款比较有意义的操作系统? 在&qu ...

  8. 《操作系统真象还原》从零开始自制操作系统 自写源码实现 (fs相关文件)

    文章目录 专栏博客链接 fs相关文件 编写完的dir.c 编写完的dir.h 编写完的file.c 编写完的file.h 编写完的fs.c 编写完的fs.h 编写完的inode.c 编写完的inode ...

  9. 30天自制操作系统——第五天

    第五天 参考<30天自制操作系统>GDT&IDT - 谷月轩 - 博客 梳理一下文件 现在我们拥有这么9个文件: ipl10.nas InitialProgramLoader, 占 ...

  10. 《30天自制操作系统》从入门到放弃

    前言 以下均是废话,大部分来自摘抄,只是记录本人放弃的过程!!!切记是摘抄!!! 相关资料在:https://download.csdn.net/download/wxkhturfun/2253304 ...

最新文章

  1. 居民信息管理系统java_基于jsp的社区住户信息管理系统-JavaEE实现社区住户信息管理系统 - java项目源码...
  2. 只需3步,随时随地玩转数据分析
  3. js计算工时,去周末,设置上下班时间
  4. 国庆中秋活动——超强AR/3D地球仪!带你领略世界风光!我们未必能环游世界,但都该有个地球仪
  5. JavaFX中的塔防(4)
  6. C#调用WebKit内核
  7. idea快捷操作_IDEA插件系列 快捷键神器!Key Promoter X
  8. 语句练习题 折纸、阶乘、阶乘求和、范围内条件查找(水仙花数)。
  9. VS2010 打包生成exe文件后 执行安装文件出现 TODO:lt;文件说明gt;已停止工作并已关闭...
  10. html加载gif动画效果,html – 使用CSS动画加载图像VS使用GIF图像加载
  11. 决策树cart算法详解
  12. 软件开发工具【十四】 之 常用建模工具
  13. taptap(fake)
  14. 柱状图怎么设置xy轴_经验-Origin做柱状图常遇问题-柱状图X坐标轴如何设置—小技巧...
  15. 1024程序员节,160元买400元图书专属优惠券,速来
  16. Oracle DB 序列
  17. 帆软加密狗注册配置安装步骤
  18. 2021考研数学汤家凤大纲解析
  19. 基于Matlab答题卡图像检测识别研究
  20. MATLAB下载html页面

热门文章

  1. ionic引用自定义html,pipe - Ionic 4自定义管道可以在app.component.html中正常工作,但不能在其他.html页面上工作(在.ts文件下工作) - 堆栈内存溢出...
  2. k-d Tree及其Java实现
  3. 2017年度工作总结
  4. 【POJ 2104】【主席树模板题】K-th Number
  5. 常用 Jacobi 行列式 | 重积分变量替换
  6. scrapy-cluster scrapy集群建设
  7. 神经网络与深度学习第2章:机器学习概述 阅读提问
  8. oracle的成本核算,Oracle11gR2全表扫描成本计算(工作量模式-workload)
  9. 一些抄来的冷知识...
  10. python学习笔记:操作Excle