《30天自制操作系统》读书笔记(2)hello, world
- 让系统跑起来
要写一个操作系统,我们首先要有一个储存系统的介质,原版书似乎是06年出版的,可惜那时候没有电脑,没想到作者用的还是软盘,现在的电脑谁有软驱?不得已我使用一张128M的SD卡来代替,而事实上你用的是U盘还是软盘对我们的操作系统没有影响,缺点是你的U盘刷入系统后容量只能是1440 MB,即当年流行的3.5英寸软盘的大小,当然不用担心,再格式化一次(用DiskGeniu),就可以恢复。
我做事情的话,总是怕自己的努力的结果白费了,害怕辛辛苦苦看完这本书但是发现做出来的东西现在根本没法用,比如你花了大力气造了一辆火车,发现轮子的间距和现行标准不符,没轨道可以跑,被标准抛弃的感觉太恐怖,所以我决定试试,作者的系统能不能真正地跑起来。
我选择了源码中projects\30_day\harib27f中的haribote.img文件,用ImgWriter写入到我的储存卡,

写入后的大小和预期相符,1.x MB;

重新启动,开机时狂按Delete,修改启动项;

F10保存后重启,心中有些忐忑不安;
… …
但是结果还是如我所愿,看,It works!

这是就是我们要完成的东西了,偷窥胜利果实的快感不言而喻,系统甚至支持USB键盘,但不支持USB鼠标确实是不能用。我试着输入了几个命令:

Bad command. 我也不知道什么是作者指定的command,已知的是,exit能用。
- 用Virtual Box 代替物理机
频繁地开关电脑来调试我们的系统是不理想的,我们需要Virtual Box来搭把手。
打开VB的控制台,新建虚拟机,操作系统的类型选Other,版本选择Other\Unknown,
一直点下一步直到虚拟硬盘,选择不添加虚拟硬盘,我们的虚拟硬盘文件就是img。


选择虚拟电脑的设置——储存——储存树,添加一个软盘控制器,原来的IDE控制器可以删掉了,在软盘控制器里新增软盘到控制器,当然选择刚才的haribote.img,然后大功告成,启动系统。

启动系统后一切都显得那么完美,鼠标能用,键盘也是,而且非常方便,输入的蹩脚英文或许有错,见笑了。

