30天制作操作系统第5天

30天制作操作系统第五天

这是一个菜鸡为了学习操作系统来练习写的操作系统,参照于书籍《30天自制操作系统》。
相关程序已经放到GitHub中,如果我的能力到位我可能会在这个操作系统的基础上进行添加及优化,作者已经把所有东西都做到极致了,我能做的很少,我只能把自己分析学习的文章总结出来。因为自己能力可能不到位,可能会有些错误希望大家理解,发到这里更多的原因的起到记录作用,如果以后的我回看我写的文章有错误,我会进行修改,同时也希望大家互相学习。
相关项目及源码已经放到GitHub中:https://github.com/Most3R-03/Simple-Operating-System

今天我们继续分析naskfunc.nas的_load_gdtr函数:
在这里插入图片描述
这个函数用来来将指定的段上限(limit)和地址值赋值给名为GDTR的48位寄存器。
这是一个很特别的寄存器,不能用我们常用的MOV指令赋值,唯一的方法是指定一个内存地址,从指定的地址读取6个字节也就是48位(68=48)然后赋值给GDTR寄存器,利用LGDT命令来赋值。
为什么是ESP+6?
最初执行到这个函数的时候,ESP+4里存放的是段上限,ESP+8里存放的是地址。具体到实际的数值,就是0x0000ffff和0x00270000.把他们按字节写出来的话就成了[FF FF 00 00 00 27 00]的样子,所以就先用”MOV AX,[ESP+4]”,读取最初的0xffff,然后再写道[ESP+6]中,这样结果就成了”FF FF FF FF 00 27 00 00”,如果从ESP+6开始读6字节的话正好是我们想要的结果。
数值在内存中的排列:
FFFF0000 00002700
低—>高(低位放在内存地址小的一端(低位即数的右端))
AX寄存器为16位,所以在读取ESP+4的时候只能读取到FFFF
执行完MOV [ESP+6],AX之后
FFFFFFFF 00002700
↑esp+4为最前面
读到寄存器应该是 00 27 00 00 FF
接下来是dsctbl.c里的set_segmdesc函数
在这里插入图片描述
这个函数是按照CPU的规格,将段的信息归结为8个字节写入内存的。
主要有以下三点:
段的大小
段的起始位置
段的管理属性(禁止写入、禁止执行、系统专用等)
为了写入这些信息,我们准备了struct SEGMENT_DESCRIPTOR结构体
在这里插入图片描述
在结构体里base又氛围low(2字节),mid(1字节),high(1字节)三段。合起来刚好是32位。
我百度了一下该芯片,得知80286的地址总线是24位,3个字节,所以适用386芯片的代码low的2字节加上mid的1字节刚好可适用于80286系统
程序中使用了移位运算符和AND运算符往各个字节里填入相应的数值。
之所以要分为3段,主要是与80286时代的程序兼容。有了这样的规格,80286用的操作系统可以不用修改就在386以后的cpu上运行了。
段上限最大为20位也只能指定到1m
工程师将limit的单位解释为页,1页=4kb,所以最大地址可以指定到1m
4k=4gb
ar低八位:
在这里插入图片描述
初始化PIC(可编程中断控制器)

中断之前我们除了需要初始化IDT和GDT,我们还要初始化PIC。
PIC:可编程中断控制器。它是将多个中断信号集合成一个中断信号的装置,PIC检测着输入管脚的多个中断信号,只要有一个中断信号过来,就将唯一的输出管脚信号变成ON,并通知给CPU。
PIC硬件结构:与CPU直接相连的PIC为主PIC,与主PIC相连的PIC称为从PIC。其中从PIC通过第2号IRQ与主PIC相连。(主PIC不通知给cpu,从pic也无法通知cpu)。
在这里插入图片描述
从cpu的角度来说,PIC是外部程序,所以CPU使用OUT命令进行操作。

首先介绍一下PIC的寄存器。他们为8位寄存器–>中断屏蔽寄存器。
8位分别对应8路IRQ信号,如果某一位是1,那么该位所对应的IRQ信号被冰壁,PIC就忽视该信号。
禁止中断的原因:
a、防止在对中断设定的更改时,其他中断引起混乱;
b、没有连接设备时,静电干扰引起反应,导致系统混乱。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值