30天自制操作系统:第6天:分割编译与终端处理

第6天:分割编译与终端处理


Makefile

首先说一下Makefile

  • $(arg) 大概相当于${arg},即预设的这个变量arg的值,像下面

    TOOLPATH = ../z_tools/
    MAKE     = $(TOOLPATH)make.exe -r
    default :
    	$(MAKE) img
    

相当于一连串的变量值的代换。

  • Makefile文件允许定义规则,来处理有相同特征(如文件类型相同等)的文件。例如
%.gas : %.c Makefile
	$(CC1) -o $*.gas $*.c

将所有的.c文件全部编译为.gas文件。

C语言头文件(*.h)

头文件中全部都是数据结构、函数声明,把用到同一个函数的程序的函数声明全都拿出来,放到一个头文件中,可以减少代码量,易于修改。

GDTR 段信息寄存器
  • GDTR的修改

GDTR修改需要特殊命令LGDT。GDTR很特殊,是个48位寄存器,低16位表示段上限,等于GDT的有效字节数-1;高32位代表GDT(global(segment) descriptor table 全局段号记录表)的开始地址。

​ LGDT [addr]

该命令把从addr开始的6字节内容放到GDTR中。

  • 段信息结构体的构成
struct SEGMENT_DESCRIPTOR {
	short limit_low, base_low;
	char base_mid, access_right;
	char limit_high, base_high;
};

段信息寄存结构体中包括:段的大小(上限)、段的起始地址、段的管理属性。

1. 段的地址用base(基址)表示,分三部分,low(2 byte),mid(1 byte),high(1 byte),按顺序向其中填入值即可。合起来正好32位。设成3段是为了让原先8086、80286上的16位程序与32位的386兼容。
2. 对32位处理器来说,最大段上限是4GB,需要用一个32位二进制数表示,则占4字节,如果把这个4字节的数直接放进结构体中,则占空间太多了,所以设计时**规定段上限用20位表示**。并且,设置标志位Gbit,当Gbit=1时,limit解释为页,1页=4KB。这样,20位相当于1M,1M*4KB=4GB,就可以表示整个内存空间了。
3. 12位段属性又称为“段的访问权属性”,程序中用变量access_right或ar表示。ar的高4位在limit_high的高4位中,ar的低8位正好保存在结构体中的access_right中,不同的8位二进制数表示不同的系统模式。如
10011010(0x9a):系统专用,可执行的段。可读不可写。
11111010(0xfa):应用程序用,可执行的段。可读不可写。

其中模式特别多,极其详细,在此不展开了。CPU到底是处于系统模式还是应用模式,取决于执行中的应用程序是位于访问权为0x9a的段,还是访问权为0xfa的段。

PIC初始化
  • PIC(programmable interrupt controller),可编程中断控制器。现在CPU设置有两个PIC,主PIC和从PIC,分别控制8个IRQ(interrupt request,中断请求),从PIC的IRQ只有通过主PIC才能传到CPU。
  • PIC中有其他寄存器,如IMR和ICW。IMR(interrupt mask register,中断屏蔽寄存器),8位分别对应8路IRQ信号,如果某一位是1,则表示屏蔽该中断。ICW(initial control word,初始化控制数据),有4个,分为ICW1~ICW4,我们大都用不上,先不记了,有点多,只说ICW2,ICW2决定了IRQ以哪一号中断通知CPU,
中断处理程序的制作
  • IRET和IRETD返回指令

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NLHskmxk-1579350741318)(C:\Users\58258\AppData\Roaming\Typora\typora-user-images\image-20200118200523519.png)]

汇编语言讲解
  • 栈的操作。一般认为Linux栈由高地址向低地址生长。

    PUSH EAX	;将EAX的值压栈
    POP EAX	;退栈,栈顶值存入EAX
    

    并且一般的,栈顶指针指向栈的最顶端元素,而不是最顶端之上的元素。

  • PUSHAD 相当于把所有的EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI全部入栈;POPAD相当于把上述所有寄存器全部出栈。

  • CPU开关中断用如下两指令控制,只有在内核模式下才能使用

    STI		;开中断
    CLI		;关中断
    

述所有寄存器全部出栈。

  • CPU开关中断用如下两指令控制,只有在内核模式下才能使用

    STI		;开中断
    CLI		;关中断
    

    执行STI,IF变为1,执行CLI,IF变为0.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值