zoukankan      html  css  js  c++  java
  • 6_30天自制操作系统第6天心得体会

    回顾第五天的GDT和IDT,之前不是很懂这个GDT,IDT,在这一章节的学习后,对第5天的知识进行一个补充。

    GDT:全局段号记录表

    分段:将4G的内存分成一块一块的,每一块的起始地址都可以当做0来处理。像这样分出来的块,就叫做段。

    表示一个段所需要的信息:段的大小,段的起始地址,段的管理属性(禁止写入,禁止执行,系统专用等)

    CPU用8个字节来表示这些信息。

    我们可以分成8192个段,段号是0-8191.因为段寄存器是16位的,所以能处理0-65535范围的数,但是由于CPU设计的原因,段寄存器的低三位不能使用。

    表示8192个段,共需要8192*8Byte = 64kb。这64KB的数据就是GDT。

    GDT是全局段号记录表。将这些数据整齐地排列在内存的某个地方,然后将内存的起始地址和有效设定个数放在CPU内被称作GDTR的特殊寄存器里面。

    IDT是中断记录表

    IDT记录了0-255的中断号码与调用函数的对应关系。

    (注意,必须先设定GDT,然后再设定IDT)

    分割编译与中断处理

    1.分割源文件

    分割多个源文件的好处是调理更清晰,但是有时候会添加多余的函数声明。

    2. 整理Makefile

    相同的编译规则就制定一个一般规则,譬如说:

    以下三个编译规则,除了文件名不一样,其余一样,风格简直一样。

    所以,我们可以简化成:

    注意make.exe的编译规则,一般make.exe先找普通规则,然后是一般规则。普通规则优先级更高。

    3.整理头文件

    使用头文件,这个大家C语言都学过,把变量和函数的声明 都放在一个头文件里面。

    只需要主要头文件的两个写法,一个是<>,一个是"",<>表示的头文件在编译器所提供的文件夹下,“”表示头文件与源文件在同一个目录下。

    4.意犹未尽

    1 _load_gdtr:
    2         MOV AX,[ESP+4];
    3         MOV [ESP+6],AX;
    4         LGDT [ESP+6]
    5 RET

    代码的含义:

     

    注意gdtr寄存器是一个48的特殊寄存器,低16位用来保存段上线,高32位保存段的起始地址。

    为了表示4G内存,我们使用了分页,1P=4KB,通过Gbit位来表示,为1表示段上限的单位是页,为0表示为Byte。

    AR寄存器我们认为是16位,高4位放在limit_high的高4位处,低8位含义如下:

    5.初始化PIC

    对于CPU来说,PIC是外部设备,所以CPU使用OUT指令进行操作PIC中的寄存器。

    下面简单介绍PIC中的寄存器:

    IMR:中断屏蔽寄存器,为1时屏蔽中断。

    ICW:初始化控制数据,每一个PIC有4个ICW寄存器。

    ICW1,ICW4与PIC的主板配线方式,中断信号的电气特性有关;

    ICW3:设定主从PIC的连接;

    ICW2:设定终段号。

    6.中断处理程序的制作

    将键盘挂在主pic的1号中断,中断即为21号,将鼠标挂在从PIC的12号中断,中断号为2c。

    调用中断程序的汇编代码:

    中断服务程序:

    补充几条汇编指令:

    PUSH,POP,PUSHAD;

     

     

     

  • 相关阅读:
    我要好offer之 二叉树大总结
    我要好offer之 字符串相关大总结
    楼层扔鸡蛋问题[转]
    Linux System Programming 学习笔记(十一) 时间
    Linux System Programming 学习笔记(十) 信号
    Linux System Programming 学习笔记(九) 内存管理
    Linux System Programming 学习笔记(八) 文件和目录管理
    Linux System Programming 学习笔记(七) 线程
    Linux System Programming 学习笔记(六) 进程调度
    APUE 学习笔记(十一) 网络IPC:套接字
  • 原文地址:https://www.cnblogs.com/OathKeeper/p/7755768.html
Copyright © 2011-2022 走看看