《30天自制操作系统》笔记(06)——CPU的32位模式

进度回顾

上一篇中实现了启用鼠标、键盘的功能。屏幕上会显示出用户按键、点击鼠标的情况。这是通过设置硬件的中断函数实现的,可以说硬件本身的设计就具有事件驱动的性质,所以软件层面上才有基于事件的消息机制。

但上一篇没有说明中断的来龙去脉,本篇就从头到尾描述一下CPU与此相关的设置问题。

Segment

32位的CPU使用32条地址线,能区分232=4G个内存地址。每个内存地址都有1Byte的内容。

分段,就是将4GB的内存分成很多块(block),每一块的起始地址都看作0来处理。有了这个功能,任何程序都可以先写上一句"ORG 0",一个应用程序就不会占用别人的内存空间,这样就可以同时运行多个程序。像这样分割出来的块,就称为段(segment)。还有一种"分页"的技术,这里不讨论。

为了表示一个段,需要记录以下信息:

  • 段的起始地址
  • 段的大小
  • 段的管理属性(禁止写入,执行,系统专用等)

这些信息需要用8个字节保存。使用段的方式是和调色板神似的:DS是16位,理论上能够表示216=65536个段。但由于CPU设计上的原因,低3位不能用,因此DS只能表示213=个段(即第0个~第8191个)。

在16位模式下,如果写"MOV AL, [DS:EBX]",那么要计算的地址是DS*16+EBX。在32位模式下,则应该是DS表示的段(segment)的起始地址+EBX。

另外,如果写成"MOV AL, [EBX]",则汇编器认为这等同于"MOV AL, [DS:EBX]"。这一点在16位和32位模式下是一致的。

要存储8192个段,就需要占用8192*8=65536Byte=64KB的内存空间。这64KB的数据就称为GDT (Global segment Descriptor Table)即"全局段号记录表"。

将这64K的GDT整齐地排列在内存某处,再将其起始地址和有效设定个数放在CPU内被称作GDTR的48bit寄存器中,GDT的设定就完成了。

段的起始地址、大小、管理属性这些信息是按bit保存的,十分复杂,暂时不要理会。

IDT

当CPU遇到外部情况变化,或是内部发生某些错误时,会临时切换过去处理这种突发事件。这就是中断功能。键盘按键、鼠标按键、鼠标移动、除0等都会引发中断。有了中断机制,CPU就不需要一直查询这些低速设备的状态,将时间用在处理任务上。

因此,要使用鼠标键盘,就必须使用中断机制,即设置IDT。

IDT(Interrupt Descriptor Table)即"中断记录表"。IDT记录了0~255的中断号与调用函数之间的对应关系。当发生了123号中断,就会调用对应的函数。其设置方式与GDT是相似的,IDT的每一项也需要8Byte保存,这8Byte里包括中断处理函数名(即C语言中的函数指针)。

另外,必须先设置GDT后设置IDT。原因不详。

PIC

PIC(Programmable Interrupt Controller)即"可编程中断控制器"。它是一个硬件芯片。

当键盘鼠标发生按键、移动时,PIC就会向CPU发送电信号,然后CPU要求PIC发送2个Byte来(其内容为"0xcd 0x??",实际上是机器语言的INT指令),CPU还真就把PIC送来的这2个Byte看作一条指令执行。其结果是调用IDT中对应的函数。

PIC的设定基本上都是固定死的几行代码,暂时不用理会。

进入32位模式

进入32位模式实际上很简单,按照一定的步骤将某些寄存器(CR0等)设置为特定的值就行了。也有点繁琐,暂时不理会。

操作系统程序被加载到内存中的什么地方才行?这个没有特别的规定,根据自己的偏好分给OS一些内存空间就行了。不过有些内存空间放着BIOS等程序,而且大部分高地址的内存是要给应用程序使用的。因此OS程序的空间分配也不要太随意了。下图是HariboteOS设计的内存分布图。

总结

本文以轻量从简的态度简单说明了OS启动时要初始化的大部分东西,即GDT、IDT、PIC、32位模式。我个人认为这些都是细节,应该进行封装。后续的内存管理、多任务才是OS设计的核心内容。

请查看下一篇《《30天自制操作系统》笔记(07)——内存管理》