PS: 这里需要注意的是本来有另一种方案,使用VB安装目录下的VBoxManage.exe 执行 VBoxManage convertdd file.img file.vdi
但不知为何,没办法转换上述的haribote.img,只能转换下面要写的hello, world。
- 动手写操作系统
电脑启动的步骤是简要部分步骤是:加电——读取BIOS——自检——控制权移交操作系统(或者说引导),如此看来,我们的任务就是编写一段符合规范的代码,在第四步的时候代码会被执行。
首先我们需要一个标准的FAT12的启动扇区(Boot sector)的代码,我很希望有FAT32 的,无奈这本书给的就是FAT12的,代码如下:
但是这段完全由数据组成的代码只是符合了一个软盘启动扇区的标准,还没有任何可执行的代码:
; OS 0.01
; 标准FAT12软盘专用代码 DB 0xeb, 0x4e,0x90
DB "HELLOIPL" ; 启动扇区(boot sector)的名字
DW ; 每个扇区(sector)的大小:512B
DB ; 簇(cluster)的大小:一个扇区
DW ; FAT的起始位置
DB ; FAT的个数
DW ; 根目录大小
DW ; 磁盘大小 2880扇区
DB 0xf0 ; 磁盘种类
DW ; FAT长度
DW ; 一个磁道(track)有18个扇区
DW ; 磁头数
DD ; 不使用分区
DD ; 重写磁盘大小
DB ,,,0x29 ; 固定
DD 0xffffffff ; 意义不明
DB "HELLP_OS " ; 磁盘名称11字节
DB "FAT12 " ; 磁盘的格式名称8字节
RESB ; 空出18 Bit
下面添加了可执行的代码,可以称作是IPL了。
; hello-os
; TAB=4 ORG 0x7c00 ;为什么这两句可以代替前面的 0xeb 0x4e?
JMP entry
DB 0x90
DB "HELLOIPL"
DW
DB
DW
DB
DW
DW
DB 0xf0
DW
DW
DW
DD
DD
DB ,,0x29
DD 0xffffffff
DB "HELLO-OS "
DB "FAT12 "
RESB entry:
MOV AX,
MOV SS,AX ;这里改为 SS,0会出错
MOV SP,0x7c00
MOV DS,AX
MOV ES,AX
MOV SI,msg ;储存字符串的首地址
putloop: MOV AL,[SI]
ADD SI,
CMP AL,
JE fin
MOV AH,0x0e ; int 0x10 的 0x0e号功能
MOV BX,0x15
INT 0x10
JMP putloop
fin:
HLT
JMP fin msg:
DB 0x0a, 0x0a ; '\n' = #13 = 0x0a
DB "LastAvengers's OS"
DB 0x0a
DB ; 结束标志 RESB 0x7dfe-$ ; 0x01fe+0x7c00 = 0x7dfe
DB 0x55, 0xaa
DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
RESB
DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
RESB
使用作者提供的nask.exe,执行 nask.exe IPL.asm a.img 可以得到镜像文件,可以利用VB来启动了。
- 简化操作流程:
一开始作者为我们提供了install.bat,!cons_nt.bat,run.bat来安装和运行系统,后
来又介绍了make.exe,实在是神器,(之前还不解为什么在Linux下编译包需要make install,现在终于知道了),只需要构造一个不带扩展名的MakeFile文件,就可以集编译写入运行于一身,MakeFile 的基本格式如下:
宏定义 源文件之间的相互依赖关系
任意可执行的Shell命令
作者在这里贸贸然地给出了
helloos.img : ipl.bin Makefile
../z_tools/edimg.exe imgin:../z_tools/fdimg0at.tek \
wbinimg src:ipl.bin len:512 from:0 to:0 imgout:helloos.img
先通过nask 生成bin文件再用edimg.exe 转为img文件,我不知道为什么要这么做,而且生成 .lst 文件的时候也失败了。
作者给出的makefile中地址都是斜杠,而系统用的是反斜杠,虽然效果一样,但是看着不爽,vim ":1,$/\//\\/g"可以将所有斜杠转化为反斜杠,注意这里的\有的是用来做转义的。
于是我没有照着他那样,我的MakeFile改写如下,同样正常工作:
# nask.exe ipl.asm a.img ipl.lst ::fail NASK: LSTBUF is no enough default :
tolset\z_tools\make.exe install
tolset\z_tools\make.exe run
del *.*~ >nul ::删除临时文件
del *~ >nul a.img : ipl.asm Makefile
tolset\z_tools\nask.exe ipl.asm a.img::直接编译成img,不知作者的用意是什么 install :
tolset\z_tools\make.exe -r a.img run :
echo Running...
"D:\Program Files\Oracle\VirtualBox\VirtualBox.exe" --comment "OS1" --startvm "a5c4b0e6-e142-4720-98ee-056911204b29" ::虚拟机的快捷方式
echo Finished.
另外改写了!cons_nt.bat,增加了环境变量。
@echo off
color 0b
set PATH=%PATH%;tolset\z_tools\
cmd.exe
之后打开!cons_nt.bat, 输入make,效果如图:


