《一个操作系统的实现》读书笔记-- 第一章--最小的“操作系统”

一、最简单的“操作系统”

最最简单的“操作系统”就是一个最最简单的引导扇区(Boot Sector)。虽然它不具有任何功能,但是它却能够直接在裸机上运行,不依赖其他软件。一个引导扇区是512个字节,并且以0xAA55为结束标识的扇区。下面就是那个最最简单的引导扇区。

org 07C00h                   		; 告诉编译器程序加载到07C00处
       mov ax, cs
       mov ds, ax
       mov es, ax
       call DispStr                    	; 调用显示字符串例程
       jmp $              		; 无限循环
DispStr:
       mov ax, BootMessage
       mov bp, ax                    	; es:bp = 串地址
       mov cx, 16                    	; cx = 串长度
       mov ax, 01301h            	; ah = 13, al = 01h
       mov bx, 000Ch              	; 页号为0(bh = 0) 黑底红字 (bl = 0Ch,高亮)
       mov dl, 0
       int 10h                          ; 10h号中断
       ret
BootMessage:  db "Hello,OS world!"
times 510-($-$$)   db   0            	; 填充剩下的空间,使生成的二进制代码恰好为512字节
dw 0xaa55                               ; 结束标志

1、org 07C00h

org伪指令: org + 数值表达式

其中,org是操作码,不可省略。数值表达式给出偏移地址值,即org语句后的指令或数据以数值表达式给出的值作为起始的偏移地址。数值表达式必须是一个可计算得到的正整数,数值范围在0~65535之间。

org伪指令用来指出其后的程序段或数据块存放的起始地址的偏移量。汇编程序汇编时把语句中表达式的值作为起始地址,连续存放org语句之后的程序和数据,直到出现一个新的org指令。若省略org语句,则从本段起始地址开始连续存放。

在大多数情况下,不需要用org语句设置位置指针。由于段定义语句是段的起点,它的偏移地址为0000H,以后每分配一个字节,位置指针自动加1,所以每条指令都有确定的偏移地址。只有程序要求改变这个位置指针时,才需要安排org语句。通常org语句可以出现在程序中任何位置上。   

org示例:

在数据段中依次定义以下变量,由于此时没有使用org语句,则变量word1的偏移地址为0。
word1 DW  1234h
byte1  DB   56h
word2 DW  abcdh
其在数据段中word1,byte1,word2的存储位置如下图所示(采用小端存储,按单字节对齐)。


在数据段中依次定义以下变量,由于此时使用org语句,则变量word1的偏移地址为1。
org 0001h
word1 DW  1234h
byte1  DB   56h
word2 DW  abcdh
其在数据段中word1,byte1,word2的存储位置如下图所示(采用小端存储,按单字节对齐)。

我们知道编译器本身在汇编时对指令的地址计算是相对地址,而对于引导扇区,是按绝对地址执行,那么对于用相对地址编译的执行码就要换算成绝对地址。一般而言,“真实开始执行的引导扇区”都会固定装载到07C00h处。

由于编译器在编译时的地址是从第一行开始用0000h开始相对计算的,而且我们要写的是“引导扇区”程序,所以我们要将下面的代码加载到地址07C00h处,所以我们需要org 07C00h,通过该伪指令,将代码和数据加载到07C00h地址。

2、jmp $

$被称为当前位置计数器

在汇编程序对源程序进行汇编的过程中,使用地址计数器来保证当前正在汇编的指令地址。地址计数器值可用“$”来表示,汇编语言也允许用户直接用“$”来引用地址计数器的当前值,因此,org $+5可表示从当前地址开始跳过5个字节存储单元,在指令和伪指令中,也可直接用“$”表示地址计数器的当前值。故jmp $进入了一个无限循环。

3、int  10h

int  10H号中断

int 10H 是由BIOS 对屏幕及显示器所提供的服务程序。使用int 10H 中断服务程序时,先指定 AH 寄存器为下表编号其中之一,该编号表示欲调用的功用,而其他寄存器的详细说明,参考表后文字,当一切设定好之后再调用 int 10H。

在这里我们只详细讲解本程序中的10号中断。由于ah=13,故调用编号为13的功能:即显示字符串。其中ES:BP=串地址,CX=串长度 ,AH=13,当AL=01h时,光标会跟随显示移动。BH为页号,BH=0表示页号为0,BL=0CH,表示属性,即黑底红字高亮。因此在调用10号中断之前,无非就是对各个寄存器进行初始化。

