- 让系统跑起来
要写一个操作系统,我们首先要有一个储存系统的介质,原版书似乎是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语法的,关于 ...
随机推荐
-
ASP.NET 创建网站地图
很多个人站长会使用工具来生成自己网站的站点地图,这样做的缺点在于网站的 sitemap 不能及时的得到更新.当我们发表了一篇新文章时,应该对网站的地图进行更新,并通知搜索引擎网站地图已经发生了改变! ...
-
xtrabackup工具
xtrabackup是基于InnoDB存储引擎灾难恢复的.它复制InnoDB的数据文件,尽管数据文件在内部是非一致性的,但在执行灾难恢复时可以保证这些数据文件是一致的,并且可用. 官方原理 在Inno ...
-
java进程状态
A thread state. A thread can be in one of the following states: NEWA thread that has not yet started ...
-
CSS 中常用的选择器(选择符)
一.标签选择器:直接将HTML标签(Tag)作为选择器,可以是p.h1.dl.strong等HTML标签.如: p { font:12px;}em { color:blue;}dl { float:l ...
-
Jumpserver
Jumpserver 是一款由python编写开源的跳板机(堡垒机)系统,实现了跳板机应有的功能.基于ssh协议来管理,客户端无需安装agent. 支持常见系统: redhat centos debi ...
-
MySQL data路径为空解决方法
CMD x:\mysql\5.7.12\bin>mysqld --initialize-insecure --user=mysql
-
java to kotlin (2) - lambda编程
前言 Kotlin Note 是我学习kotlin整理笔记向博客,文章中的例子参考了kotlin in action这本书籍,同时我也极力推荐这本书,拥有Java基础的人可以很快的就使用kotlin来 ...
-
php环境搭建和第一个php程序
一.开发环境搭建 因为是初学,使用的还是非常经典的组合appserv+dreamweaver cs6; 1.1 appserv安装 appserv的安装还是非常简单的,直接双击可执行程序appse ...
-
Js修改input值后怎么同步修改绑定的v-model值
v-model只是一种语法糖,底层的方法还是去监听input事件.所以可以使用dispatchEvent事件给元素分配一个input事件,这样可以手动触发 inputElement 的 input 事 ...
-
Python学习——1
我是一名刚入IT行业的小白,目前主要是做网络运维这一块.曾经总是认为我是做网络运维的,学习代码干啥啊?后来就慢慢发现,传统的运维方式让我的效率好像不如别人效率高,关键还TM看别人比我更轻松.每一个网络 ...