《30天自制操作系统》笔记(06)——CPU的32位模式
《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位模式的更多相关文章
- 30天自制操作系统(三)进入32位模式并导入C语言
1 制作真正的IPL IPL(Initial Program Loader),启动程序装载器,但是之前并没有实质性的装载任何程序,这次作者要开始装载程序了. 虽然现在开发的操作系统啥功能也没有,作者说 ...
- 《30天自制操作系统》笔记(02)——导入C语言
<30天自制操作系统>笔记(02)——导入C语言 进度回顾 在上一篇,记录了计算机开机时加载IPL程序(initial program loader,一个nas汇编程序)的情况,包括IPL ...
- 《30天自制操作系统》笔记(01)——hello bitzhuwei’s OS!
<30天自制操作系统>笔记(01)——hello bitzhuwei's OS! 最初的OS代码 ; hello-os ; TAB=4 ORG 0x7c00 ; 指明程序的装载地址 ; 以 ...
- 30天自制操作系统第九天学习笔记(u盘软盘双启动版本)
暑假学习小日本的那本书:30天自制操作系统 qq交流群:122358078 ,更多学习中的问题.资料,群里分享 environment:开发环境:ubuntu 第九天的课程已学完,确实有点不想写 ...
- 《30天自制操作系统》笔记(01)——hello bitzhuwei’s OS!【转】
转自:http://www.cnblogs.com/bitzhuwei/p/OS-in-30-days-01-hello-bitzhuwei-OS.html 阅读目录(Content) 最初的OS代码 ...
- 《30天自制操作系统》笔记3 --- (Day2 上节)完全解析文件系统
Day2 汇编语言学习与Makefile入门 本文仅带着思路,研究源码里关于文件系统的参数 关于day2主程序部分及更多内容,请看<30天自制操作系统>笔记 导航 发现学习中的变化 源码差 ...
- 《30天自制操作系统》笔记(03)——使用Vmware
<30天自制操作系统>笔记(03)——使用Vmware 进度回顾 在上一篇,实现了用IPL加载OS程序到内存,然后JMP到OS程序这一功能:并且总结出下一步的OS开发结构.但是遇到了真机测 ...
- 单字节的FIFO缓存(30天自制操作系统--读书笔记)
从今天起,写一些读书笔记.最近几个月都在看<30天自制操作系统这本书>,书虽说看的是电子书,但可以花钱买的正版书,既然花费了金钱,就总得有些收获. 任何人都不能总是固步自封,想要进步就得学 ...
- 从你的u盘启动:30天自制操作系统第四天u盘启动学习笔记
暑假学习小日本的那本书:30天自制操作系统 qq交流群:122358078 ,更多学习中的问题.资料,群里分享 developing environment:ubuntu 关于u盘启动自己做的操 ...
随机推荐
- ckeditor使用
安装: 下载CKEDITOR的文件,解压后复制到工程的WEBROOT目录下就OK! 引用CKEDITOR的JS文件: 新建JSP页面,添加其JS文件<script type="text ...
- ubuntu安装goldendict以及添加本地词典和在线词典
软件在ubuntu软件中心安装就可以了, 关于网络词典, 推荐有道在线词典,网址http://dict.youdao.com/search?q=%GDWORD%&ue=utf8 添加方法:编辑 ...
- 自定义滚动条——控制div的大小和透明度
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 31.0px Consolas; color: #2b7ec3 } p.p2 { margin: 0.0px ...
- oracle官方文档12c对应关系
ADDCI Oracle® Database Data Cartridge Developer's Guide 12c Release 1 (12.1) E15882-05 ADFNS Oracle® ...
- WEB响应布局
[15/06月,15] em是相对长度单位.相对于当前对象内文本的字体尺寸.如当前对行内文本的字体尺寸未被人为设置,则相对于浏览器的默认字体尺寸.(引自CSS2.0手册) 任意浏览器的默认字体高都是1 ...
- 搭建基于python +opencv+Beautifulsoup+Neurolab机器学习平台
搭建基于python +opencv+Beautifulsoup+Neurolab机器学习平台 By 子敬叔叔 最近在学习麦好的<机器学习实践指南案例应用解析第二版>,在安装学习环境的时候 ...
- Python成长笔记 - 基础篇 (九)
创建一个socketserver 至少分以下几步: First, you must create a request handler class by subclassing the BaseRequ ...
- JDK和环境配置
1. JASE : J2SE 这个就是我们现在在学的东西,他是一切Java的核心基础 JAME :J2ME : 他是Java的一个微型版,主要用来做移动开发 JAEE :J2EE Java企业版本,主 ...
- shell脚本调试
转自:http://www.ibm.com/developerworks/cn/linux/l-cn-shell-debug/ 一. 前言 shell编程在unix/linux世界中使用得非常广泛,熟 ...
- c#判断是否为合法的email地址
题目要求: class Program { static void Main(string[] args) { Console.WriteLine("请输入正确的邮箱地址,以 @sina.c ...