30天自制操作系统笔记

注意:第八天之后才开始动手写程序,要将之前的运算过程添加到后面

开发操作系统,步骤:
1 在Windows或其他系统上编写源代码
2 用C语言编译器编译源代码,生成机器语言文库
3 对机器语言文件进行加工,生成软盘映像文件
4 对映像文件写入磁盘,做成含操作系统的启动盘

启动区 软盘的第一个扇区(扇区为512个字节)叫做启动区。计算机从最初一个扇区开始读软盘,最后去检查这个扇区最后两个字节的内容,如果不是55AA,就会认为这张盘上没有所需的启动程序。

IPL 启动程序加载器

16位寄存器
ax accumulator 累加寄存器
cx counter 计数寄存器
dx data 数据寄存器
bx base 基址寄存器
sp stack pointer 栈指针寄存器
bp base pointer 基址指针寄存器
si source index 源变址寄存器
di destination index 目的变址寄存器

8位寄存器
al accumulator low 累计寄存器低位
cl
dl
bl
ah
ch
dh
bh

段寄存器(16位)
ES --没有名称 extra segment
CS --代码段寄存器 code segment
SS --栈段寄存器 stack segment
DS --数据段寄存器 data segment
FS --没有名称 segment part 2
GS --没有名称 segment part 3

ORG 指令,告诉汇编程序,开始执行时将某段机器语言装在到内存的哪个地址,由于不是汇编的直接指令,故称为伪指令
例:
RESB 0x1fe-$ 填写0x00,直到0x001fe

ORG 2000H 告诉编译器这里偏移直接调转到2000H

/*磁盘读,写,扇区检验(verify),寻道(seek)
AH=0X02;读磁盘
AH=0X03;写磁盘
AH=0X04;校验
AH=0X0C;寻道
AL=处理对象的扇区数;(只能同时处理连续的扇区)
CH=柱面号&0xff;
CL=扇区号(0-5位)|(柱面号&0x300)>>2;
DH=磁头号;
DL=驱动器号;
ES:BX=缓冲地址;(校验及寻道时不使用)

FLAGS.CF0:没有错误,AH0
FLAGS.CF==1:有错误,错误号码存入AH内(与重置(reset)功能一样)

(取反、左移、按位与、按位异或、按位或)优先级由高到低的顺序排列为
取反 > 左移 > 按位与 > 按位异或 > 按位或。
1、~:意思是按位取反,类似于非(!)的关系,取它的反面。
2、<<: 意思是左移,移动二进制的位。
3、& : 意思是按位与,类似于与(&&)的关系,一假为假。
4、^:意思是按位异或,通俗地说就是相同为0,不同为1.
5、|:意思是按位或,类似于或(||)的关系,一真为真。

1位寄存器 标志
CH 柱面号
CL 扇区号
DH 磁头号
DL 驱动器号

1张软盘有80个柱面,2个磁头,18个扇区,一个扇区512个字节
软盘容量 80218*512=1440 KB
含有IPL的启动区,位于C0-H0-S1(柱面0,磁头0,扇区1)

系统复位:
AH=0X00,DL=0X00,INT=0X13;
*/

一般向一个空软盘保存文件时
1 文件名会写在0x002600以后的地方
2 文件的内容会卸载0x004200以后的地方

设置显卡模式
AH=0X00;
AL=模式
0x03:16字符模式,8025
0x12:VGA图形模式,64
4804位彩色模式,独特的4面存储模式
0x13:VGA图形模式,320
2008位彩色模式,调色板模式
0x6a:扩展VGA图形模式,800
600*4位彩色模式,独特的4面存储模式
返回值:无

char *p; 用于BYTE类地址
short *p; 用于WORD类地址
int *; 用于DWORD类地址

处理颜色问题
320*200的8位颜色模式,色号使用8位(二进制)数,即0-255
常用颜色网络编码
#000000:黑
#00ffff 浅亮蓝
#000084 暗蓝
#ff0000 亮红
#ffffff 白
#840084 暗紫
#00ff00 亮绿
#c6c6c6 亮灰
#00848484 浅暗蓝
#ffff00 亮黄
#840000 暗红
#848484 暗灰
#0000ff 亮蓝
#008400 暗绿
#ff00ff 亮紫
#848400 暗黄

