写点什么

自制操作系统

用户头像
贾献华
关注
发布于: 2020 年 05 月 25 日

汇编



  • DB: define byte

  • RESB: reserve byte

  • DW: define word / 16 bit

  • DD: define double-word / 32 bit

  • $: 现在的字节数 / 将要读入的内存地址



Makefile



  • ORG: origin, 在开始执行的时候,把这些机器语言指令装载到内存中的哪个地址。

  • JMP: jump, goto

  • entry:: 标签的声明,用于指定JMP指令的跳转目的地等。

  • MOV: move, “MOV AX,0”,相当于“AX=0; ”



寄存器



  1. AX——accumulator,累加寄存器

  2. CX——counter,计数寄存器

  3. DX——data,数据寄存器

  4. BX——base,基址寄存器

  5. SP——stack pointer,栈指针寄存器

  6. BP——base pointer,基址指针寄存器

  7. SI——source index,源变址寄存器

  8. DI——destination index,目的变址寄存器



段寄存器



  1. ES——附加段寄存器(extra segment)

  2. CS——代码段寄存器(code segment)

  3. SS——栈段寄存器(stack segment)

  4. DS——数据段寄存器(data segment)

  5. FS——没有名称(segment part 2)

  6. 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这种方式来表示地址,写成



MOV AL,[ES:BX]

它代表



ES×16+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



8086
→80186
→286(16 bit)
→386(32 bit)
→486
→Pentium
→PentiumPro
→PentiumII
→PentiumIII
→Pentium4→



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天自制操作系统》



用户头像

贾献华

关注

及时当勉励 岁月不待人 2018.06.04 加入

https://2020.iosdevlog.com

评论

发布
暂无评论
自制操作系统