《自己动手写操作系统》心得

动手写操作系统
本文分享了作者在阅读《自己动手写操作系统》一书后的感悟及理解,重点介绍了寻址过程,并探讨了从实模式到保护模式的转变,以及保护模式下的寻址机制。
 

不知道是从哪里来的兴趣想起自己了解一下操作系统的具体实现来了,实话实说,之前也学过操作系统,只不过学校的课程跟我完全不是一个风格。理论一大堆,我知道那是在讲什么,操作系统嘛当然^^。太深刻了!就像跟一个盲人描述一头象:象是动物,长鼻子、大耳朵、四只腿哦,原来那就是大象啊!?

别自欺欺人了,如果你真是一个‘盲人’,OK没关系!管它是什么呢,有个印象就不错了。当然这取决于你想深究到的层次,还有就是你的风格。

对于我来说更想倾向于实践主义而非理论主义,但我也相信无论你适合哪种主义,It’s all right!就像LinusEric,前者的Linux内核正在撼动着微软的地位,后者的开源思想以及理论巨著《大教堂与集市》(等)也是影响着一大批的牛人!说到这里就不得不提提GNU的创始人Richard ,个人感觉‘教父‘这个称呼甚是恰当!不仅是炒了MIT,最重要的是它的Free SoftwareGNU’S NOT UNIX,呵呵,嬉皮的定义手法!他们重写了UNIX下的Program,我想这不仅只是版权的问题,GNU践行着自己的理想,传播着自由的意识!这可不是崇拜,每个人都有自己的理想,没有必要崇拜什么!

Okay,还是回归正题吧,回来写写心得吧,呵呵,很不错的一本书!这可不是做广告哦,毕竟作者跟我没有利益关系嘛。之所以说不错是因为这确实符合我的风格,一点一点的让你有成就感,一点一点的把你引向操作系统的大门!其实这本书是写了一个很小很小的内核!就像Linux内核一样,只是还没有那么高级。按照Richard的说法,内核只是操作系统的一部分,当年他们规划GNU的时候也是做过内核的设计,只不过他们规划的系统很复杂,听他的描述,应该是一个微内核,各个模块彼此间异步传信,完成不同的功能,由于没有很好的调试手段,BUG很难定位,后来发现了Linux内核,这也正是GNU缺少的了,Free的世界就是自由,于是直接拿了Linux做内核,这也导致以后大家都说是Linux系统而非GNU系统,其实严格来讲Linux有很多种发行版本,GNU/Linux只是其中一种!RedHatDebianUbuntu…听说最近网上又有了GreenHat国产的Linux系统,不知道是不是对RedHat的恶搞。我想了解这一点还是有必要的,操作系统不只是内核提供的内存管理、进程管理、设备管理如果这样那它只是一个内核而已,内核提供了其它程序运行的环境,为它们分配内存,执行相应的处理机分配算法、进程调度算法以及管理相应的硬件设备。然而除此之外我们还需要比如CompilerDebugerEditor等等等等。呵呵,现在我们还是不讨论什么是操作系统了吧,就让我们暂且认为内核就是一个操作系统吧,毕竟那太复杂

《自己动手写操作体统》的一个优点就是在不断给你鼓励,而且把复杂的问题简单化抽取最本质的东西拿给你看,用作者的话讲就是慢慢的把你引到冰山的脚下!

下边就针对这本书具体内容写一下自己的理解吧!

之一:寻址

不管是操作系统还是普通程序,首先要解决的就是一个寻址的问题!只有知道了地址,CPU才能知道到哪里找它想要的东西,如指令、数据。其实,书中很大一部分就是在解决这个问题。8086的寻址能力是1M386变成了4G,相应的编程方式由实模式变成了保护模式,所谓的保护模式书中作者有很多总结,有兴趣的还是自己看的好,实模式下采用的是 :偏移址,而保护模式下则不再是这么简单,当然也并不复杂并因此引出了相应的概念,GDTLDTIDT…其实这一切都是因为IntelCPU的改进,在386之后的CPU中增加了GDT寄存器、LDT寄存器、IDT寄存器、CR0CR3寄存器、TSS寄存器(这里只列出了书中介绍的,实际情况远远不止这些)那么它的寻址方式最简单的情况下需要以下四步:

GDTR找到GDT(全局描述符表)

由加载到段寄存器(CS DS ES SS GS)中的选择子找到相应段描述符号在GDT中的偏移,实际上不考虑选择子第三位的话他就是一个偏移

然后在由找到的段描述符中段基址就找到了相应的段

再由指定的偏移就可以定位(寻址)到相应的内容

一点说明:描述符中段基址是32位(4G),它不再是段(16)<<4+偏移,而是GDTà段描述符à段基址(32)à段基址+偏移(32),这样做的目的是扩大寻址范围,而并没有体现保护模式,不过这也是第一遇到保护模式地方,那就是在描述符、选择子上做的文章了,实际上在书中描述符是通过一个汇编宏实现的,其中有一个字段是DPL,而选择子中低2位存放的是RPL,而选择子在被加载到CS中时,低2位存放的是CPLCPU在通过比较相应段的这三个权限就可以起到相应的保护规则具体是个怎么规则还是看书吧,呵呵

当然也不是说你说它是保护模式就是保护模式,我们要经过相应的步骤才能进入保护模式:准备GDTà加载GDTRà打开A20地址线àCR0PE(保护模式)位à跳转到保护模式(由16位的实模式下代码跳转到保护模式下的代码),要返回的话还要执行相应的动作。

实际上这样的寻址是在未开启页机制的情况下,它得到的是一个线性地址,在开启了页式存储机制后(CR0PG)又变成了如下机制(线性地址是由上边得到的)

 