//CPU与内存,键盘,网卡,声卡,软盘等外部设备都有连接
汇编语言对应指令
向设备发送电信号 OUT
从设备取得电气信号 IN指令
INT 中断指令
INTO 溢出中断
IRET中断返回
HLT 停机
STI 中断标志置1指令
CLI 中断标志置0指令
PUSHFD push flags double-word 将标志位的值按双字长入栈

video DA converter
1调色板的访问步骤。
1首先在一连串的访问中屏蔽中断(如CLI)
1将想要设定的调色板号码写入0x03c8,紧接着,按照R,G,B的顺序写入0x03c9。如果想继续设定下一个调色板,则省略调色板号码,再按照RGB顺序写入0x03c9。
1如果想读出当前调色板状态,要将调色板的号码写入0x03c7,再从0x03c9读取3次,读出的顺序就是R,G,B.如果要继续读出下一个调色板,同样省略调色板号码的设定,按RGB的顺序读出
1如果最初执行了CLI,那么最后要执行STI

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

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

ar表示段的属性,共16位
xxxx0000xxxxxxxx(其中x为0/1)
00000000(0x00)未记录的记录表
0x92 系统专用,可读写的段,不可执行
0x9a 系统专用,可执行的段,不可读写
0xf2 应用程序用,可读写的段,不可执行
0xfa 应用程序用,可执行的段,可读不可写

PIC programmable interrupt controller 可编程中断控制器
将8个中断信号集合成一个中断信号的装置
主pic,处理0-7号中断信号 pic0
从pic,处理8-15号中断信号 pic1

pic的寄存器都为8位寄存器
IMR interrupt mask register 中断屏蔽寄存器 对应8路IRQ信号,某位为1代表对应IRQ信号被屏蔽,就忽略该路信号;
ICW initial control word 初始化控制数据,有4个,共有4个字节的数据;
对不同OS进行独特设定的是ICW2,决定IRQ以哪一种中断方式通知CPU

IRQ12 鼠标
IRQ1 键盘

段的大小;
段的起始地址;
段的管理属性(禁止写入,禁止执行,系统专用)

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

保护模式:操作系统受到CPU的保护;应用程序既不能随便改变段的设定,又不能使用操作系统专用的段;

memcpy(转送源地址,转送目的地址,转送数据的大小)
转送数据大小是以双字为单位的,故用字节数/4
memcpy(bootpack,BOTPAK,512*1024/4)
从bootpack的地址开始的512KB内容复制到0x00280000号地址去

纸娃娃系统内存分布图
0x00000000-0x000fffff 虽然在启动中会多次使用,但之后就变空 1MB=220=165
0x00100000-0x00267fff 用于保存软盘的内容(1440KB)
0x00268000-0x0026f7ff 空(30KB)
0x0026f800-0x0026ffff IDT(2KB)
0x00270000-0x0027ffff GDT(64KB)
0x00280000-0x002fffff bootpack.hrb(512KB)
0x00300000-0x003fffff 栈及其他(1MB)
0x00400000- 空

结构体赋值
示例:
man->free[i].addr=man->free[i+1].addr;
man->free[i].size=man->free[i+1].size;
归纳为
man->free[i]=man->free[i+1];

将函数分类时,
从bootpack.c分到其他.c文件中
1 修改bootpack.h
2 将原.c文件中函数删除
3 将相应结构体或 define的宏定义的写入.h文件
4 将对应的obj文件添加到Makefile中

建立.c文件:
1 写入#include"bootpack.h"
2 将对应的函数写入.h文件中

在naskfunc.nas文件中写入函数后,
注意确定naskfunc.nas函数是否写入GLOBAL,EXTERN中
确定是否在.h文件中写入相关信息

IRQ0的中断周期变更:
AL=0X34:OUT(0X43,AL);
AL=中断周期的低8位;OUT(0X40,AL);
AL=中断周期的高8位;OUT(0X40,AL);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值