随笔分类 -  自己动手写操作系统

跟着一本好书《自己动手写操作系统》去学习系统底层,写操作系统一直是我的梦想
摘要:保护模式中最重要的一个思想就是通过分级把代码隔离了起来,不同的代码在不同的级别 ,使大多数情况下都只和同级代码发生关系。 Intel的80286以上的cpu可以识別4个特权级(或特权层),0级到3级。数值越大特权越小。一般用把系统内核放在0级,系统的其他服务程序位于1、2级,3级则是应用软件。一般情况下代码都在自己的级别下做自己的工作,同一级别之间可以相互访问,而一般是不允许不同级别的代码间随意访问的。但有时候不同级别的程序之间一定要访问,比如系统的接口函数等,必须能够使得应用程序能够随意调用。于是Intel将代码分为:1.非一致码:受到隔离的代码,只能在同一级别间相互访问2.一致码:不受到隔 阅读全文
posted @ 2010-11-27 19:40 云说风轻 阅读(4252) 评论(1) 推荐(0)
摘要:%macroDescriptor3;有三个参数:【段界限】、【段基址】、【段属性】dw%2&0FFFFh;段界限1(2字节)dw%1&0FFFFh;段基址1(2字节)db(%1>>16)&0FFh;段基址1(1字节)dw((%2>>8)&0F00h)|(%3&0F0FFh);属性1+段界限2+属性2(2字节)db(%1>>24)&0FFh;段基址2(1字节)%endmacro;共8字节看似很简单的结构体理解起来可不是那么简单!【Descriptor结构体】有8个字节。1、【第1、2字节】组合(word)表示该段 阅读全文
posted @ 2010-11-27 18:50 云说风轻 阅读(733) 评论(1) 推荐(0)
摘要:依旧是第三章,看的好慢哦,其实从实模式跳转到保护模式还是很好懂得,主要注意就是跳转指令jmp dword SelectorCode32:0 //而不能是 jmp SelectorCode32:0 因为这时编译出来的是16位代码。如果目标地址的偏移不是0,而是一个较大的值,比如jmp SelectorCode32:0x12345678 则编译后偏移会被截断,只剩下0x5678。 所以,这个特殊的跳转需要特殊的处理。在Linux内核中(Linux使用的是AT&T汇编,不是一般常见的IBMPC汇编),这个跳转是用DB指令直接写二进制代码的方法实现的,而NASM显然提供了更好的解决方法,就.. 阅读全文
posted @ 2010-11-27 16:45 云说风轻 阅读(1361) 评论(0) 推荐(0)
摘要:在《一个操作系统的实现》一书的第三章,两个代码段代码写着写着用就用了align 32,写着写着又不用了,无若我那可怜的汇编功底,压根没见过这是什么指令…… 实际上 align是个负责内存对齐的宏,它会补充一些数据以便下面的数据对齐。align 32 //会被展开成类似 times (((32) - (($-$$) % (32))) % (32)) nop 它就是为了数据对齐的。你使用影响对齐的数据类型后就需要用align填充一下,以便后面的数据可以对齐到边界上。 至于在这里的作用,段首最好是32字节对齐的。不过也不是必须。实模式每段是64kb大小,段寄存器中保存的是地址的高16位,i... 阅读全文
posted @ 2010-11-27 16:07 云说风轻 阅读(438) 评论(0) 推荐(0)
摘要:从昨天起深陷《一个操作系统的实现》这个书不能自拔,这本书可以说再次燃起了我小时候想写操作系统的美好愿望,所以说愿望总是美好的,还进入了大学开始真正去学计算机才发现似乎写操作系统是和我没什么关系的神话,也许还是Linux那孩子太牛叉了吧。 好吧,实现愿望从昨天开始…… 只是虽然本书开始时说学习《一个操作系统的实现》只需要一些C和汇编的知识,但是很遗憾,作者在部分地方写的很不详细,一笔带过,这使阅读本书的我苦恼不已,也许还是我水平太菜了吧。这里这本书我一定一定坚持读下去,遇到问题坚决不放过,百度到可信的答案直至读懂为止,并转贴到本博客,百度或谷歌不到答案的,也必然亲自研究至问题解决未知。比如:《. 阅读全文
posted @ 2010-11-27 15:59 云说风轻 阅读(518) 评论(0) 推荐(0)
摘要:段机制轻松体验 内存寻址: 实模式下的内存寻址: 让我们首先来回顾实模式下的寻址方式 段首地址×16+偏移量 = 物理地址 为什么要×16?因为在8086CPU中,地址线是20位,但寄存器是16位的,最高寻址64KB,它无法寻址到1M内存。于是,Intel设计了这种寻址方式,先缩小4位成16位放入到段寄存器,用到时候,再将其扩大到20位,这也造成了段的首地址必须是16的倍数的限制。 公式:xxxx:yyyy 保护模式下分段机制的内存寻址: 分段机制是利用一个称作段选择符的偏移量,从而到描述符表找到需要的段描述符,而这个段描述符中就存放着真正的段的物理首地址,再加上偏移量 一 阅读全文
posted @ 2010-11-27 13:19 云说风轻 阅读(642) 评论(0) 推荐(0)
摘要:书本第三章第一节是《认识保护模式》,初步讲解了保护模式下全局描述符表GDT、段描述符、段选择子、从实模式进入保护模式等内容。去年看这个的时候,如果不是有以前学习保护模式时做的笔记,还真不好懂呢,因为作者提供的材料不够系统,对仅学习过8086汇编语言的人来说,是不太好理解的。下面的内容大体以我以前做的笔记为纲,较为简略,只说明要点。(本来还可以参考下以前学习保护模式时收集的资料的,很可惜,移动硬盘坏了,资料都没有了,早就该注意信息安全了的。)描述符与描述符表 8086是16位处理器,有16位的寄存器和数据总线,20位的地址总线,寻址能力为1MB。地址由段基址和段偏移两部分组成,段基址和偏移地址都 阅读全文
posted @ 2010-11-27 13:18 云说风轻 阅读(1630) 评论(0) 推荐(1)