BINBIN Blog

Thinking will not overcome fear but action will.

Orange'S:一个操作系统的实现

中断和异常机制

中断和异常 int 15h是BIOS中断处理函数,是在实模式下调用的!在保护模式下显示出来的。 因为在保护模式下中断机制发生了很大的变化,原来的中断向量表已经被IDT 所代替,实模式下能用的BIOS 中断在保护模式下已经不能用了。 这个IDT 是新的东东,之前没有讲到。猜测是跟GDT 、 LDT 应该有相似的东西。 这个也是描述符表,叫做中断描述符表(interrupt Descrip...

Orange'S:一个操作系统的实现

体会分页机制

克勤克俭用内存 分页的益处其实体现在多个方面,以下举例,先有个初步认识! 如果你写一个程序(在linux 或者windows下面均可),并改个名字复制一份,然后同时调试,你会发现,从变量地址到寄存器的值,几乎全部都是一样的! 而这些“一样的”地址之间完全不会混淆起来,而是各自完成自己的职责。这就是分页的功劳!下面模拟一下这个效果! 先执行某个线性地址处的模块,然后通过改变cr3来转换地...

Orange'S:一个操作系统的实现

页式存储

什么是页 所谓页,就是一块内存,在80386中,页的大小是固定的4096字节(4KB),在Pentium中,页的大小还可以是2MB 或者 4 MB,并且可以访问到多于4GB 的内存,这个超出我们讨论范畴! 只讨论页大小为4KB! 逻辑地址、线性地址、物理地址 在未打开分页机制的时候,线性地址等同于物理地址,于是可以认为,逻辑地址通过分段机制直接转换成物理地址。但当分页开启时,情况发生变...

Orange'S:一个操作系统的实现

克勤克俭内存

克勤克俭用内存 前面程序中,用4MB 得空间来存放页表,并用它映射了4GB的内存空间,而我们的物理内存不见得这么大,如果仅仅是对等映射的话,16MB 的内存主要4个页表就够了(一个页表项是4字节 ,有二级页表有1024个表项,每一个表项是对应一个物理页4k的,所以一个页表映射4MB,4个页表映射16MB,注意这个指的是映射空间,一个页表本身占用的4字节乘以 1024 = 4096字节)!所...

Orange'S:一个操作系统的实现

保护模式-调用门特权级转移实践

调用门特权级转移实践 前一章节增加了ring3的代码,这个是低特权级。该章实验调用门的使用,将调用门的描述符和选择子以及[SECTION .ring3]的代码修改一下! 代码对比如下: 可以看出,将调用门的描述符和段选择子都设置权限3! LABEL_CALL_GATE_TEST: Gate SelectorCodeDest, 0, 0, DA_386CGate+D...

Orange'S:一个操作系统的实现

保护模式-堆栈

堆栈 复习长跳转和短跳转,如果调用或者跳转指令实在段间而不是段内进行的,称之为长 far jmp/call , 反之,如果在段内则是短的 near jmp / call ! 那长的和短的 call 或者jmp 有什么分别? 对于jmp,仅仅是结果不同罢了,短跳转对应段内,而长跳转对应段间; 而call则稍微复杂些,因为call 指令会影响堆栈的,长调用和短调用对堆栈的影响是不同的! ...

Orange'S:一个操作系统的实现

保护模式-特权级转移

一致代码段 和 非一致代码段 系统要安全,必须保证内核与用户程序分离开,内核要安全,必须不能被用户来打扰。但是有的时候,用户程序也是需要访问内核中的部分数据,那怎么办? 于是操作系统就将内核中的段分为共享的代码段和非共享的代码段两部分。 其中一致代码段就是操作系统拿出来被共享的代码段,可以被低特权级的用户直接访问的代码。 一致代码段的限制作用: (1)特权级高的代码段不允许访问特权级低的...

Orange'S:一个操作系统的实现

保护模式-特权级

特权级 IA32 的分段机制中,总共有4个特权级别,从高到低分别是0、1、2、3。数字越小表示的特权级别越大! 核心的代码和数据,一般都放在特权级别较高的层次。处理器用这个样的机制来避免低特权级的任务在不被允许的情况下访问位于高特权级的段!如果处理器检测到一个访问请求时不合法的,将会产生常规保护错误(#GP)。 一般讲高特权级称作内层,把低特权级称作外层! 前面介绍的描述符里面有...

Orange'S:一个操作系统的实现

保护模式进阶LDT

保护模式进阶LDT 之前讲述了进入保护模式显示字符串和返回dos的步骤! LDT与GDT是差不多的,区别在于 全局(Global)和局部(local). LDT表存放在LDT类型的段之中,此时GDT必须含有LDT的段描述符; LDT本身是一个段,而GDT不是。 查找GDT在线性地址中的基地址,需要借助GDTR;而查找LDT相应基地址,需要的是GDT中的段描述符。访问LD...

Orange'S:一个操作系统的实现

保护模式进阶

保护模式进阶 之前讲述了进入保护模式的步骤! 复习一下: 定义GDT 用lgdt 加载 gdtr 打开A20 地址线 设置CR0 寄存器PE位为1 执行跳转,进入保护模式 在保护模式下,我们能访问4G 的内存! 所以试验一下读写大地址内存! 思路: 新建一个段,以5mb为基址,这个远超出1MB 的界限了。 先读出开始处8字节的内容,然后写入一个字符串,再从中...