下的LDTIDT、调用门,这些都是以此为基础,只是在相应的调用权限规则上做了一些规定,来实现‘保护’的机制,比如说特权级转移、比如说堆栈切换,而且个人感觉保护模式下的寻址就是一个间接寻址的‘完美’应用,如果给我一张现在的主流硬盘做目录就可以编址宇宙中的每一个分子呵呵,开玩笑,没算过!

好了,先写到这里,以后在补充吧!^^

本书在详细分析操作系统原理的基础上,用丰富的实例代码,一步一步地指导读者用C语言和汇编语言编出一个具备操作系统基本功能的操作系统框架。本书不同于其他的理论型书籍,而是提供给读者一个动手实践的路线图。书中讲解了大量在开发操作系统中需注意的细节问题,这些细节不仅能使读者更深刻地认识操作系统的核心原理,而且使整个开发过程少走弯路。全书共分7章。 本书适合各类程序员、程序开发爱好者阅读,也可作为高等院校操作系统课程的实践参考书。 折叠 作品目录 第1章 马上动手一个最小的"操作系统"1 1.1 准备工作1 1.2 10分钟完成的操作系统1 1.3 Boot Sector3 1.4 代码解释3 1.5 水面下的冰山5 1.6 回顾6 第2章 搭建你的工作环境7 2.1 虚拟计算机(Virtual PC)7 2.1.1 Virtual PC初体验8 2.1.2 创建你的第一个Virtual PC9 2.1.3 虚拟软盘研究12 2.1.4 虚拟软盘实战14 2.2 编译器(NASM & GCC)18 2.3 安装虚拟Linux19 2.4 在虚拟Linux上访问Windows文件夹26 2.5 安装虚拟PCDOS26 2.6 其他要素29 2.7 Bochs29 2.7.1 Bochs vs. Virtual PC vs. VMware30 2.7.2 Bochs的使用方法31 2.7.3 用Bochs进行调试33 2.7.4 在Linux上开发34 2.8 总结与回顾36 第3章 保护模式(Protect Mode)37 3.1 认识保护模式37 3.1.1 GDT(Global Descriptor Table) 42 3.1.2 实模式到保护模式,不一般的jmp45 3.1.3 描述符属性47 3.2 保护模式进阶50 3.2.1 海阔凭鱼跃50 3.2.2 LDT(Local Descriptor Table)58 3.2.3 特权级62 3.3 页式存储82 3.3.1 分页机制概述83 3.3.2 编代码启动分页机制84 3.3.3 PDE和PTE85 3.3.4 cr388 3.3.5 回头看代码88 3.3.6 克勤克俭用内存90 3.3.7 进一步体会分页机制100 3.4 中断和异常107 3.4.1 中断和异常机制109 3.4.2 外部中断111 3.4.3 编程操作8259A113 3.4.4 建立IDT116 3.4.5 实现一个中断117 3.4.6 时钟中断试验119 3.4.7 几点额外说明121 3.5 保护模式下的I/O122 3.5.1 IOPL122 3.5.2 I/O许可位图(I/O Permission Bitmap)123 3.6 保护模式小结123 第4章 让操作系统走进保护模式125 4.1 突破512字节的限制125 4.1.1 FAT12126 4.1.2 DOS可以识别的引导盘131 4.1.3 一个最简单的Loader132 4.1.4 加载Loader入内存133 4.1.5 向Loader交出控制权142 4.1.6 整理boot.asm142 4.2 保护模式下的"操作系统"144 第5章 内核雏形146 5.1 用NASM在LinuxHello World146 5.2 再进一步,汇编和C同步使用148 5.3 ELF(Executable and Linkable Format)150 5.4 从Loader到内核155 5.4.1 用Loader加载ELF155 5.4.2 跳入保护模式161 5.4.3 重新放置内核170 5.4.4 向内核交出控制权175 5.4.5 操作系统的调试方法176 5.5 扩充内核184 5.5.1 切换堆栈和GDT184 5.5.2 整理我们的文件夹191 5.5.3 Makefile191 5.5.4 添加中断处理200 5.5.5 两点说明218 5.6 小结219 第6章 进程221 6.1 迟到的进程221 6.2 概述222 6.2.1 进程介绍222 6.2.2 未雨绸缪--形成进程的必要考虑222 6.2.3 参考的代码224 6.3 最简单的进程224 6.3.1 简单进程的关键技术预测225 6.3.2 第一步--ring0→ring1227 6.3.3 第二步--丰富中断处理程序243 6.3.4 进程体设计技巧254 6.4 多进程256 6.4.1 添加一个进程体256 6.4.2 相关的变量和宏257 6.4.3 进程表初始化代码扩充258 6.4.4 LDT260 6.4.5 修改中断处理程序261 6.4.6 添加一个任务的步骤总结263 6.4.7 号外:Minix的中断处理265 6.4.8 代码回顾与整理269 6.5 系统调用280 6.5.1 实现一个简单的系统调用280 6.5.2 get_ticks的应用286 6.6 进程调度292 6.6.1 避免对称--进程的节奏感292 6.6.2 优先级调度总结300 第7章 输入/输出系统302 7.1 键盘302 7.1.1 从中断开始--键盘初体验302 7.1.2 AT、PS/2键盘304 7.1.3 键盘敲击的过程304 7.1.4 解析扫描码309 7.2 显示器325 7.2.1 初识TTY325 7.2.2 基本概念326 7.2.3 寄存器328 7.3 TTY任务332 7.3.1 TTY任务框架的搭建334 7.3.2 多控制台340 7.3.3 完善键盘处理346 7.3.4 TTY任务总结354 7.4 区分任务和用户进程354 7.5 printf357 7.5.1 为进程指定TTY357 7.5.2 printf()的实现358 7.5.3 系统调用write()361 7.5.4 使用printf()363 后记366
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值