- 知识点:
FAT12启动区的标准:第511个字节开始填充55AA,软盘大小是2880*512/1024 = 1440 KB;
启动区的加载地址是 0x7c00—0x7dff;
各种寄存器,只有SI,DI,BX为数不多的几个寄存器才能放地址;
MakeFile 的用法;
Vim的替换命令;
int 0x10中断重点是AH=0EH:http://blog.csdn.net/thimin/article/details/2313390。
唉,我真是话唠。
《30天自制操作系统》读书笔记(2)hello, world的更多相关文章
- 单字节的FIFO缓存(30天自制操作系统--读书笔记)
从今天起,写一些读书笔记.最近几个月都在看<30天自制操作系统这本书>,书虽说看的是电子书,但可以花钱买的正版书,既然花费了金钱,就总得有些收获. 任何人都不能总是固步自封,想要进步就得学 ...
- 《30天自制操作系统》笔记(06)——CPU的32位模式
<30天自制操作系统>笔记(06)——CPU的32位模式 进度回顾 上一篇中实现了启用鼠标.键盘的功能.屏幕上会显示出用户按键.点击鼠标的情况.这是通过设置硬件的中断函数实现的,可以说硬件 ...
- 《30天自制操作系统》笔记(03)——使用Vmware
<30天自制操作系统>笔记(03)——使用Vmware 进度回顾 在上一篇,实现了用IPL加载OS程序到内存,然后JMP到OS程序这一功能:并且总结出下一步的OS开发结构.但是遇到了真机测 ...
- 《30天自制操作系统》笔记(02)——导入C语言
<30天自制操作系统>笔记(02)——导入C语言 进度回顾 在上一篇,记录了计算机开机时加载IPL程序(initial program loader,一个nas汇编程序)的情况,包括IPL ...
- 《30天自制操作系统》笔记(01)——hello bitzhuwei’s OS!
<30天自制操作系统>笔记(01)——hello bitzhuwei's OS! 最初的OS代码 ; hello-os ; TAB=4 ORG 0x7c00 ; 指明程序的装载地址 ; 以 ...
- 《30天自制操作系统》笔记(01)——hello bitzhuwei’s OS!【转】
转自:http://www.cnblogs.com/bitzhuwei/p/OS-in-30-days-01-hello-bitzhuwei-OS.html 阅读目录(Content) 最初的OS代码 ...
- 《30天自制操作系统》笔记3 --- (Day2 上节)完全解析文件系统
Day2 汇编语言学习与Makefile入门 本文仅带着思路,研究源码里关于文件系统的参数 关于day2主程序部分及更多内容,请看<30天自制操作系统>笔记 导航 发现学习中的变化 源码差 ...
- 《30天自制操作系统》笔记4 --- (Day2 下节)了解如何用汇编写操作系统中的HelloWorld
关于上一节,我测试了发现3e.4c.4e都OK ,4b 4d 4f都进不去系统还把qemu卡死了. 50不会输出HelloWorld,可能需要hex偶数且在0x3e~4f区间吧.上节复制并运行命令如下 ...
- 《30天自制操作系统》笔记5 --- (Day3)
这个专题荒废了许久,今天补点东西 不够准确的小结 用汇编来开发操作系统,就是使用汇编本身的功能再加上BIOS中断提供的功能来完成功能的过程. 汇编本身的功能不够,毕竟没有外部IO,所以通过给多个寄存器 ...
- 《30天自制操作系统》笔记2 --- 初步了解汇编产生的二进制(Day1)
nask.exe应该就是nas kit(nas开发工具的意思),由于这个编译器是作者自己写的,所以这种汇编语言应该是作者改造出来的,所以我叫它nas汇编语言. 作者说nask是模仿nasm语法的,关于 ...
随机推荐
- 西安Uber优步司机奖励政策(1月11日~1月17日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- selenium webdriver启动Chrome浏览器后无法输入网址的解决办法
通过selenium webdriver启动Chrome浏览器,脚本如下: from selenium import webdriver browser = webdriver.Chrome() br ...
- 设置IIS7文件上传的最大大小 maxAllowedContentLength,maxRequestLength
当上传一个超过30M的文件时,服务器会重定向至404.13页面,报错如下: HTTP Error 404.13 - Not Found The request filtering module is ...
- 异步tcp通信——APM.Server 消息推送服务的实现
消息推送服务 服务器推送目前流行就是私信.发布/订阅等模式,基本上都是基于会话映射,消息对列等技术实现的:高性能.分布式可以如下解决:会话映射可采用redis cluster等技术实现,消息对列可使用 ...
- servlet+jdbc+javabean其实跟ssh差不多
我给的这个架构可以代替ssh的架构进行项目的开发 common中放的是一些公用类 dao中放的是一些对数据的处理 entity其实也就是javabean service中放的是一些抽象类,简单来说抽象 ...
- 导入excel错误:外部表不是预期的格式 解决方案(Oledb)
-----转载:http://blog.csdn.net/zhou349398998/article/details/8740424 环境:win7+iis7+Office2007 在asp.net网 ...
- 玩转iOS 9的UIDynamics(转)
转自 http://www.cocoachina.com/ios/20150716/12613.html 本文由CocoaChina翻译小组成员AGSpider(微博)翻译自fancypixel的博客 ...
- UIWebView取消长按放大(用于长按识别二维码)
禁用长按UIWebView时放大镜及选择功能: //通过js调用 - (void)webViewDidFinishLoad:(UIWebView*)webView { // Disable user ...
- Hibernate 性能优化之懒加载
针对数据库中的大数据,不希望特别早的加载到内存中,当用到它的时候才加载 懒加载分为:类的懒加载.集合的懒加载.单端关联的懒加载 类的懒加载 1.在默认情况下,类就是执行懒加载 2. ...
- 【USACO 1.2.5】双重回文数
[题目描述] 如果一个数从左往右读和从右往左读都是一样,那么这个数就叫做“回文数”.例如,12321就是一个回文数,而77778就不是.当然,回文数的首和尾都应是非零的,因此0220就不是回文数. 事 ...