《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盘启动自己做的操 ...
随机推荐
- freeCodeCamp:Mutations
蛤蟆可以吃队友,也可以吃对手. 如果数组第一个字符串元素包含了第二个字符串元素的所有字符,函数返回true. 举例,["hello", "Hello"]应该返回 ...
- Tomcat如何配置环境变量
1, JDK:版本为jdk-7-windows-i586.exe 下载地址: http://www.oracle.com/technetwork/java/javase/downloads/index ...
- STM32 DAC的配置与使用
本博文转自:http://blog.chinaunix.net/uid-24219701-id-4101802.html STM32 的 DAC 模块(数字/模拟转换模块)是 12 位数字输入,电压输 ...
- Don't Block on Async Code【转】
http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html This is a problem that is brough ...
- Python爬虫入门案例:获取百词斩已学单词列表
百词斩是一款很不错的单词记忆APP,在学习过程中,它会记录你所学的每个单词及你答错的次数,通过此列表可以很方便地找到自己在记忆哪些单词时总是反复出错记不住.我们来用Python来爬取这些信息,同时学习 ...
- 转载:[转]如何学好3D游戏引擎编程
[转]如何学好3D游戏引擎编程 Albert 本帖被 gamengines 从 游戏引擎(Game Engine) 此文为转载,但是值得一看. 此篇文章献给那些为了游戏编程不怕困难的热血青年,它的 ...
- shell循环
for循环 for循环一般格式为: for 变量 in 列表 do command1 command2 ... commandN done 列表是一组值(数字.字符串等)组成的序列,每个值通过空格分隔 ...
- 主成分分析PCA的前世今生
这篇博客会以攻略形式介绍PCA在前世今生. 其实,主成分分析知识一种分析算法,他的前生:应用场景:后世:输出结果的去向,在网上的博客都没有详细的提示.这里,我将从应用场景开始,介绍到得出PCA结果后, ...
- Java学习笔记一——安装JDK并配置环境变量
下载安装JDK1.8 在官网上下载JDK,官网地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-213 ...
- 大型B2B网站开发手记 1
本手记记录所有该B2B网站开发中遇到的问题和解决方法,一方面给大家一些思路,一方面提升自己,记录整个过程 1. 测试环境部署问题 部署环境是server2012 R2,部署上去发现WCF报错如下 sv ...