关于10号中断的其他信息,请参考 http://blog.csdn.net/yes_life/article/details/6778834

4、times 510-($-$$)  db  0

times:重复指令或数据

times前缀引起指令被汇编多次。其中$$表示是该程序的初始代码段的地址,故该指令将会被执行510-($-$$)次。也就是用0来填充剩下的空间,达到510字节。

二、如何运行该“操作系统”

1、环境准备

(1)计算机操作系统(Windows)
(2)虚拟机(VMware)
(3)汇编编译器(NASM)
(3)软盘(虚拟软盘RamDiskNT)
(4)rawrite.exe/本书光盘自带OS/Tools/FloppyWriter,负责将程序写入到软盘。

2、编译boot.asm

将上述代码文件命名为boot.asm,然后使用nasm命令编译该文件。
nasm boot.asm –o boot.bin

3、虚拟软盘A


点击Start之后,查看“我的电脑”里是否有虚拟软盘A,如果没有,重启。

4、将boot.bin写入到软盘A


点击Enter。(注意boot.bin与Rawrite.ext在同一文件目录下)。

5、创建虚拟机

安装VMware,在VMware创建一个虚拟机,命名为Tinix,并设置系统引导盘为软盘A。


启动该系统,得出结果图为:


三、本操作系统启动流程

打开计算机电源;加电自检(POST);寻找启动盘,该系统设置从软盘启动,计算机检查软盘的0面0磁道1扇区,如果发现它以0xAA55结束,则BIOS会认为它是一个引导扇区;BIOS将该512字节扇区内容加载到内存地址0000:7c00;跳转到0000:7C00出将控制权交给这段引导代码。到此为止,计算机不再由BIOS中固有的程序来控制,而变成由操作系统的一部分来控制。

上述工具下载地址 http://download.csdn.net/detail/zgh1988/6922887


最近做了一个 Json 格式化,在线时间戳转换,Md5 编码,URL 编码,Base64 编解码,正则表达式,Linux 命令大全 等功能,欢迎大家使用和加入。

Json 格式化在线时间戳转换Md5 编码Url 编码Base64 编解码 正则表达式 Linux 命令大全


Menuet 是英国一位软件工程师 Ville Mikael Turjanmaa 利用业余时间开发的,完全由 x86汇编语言于 2000年写成的一款32位操作系统。经过大量的修改与完善后, Menuet OS目前已经成为一个用功能完善的操作系统,目前的版本号是 0.74。Ver 0.75 正在开发中。 MenuetOS 并不是一个类Unix操作系统,它完全由 Asm语言编写的系统。Menuet 不基于当前任何一款流行的操作系统而运作,主要是为在开发过程中避免复杂的编程及各种不可预料的 Bug。 尽管Menuet是完全用 32位汇编写成的,但它的系统程序构架并不完全是为汇编语言而保留,它的接口实际上可用于任何程序设计语言。尽管如此,系统开发的目的还是为更简化 Asm程序设计而设计,系统下 GUI编程尤其体现这一点。 Menuet OS 的特点: 多任务,多线程 图形用户界面,可以达到 16bit color,1280x1024 dpi 程序开发比 Windows 和 Linux 之类的系统更容易 IDE环境:自带应用程序及内核编辑编译工具 完全开放的源代码(GPL) TCP/IP 协议栈、PPP 及 局域网络 HTTP/MP3/Mail 服务器,3D迷宫 自由的界面,窗口可换“皮肤” 仅一张 1.44M 软盘可以装下! Menuet OS 对硬件的要求 : CPU : 386 或更高 显示: 支持 VESA 2.0的显卡(推荐使用)或支持 VESA 1.2 的显卡,至少 1M显存。VGA/EGA 显示器。(注:目前的显卡都支持 VESA 3.0,同时也向下兼容) 声卡: 兼容 SB(Sound blaster) 16声效卡 硬盘: LBA 模式 FAT32文件系统 网络: Realtech 8029/8139 芯片组网卡 鼠标: PS/2 或 COM 或 USB /*别相信这个,我的USB鼠标就用不了*/ 内存: 至少32M
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值