自制操作系统
汇编
DB
: define byteRESB
: reserve byteDW
: define word / 16 bitDD
: define double-word / 32 bit$
: 现在的字节数 / 将要读入的内存地址
Makefile
ORG
: origin, 在开始执行的时候,把这些机器语言指令装载到内存中的哪个地址。JMP
: jump, gotoentry:
: 标签的声明,用于指定JMP指令的跳转目的地等。MOV
: move, “MOV AX,0”,相当于“AX=0; ”
寄存器
AX——accumulator,累加寄存器
CX——counter,计数寄存器
DX——data,数据寄存器
BX——base,基址寄存器
SP——stack pointer,栈指针寄存器
BP——base pointer,基址指针寄存器
SI——source index,源变址寄存器
DI——destination index,目的变址寄存器
段寄存器
ES——附加段寄存器(extra segment)
CS——代码段寄存器(code segment)
SS——栈段寄存器(stack segment)
DS——数据段寄存器(data segment)
FS——没有名称(segment part 2)
GS——没有名称(segment part 3)
寄存器指定内存地址[]: BX、BP、SI、DI
AX、CX、DX、SP不能用来指定内存地址
JE
: jump if equal
INT
: 是软件中断指令
HLT
: interrupt 是让CPU停止动作的指令, 是让CPU进入待机状态
JC
: 是“jump ifcarry”的缩写,意思是如果进位标志(carry flag)是1的话,就跳转。
JNC
: Jump ifnot carry”
JAE
: “Jump if above or equal”
JBE
: jump if below orequal
综上所述,1张软盘有80个柱面,2个磁头,18个扇区,且一个扇区有512字节。所以,一张软盘的容量是:
$$
80×2×18×512=1474 560 Byte=1440KB
$$
以ES:BX这种方式来表示地址,写成
它代表
❏ 首先,使用cc1.exe从bootpack.c生成bootpack.gas。
❏ 第二步,使用gas2nask.exe从bootpack.gas生成bootpack.nas。
❏ 第三步,使用nask.exe从bootpack.nas生成bootpack.obj。
❏ 第四步,使用obi2bim.exe从bootpack.obj生成bootpack.bim。
❏ 最后,使用bim2hrb.exe从bootpack.bim生成bootpack.hrb。
❏ 这样就做成了机器语言,再使用copy指令将asmhead.bin与bootpack.hrb单纯结合到起来,就成了haribote.sys。
bootpack.c
* cc1.exe
* bootpack.gas
* gas2nask.exe
* bootpack.nas
* nask.exe
* bootpack.obj
* obj2bim.exe
* bootpack.bim
* bim2hrb.exe
* botpack.hrb
asmhead.bin + haribote.hrb = haribote.sys
GDT
是“global(segment)descriptor table”的缩写,意思是全局段号记录表。将这些数据整齐地排列在内存的某个地方,然后将内存的起始地址和有效设定个数放在CPU内被称作GDTR(global(segment)descriptor table register)的特殊寄存器中,设定就完成了。
另外,IDT
是“interrupt descriptor table”的缩写,直译过来就是“中断记录表”。当CPU遇到外部状况变化,或者是内部偶然发生某些错误时,会临时切换过去处理这种突发事件。这就是中断功能。
分段 / 分页
将合计4GB[插图]的内存分成很多块(block),每一块的起始地址都看作0来处理。
像这样分割出来的块,就称为 段(segment)
。
按这种分段方法,为了表示一个段,需要有以下信息。
❏ 段的大小是多少
❏ 段的起始地址在哪里
❏ 段的管理属性(禁止写入,禁止执行,系统专用等)
顺便说一句,如果不用分段而用分页,也能解决问题。不过我们目前还不讨论分页,可以暂时不考虑它。需要注意的一点是,我们用16位的时候曾经讲解过的段寄存器。这里的分段,使用的就是这个段寄存器。但是16位的时候,如果计算地址,只要将地址乘以16就可以了。
“系统专用”,“应用程序用”什么的,听着让人摸不着头脑。都是些什么东西呀?
在32位模式下,CPU有系统模式(也称为“ring0”[插图])和应用模式(也称为“ring3”)之分。操作系统等“管理用”的程序,和应用程序等“被管理”的程序,运行时的模式是不同的。
中断
PIC
: “programmable interrupt controller”的缩写,意思是“可编程中断控制器”。
IRQ
: PIC是将8个中断信号(interrupt request)集合成一个中断信号的装置。
ICW
: 是“initial control word”的缩写,意为“初始化控制数据”。
IMR
: 是“interrupt maskregister”的缩写,意思是“中断屏蔽寄存器”。
编辑
删除
现在简单介绍一下PIC的寄存器。首先,它们都是8位寄存器。IMR是“interrupt maskregister”的缩写,意思是“中断屏蔽寄存器”。
###键盘
```c
/ int.c /
struct KEYBUF {
unsigned char data[32]; // buffer
int next_r; // read
int next_w; // write
int len; // <= 32
};
```
参考:《30天自制操作系统》
评论