前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >《30天自制操作系统》读书笔记

《30天自制操作系统》读书笔记

作者头像
iOSDevLog
发布2020-05-27 14:31:15
5470
发布2020-05-27 14:31:15
举报
文章被收录于专栏:iOSDevLogiOSDevLog

汇编

  • 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

image

综上所述,1张软盘有80个柱面,2个磁头,18个扇区,且一个扇区有512字节。所以,一张软盘的容量是:

80×2×18×512=1474 560 Byte=1440KB
80×2×18×512=1474 560 Byte=1440KB

以ES:BX这种方式来表示地址,写成

代码语言:javascript
复制
MOV AL,[ES:BX]

它代表

代码语言:javascript
复制
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
代码语言:javascript
复制
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”的缩写,意思是“中断屏蔽寄存器”。

image

现在简单介绍一下PIC的寄存器。首先,它们都是8位寄存器。IMR是“interrupt maskregister”的缩写,意思是“中断屏蔽寄存器”。

键盘

代码语言:javascript
复制
/* int.c */
struct KEYBUF {
    unsigned char data[32]; // buffer
    int next_r; // read
        int next_w;  // write
        int len; // <= 32
};
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 汇编
  • Makefile
    • 分段 / 分页
    • 中断
      • 键盘
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档