自制操作系统:引导扇区的实现
本书依靠的教材是于渊的《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-headers
和dkms
,然后sudo dkms autoinstall
就会编译生成vboxdrv模块。
手动执行sudo modprobe vboxdrv
加载vboxdrv模块,启动virtualbox应该不会有问题了。
建立一个虚拟机,有没有硬盘都可以,增加一个软驱,把我们的boot.img
加载到软驱中,启动虚拟机,成功的话,可以看到:
virtualbox可能出现的问题:
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
Effective UID is not root
. 解决方法:sudo chmod 4711 /usr/lib/virtualbox/VirtualBox
。
参见: https://www.virtualbox.org/ticket/7889
参考文章:
Hacking 《自己动手写操作系统》Chapter 1&2
自制操作系统:引导扇区的实现相关推荐
- 主引导扇区(MBR),分区表(DPT)及活动分区(DBR)
主引导扇区:硬盘的0柱面.0磁头.1扇区(也叫主引导记录MBR),大小为512Byte. 分区表(DPT):位于主引导分区,从偏移01BEH开始到偏移01FDH结束的64字节. 活动分区DBR:DBR ...
- 操作系统引导的那点事
系统引导环节是操作系统启动过程中的最重要环节,也是最容易出问题的环节之一.按照个人计算机的硬件标准,引导环节发生在计算机的硬件系统检测完毕之后.具体的引导工作,是由BIOS完成的.BIOS维持一个可用 ...
- 30天自制操作系统 - 取代软盘,用U盘写入引导扇区
背景 作者是在2006年发布此书的(翻译版是在2012年在中国发售),当时可能还能找到带有软驱的计算机.但是时过境迁,现在已经不存在这种老古董东西了. 简单总结一下学习到第三天的一些更变. 更变 书籍 ...
- 操作系统编写之引导扇区
操作系统编写之引导扇区 你可能还没有从刚刚的兴奋中走出来,可是我不得不告诉你,实际上,你刚刚所完成的并不是一个完整的操作系统,而仅仅是一个最最简单的引导扇区(Boot Sector).然而不管我们完成 ...
- 操作系统1——引导扇区的理解
在操作系统这个方面,我记得自己经常听到主引导记录这个名词,但是对于它的理解并不深,只知道它在系统加载的时候很重要.现在我想自己写一个操作系统,但是想到第一步该怎么做呢?书上说是用汇编写引导程序.那么这 ...
- 如何读emmc里的引导程序_自制操作系统学习1 引导程序
本系列学习有前面的汇编学习基础最好,如果没有影响也不大本系列学习主要资源来自<[30天自制操作系统].(川合秀实)>,<自己动手写操作系统>两本书 一.准备工作 bochs v ...
- 操作系统源代码_计算机自制操作系统(八):仿生DOS操作系统源代码
一.真机运行 我们已经完成了仿生DOS操作系统的制作,并在上一章的末尾给大家在虚拟机上做了演示.今天,我们要将该操作系统在真机上启动运行,是不是非常期待自己做出的第一款比较有意义的操作系统? 在&qu ...
- 《操作系统真象还原》从零开始自制操作系统 自写源码实现 (fs相关文件)
文章目录 专栏博客链接 fs相关文件 编写完的dir.c 编写完的dir.h 编写完的file.c 编写完的file.h 编写完的fs.c 编写完的fs.h 编写完的inode.c 编写完的inode ...
- 30天自制操作系统——第五天
第五天 参考<30天自制操作系统>GDT&IDT - 谷月轩 - 博客 梳理一下文件 现在我们拥有这么9个文件: ipl10.nas InitialProgramLoader, 占 ...
- 《30天自制操作系统》从入门到放弃
前言 以下均是废话,大部分来自摘抄,只是记录本人放弃的过程!!!切记是摘抄!!! 相关资料在:https://download.csdn.net/download/wxkhturfun/2253304 ...
最新文章
- 居民信息管理系统java_基于jsp的社区住户信息管理系统-JavaEE实现社区住户信息管理系统 - java项目源码...
- 只需3步,随时随地玩转数据分析
- js计算工时,去周末,设置上下班时间
- 国庆中秋活动——超强AR/3D地球仪!带你领略世界风光!我们未必能环游世界,但都该有个地球仪
- JavaFX中的塔防(4)
- C#调用WebKit内核
- idea快捷操作_IDEA插件系列 快捷键神器!Key Promoter X
- 语句练习题 折纸、阶乘、阶乘求和、范围内条件查找(水仙花数)。
- VS2010 打包生成exe文件后 执行安装文件出现 TODO:lt;文件说明gt;已停止工作并已关闭...
- html加载gif动画效果,html – 使用CSS动画加载图像VS使用GIF图像加载
- 决策树cart算法详解
- 软件开发工具【十四】 之 常用建模工具
- taptap(fake)
- 柱状图怎么设置xy轴_经验-Origin做柱状图常遇问题-柱状图X坐标轴如何设置—小技巧...
- 1024程序员节,160元买400元图书专属优惠券,速来
- Oracle DB 序列
- 帆软加密狗注册配置安装步骤
- 2021考研数学汤家凤大纲解析
- 基于Matlab答题卡图像检测识别研究
- MATLAB下载html页面
热门文章
- ionic引用自定义html,pipe - Ionic 4自定义管道可以在app.component.html中正常工作,但不能在其他.html页面上工作(在.ts文件下工作) - 堆栈内存溢出...
- k-d Tree及其Java实现
- 2017年度工作总结
- 【POJ 2104】【主席树模板题】K-th Number
- 常用 Jacobi 行列式 | 重积分变量替换
- scrapy-cluster scrapy集群建设
- 神经网络与深度学习第2章:机器学习概述 阅读提问
- oracle的成本核算,Oracle11gR2全表扫描成本计算(工作量模式-workload)
- 一些抄来的冷知识...
- python学习笔记:操作Excle