动手做操作系统

动手做操作系统

准备工具

  1. 在Windows下编写代码,使用vscode、记事本等编辑器。
  2. 使用Linux的虚拟机编译内核和生成操作软盘映像。(img软盘也可以直接在window11环境下使用bximage.exe生成,但需要在虚拟机里进行格式化)
  3. 必要时使用安装了DOS的虚拟机来调试程序以及操作软盘映像。
  4. 安装一个Bochs,必要的时候用它来调试。
  5. 使用其他必要的工具,比如版本控制工具(VSS或者CVS)。

tips

  1. 软盘是从A盘启动的

实模式和保护模式

在操作系统中,实模式(Real Mode)和保护模式(Protected Mode)是两种不同的工作模式,特别是在x86架构的计算机上常见。

实模式:

  • 实模式是早期IBM PC兼容计算机上的一种工作模式。在实模式下,CPU可以访问1MB范围内的内存。
  • 内存管理采用分段机制,内存地址由一个16位段地址和一个16位偏移地址组成,共20位地址空间。
  • 实模式下,没有内存保护机制,任何程序都可以访问系统的所有内存和硬件设备,因此容易导致系统的稳定性问题。
    保护模式:
  • 保护模式是后来引入的一种工作模式,提供了更为复杂和强大的内存管理和保护机制。
  • 在保护模式下,CPU可以访问超过1MB的内存,并且支持虚拟内存和分页机制。
  • 内存管理采用分段和分页结合的方式,可以实现更灵活的内存保护和隔离,不同程序之间不会相互影响。
  • 保护模式下,操作系统可以对内存和硬件设备进行更精细的控制和管理,提高了系统的稳定性和安全性。

总的来说,实模式和保护模式是操作系统在x86架构下的两种不同的工作模式,保护模式相比实模式具有更多的功能和优势,是现代操作系统常用的工作模式。

全局描述符表(GDT)

全局描述符表(Global Descriptor Table,GDT)是x86架构下一种用于管理内存的数据结构,它在操作系统中扮演着重要的角色。GDT定义了内存分段的策略,包括内存段的起始地址、段的大小、访问权限等信息。

在x86架构中,内存被分成多个段(segment),每个段都有自己的起始地址和大小。GDT就是用来管理这些段的数据结构。每个段都由一个描述符(descriptor)来描述,而GDT就是存放这些描述符的表格。描述符包含了段的各种属性,比如基地址、段限长、访问权限等。

通过GDT,操作系统可以实现对内存的灵活管理和保护。例如,操作系统可以将代码、数据、堆栈等不同类型的信息放在不同的段中,并且对每个段设置不同的访问权限,从而提高系统的安全性和稳定性。此外,GDT还支持虚拟内存和分页机制,可以实现更高效的内存管理和地址转换。

总的来说,全局描述符表(GDT)是x86架构下一种重要的内存管理数据结构,它定义了内存分段的策略,为操作系统提供了灵活的内存管理和保护机制。

进入保护模式

(1) 准备GDT

(2) 用 lgdt 加载 gdtr.
lgdt [GdtPtr]

(3) 关中断
cli

(4) 打开 A20地址线.
in al, 92h
or al, 00000010b
out 92h, al

(5)置cr0的PE位(第0位)为1.
mov eax, cr0
or eax, 1
mov cr0, eax

(6)跳转,进入保护模式.
jmp dword SelectorCode32:0

运行一个.com程序的步骤

  1. 使用bximage.exe生成一个软盘
  2. 将软盘插入到xp虚拟机中,进行格式化(选择带ms-dos启动盘的格式化)
  3. 将需要运行的.com程序放入软盘中,之后将软盘取出(防止软盘被占用而出错)
  4. 编辑bochsrc.bxrc,将软盘名称改成自己软盘的名称,将启动盘改成A
  5. 运行C:\Bochs-2.6.9\dos 里的 bchsrc.bxrc即可进入到软盘中,之后在窗口中输入test1.com即可运行

保护模式下的特点

  1. 地址用 SEG:OFFSET 表示 ; 段值仍然由原来16位的cs、ds 等寄存器表示,但此时它仅仅变成了一个索引,这个索引指向一个数据结构的一个表项,表项中详细定义了段的起始地址、界限、属性等内容。这个数据结构,就是GDT(实际上还可能是LDT,这个以后再介绍)。GDT 中的表项也有一个专门的名字,叫做描述符(Descriptor)。
  2. 也就是说,GDT的作用是用来提供段式存储机制,这种机制是通过段寄存器和GDT中的描述符共同提供的。
  3. GDT中的每一个描述符定义一个段
  4. 不难理解,当TI和RPL都为零时,选择子就变成了对应描述符相对于GDT 基址的偏移

建立新段的步骤

  1. 建立一个段
  2. 在段表中建立一个条目写进去
  3. 给定一个选择子(指向段表的索引)
  4. 初始化时,把起始地址填入到Desc
  5. 使用该段

动手做操作系统
https://cs-lb.github.io/2024/03/28/计算机408/OS/
作者
Liu Bo
发布于
2024年3月28日
许可协议