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;

     

     

     

  • 相关阅读:
    Linux进程间通信(IPC)
    mq_setattr
    mq_getattr
    mq_unlink
    mq_receive
    mq_send
    mq_close
    POSIX消息队列
    mq_open
    C语言关键字
  • 原文地址:https://www.cnblogs.com/OathKeeper/p/7755768.html
Copyright © 2011-2022 走看看