《30天自制操作系统》笔记(06)——CPU的32位模式的更多相关文章

  1. 30天自制操作系统(三)进入32位模式并导入C语言

    1 制作真正的IPL IPL(Initial Program Loader),启动程序装载器,但是之前并没有实质性的装载任何程序,这次作者要开始装载程序了. 虽然现在开发的操作系统啥功能也没有,作者说 ...

  2. 《30天自制操作系统》笔记(02)——导入C语言

    <30天自制操作系统>笔记(02)——导入C语言 进度回顾 在上一篇,记录了计算机开机时加载IPL程序(initial program loader,一个nas汇编程序)的情况,包括IPL ...

  3. 《30天自制操作系统》笔记(01)——hello bitzhuwei’s OS!

    <30天自制操作系统>笔记(01)——hello bitzhuwei's OS! 最初的OS代码 ; hello-os ; TAB=4 ORG 0x7c00 ; 指明程序的装载地址 ; 以 ...

  4. 30天自制操作系统第九天学习笔记(u盘软盘双启动版本)

    暑假学习小日本的那本书:30天自制操作系统 qq交流群:122358078    ,更多学习中的问题.资料,群里分享 environment:开发环境:ubuntu 第九天的课程已学完,确实有点不想写 ...

  5. 《30天自制操作系统》笔记(01)——hello bitzhuwei’s OS!【转】

    转自:http://www.cnblogs.com/bitzhuwei/p/OS-in-30-days-01-hello-bitzhuwei-OS.html 阅读目录(Content) 最初的OS代码 ...

  6. 《30天自制操作系统》笔记3 --- (Day2 上节)完全解析文件系统

    Day2 汇编语言学习与Makefile入门 本文仅带着思路,研究源码里关于文件系统的参数 关于day2主程序部分及更多内容,请看<30天自制操作系统>笔记 导航 发现学习中的变化 源码差 ...

  7. 《30天自制操作系统》笔记(03)——使用Vmware

    <30天自制操作系统>笔记(03)——使用Vmware 进度回顾 在上一篇,实现了用IPL加载OS程序到内存,然后JMP到OS程序这一功能:并且总结出下一步的OS开发结构.但是遇到了真机测 ...

  8. 单字节的FIFO缓存(30天自制操作系统--读书笔记)

    从今天起,写一些读书笔记.最近几个月都在看<30天自制操作系统这本书>,书虽说看的是电子书,但可以花钱买的正版书,既然花费了金钱,就总得有些收获. 任何人都不能总是固步自封,想要进步就得学 ...

  9. 从你的u盘启动:30天自制操作系统第四天u盘启动学习笔记

    暑假学习小日本的那本书:30天自制操作系统 qq交流群:122358078    ,更多学习中的问题.资料,群里分享 developing environment:ubuntu 关于u盘启动自己做的操 ...

随机推荐

  1. hibernate(1)

    1. 环境配置 1.1 hiberante环境配置 hibernate可实现面向对象的数据存储.hibernate的官网:http://hibernate.org/ 官网上选择hibernate OR ...

  2. 运用requirejs的异步加载方式

    很容易让人以为是权重出问题了,但就我自己多个项目动画导出的经验来看,大 我们说程序员核心能力有以下几点:自学能力,解决问题的能力,团队合作能力.自学可以让我们在这个日新月异的时代不被淘汰;解决问题可以 ...

  3. ASP.NET操作ORACLE数据库之模糊查询

    ASP.NET操作ORACLE数据库之模糊查询 一.ASP.NET MVC利用OracleHelper辅助类操作ORACLE数据库 //连接Oracle数据库的连接字符串 string connect ...

  4. CAD二次开发 - 可缩放块(四)

    1.说明 可进行缩放性注释的对象有:文字.标注.图案填充.公差.多重引线.块及属性. 2.为图形添加.删除注释比例步骤 1)使用AnnotationScale类(在DatabaseServices命名 ...

  5. 【线段树】bzoj1018 [SHOI2008]堵塞的交通traffic

    线段树的每个叶子节点存一列. 每个节点维护六个域,分别是左上左下.左上右上.左上右下.左下右上.左下右下.右上右下在区间内部的连通性,不考虑绕出去的情况. 初始每个叶子的左上左下.右上右下是连通的. ...

  6. css中怎么设置透明度的问题

    小伙伴们是不是在找怎么样去设置页面的透明度的方法呢...别找了,我这儿就有,而且肯定够用了. 我自己会用到的就有两种,可以和大家分享一下. 1.用opcity的方法去设置透明度.代码如下: .div ...

  7. 关于netty

    现在我们一般使用应用程序或者链接库相互进行通信.例如,我们经常通过一个使用http协议的客户端链接库,从网站服务器中获得信息,并且通过网站服务,调用一些远程程序. 然而,一些通用协议或者它们的实现方式 ...

  8. 【Visual Lisp】两种出错处理方式

    两种出错处理方式:一种是对出错函数进行重定义,一种是对错误进行捕捉处理. ;;============================================================= ...

  9. 《python核心编程》笔记——文件的创建、读取和显示

    创建文件(makeTextFile.py)脚本提醒用户输入一个尚不存在的文件名,然后由用户输入文件每一行,最后将所有文本写入文本文件 #!/usr/bin/env python 'makeTextFi ...

  10. viojs1908无线网路发射器选址

      描述 随着智能手机的日益普及,人们对无线网的需求日益增大.某城市决定对城市内的公共场所覆盖无线网. 假设该城市的布局为由严格平行的 129 条东西向街道和 129 条南北向街道所形成的网格状,并且 ...