自制操作系统
剑决浮云气
事了拂衣去,深藏功与名
展开
-
实现putchar put_str put_int
1.在lib/kernel/print.S 文件中实现put_char()2.思路①我们前面在全局描述符表GDT中定义的第三个描述符,就是我们的显存段描述符,我们往显存段中写入内容,便会输出到屏幕上。②如果接受到的这个字符是回车/换行/删除键,那么需要特殊处理③如果当前整个屏幕满了,那么需要整体往上挪一行,把最后一行空出来④默认是80*25的⑤每次都需获取光标位置,来进行接下来的操作⑥访问CRT controller寄存器组的的寄存器,先往端口地址为0x03d4的Address Registe原创 2021-12-08 14:27:18 · 521 阅读 · 0 评论 -
详解8259A
链接地址转载 2021-12-03 10:47:07 · 162 阅读 · 0 评论 -
day21保护操作系统
1.某大佬精心总结 链接2.为何要从16位实模式 进入到 保护模式①实模式下 你可以随心所欲 使用任何一块地址 ,写入任何你想写入的数据这个地址 甚至可能是OS的代码你都可以随意修改②进入到保护模式,是对内存进行了等级划分,防止你有问题的程序去破坏其他的程序 或者 OS的代码③GDT就是一个保护的例子,他限制了你的最大偏移长度,权限等3.段描述符如何实现保护模式在段描述符中,主要将有三类字段来协同参与实现保护功能:①.段限长—LIMIT。该字段规定了每个定义段的长度,比如你要跳转的程序长度超原创 2021-07-21 17:20:38 · 63 阅读 · 0 评论 -
保护模式下的INT
保护模式INT中断调用保护模式下BIOS中断已经无法再使用了,因为在保护模式下,系统会有新的IDT中断机制,实模式下INT 0xXX中断模式已经失效。但是,其实在保护模式下,INT中断指令是没有失效的。也就是说 INT 0xXX可以继续使用,只不过处理器遇到这个指令的时候,不是像在实模式下根据XX去先搜素中断向量,进而根据中断向量最终转到BIOS的中断服务程序区。它是直接去IDT区搜素中断服务程序入口,也即保护模式下的中断机制。...原创 2021-07-20 18:06:38 · 286 阅读 · 0 评论 -
F12文件系统详解
1.文件系统- 存储介质上组织文件数据的方法(数据组织的方式)文件系统示例- FAT12是DOS时代的早期文件系统- FAT12结构非常简单,一直沿用于软盘- FAT12的基本组织单位 字节(Byte):基本数据单位 扇区(Sector):磁盘中的最小数据单元 簇(Cluster):一个或多个扇区2.深入FAT12文件系统①FAT12的主引导区主引导区存储的比较重要的信息是文件系统的类型,文件系统逻辑扇区总数,每簇包含的扇区数等。主转载 2021-07-17 16:02:00 · 309 阅读 · 0 评论 -
Day15&Day16多任务和任务切换
1.多任务和任务切换,还有X86任务切换的原理都在我前面的文章中,已经写明,读者可以自行查看或百度2.多任务的结构体采用时间片轮转,优先调度①一个任务的组成Task 是由段选择子(或可以称之为任务选择子,二者没有区别,因为一个任务 就是注册在GDT/LDT中)标志位,任务优先级, 该任务的现场和他可以占用cpu的权重构成②我们所创建的多任务 是一个多级LEVEL,每个LEVEL中还分权重来决定占用CPU的时间,当高级LEVEL中有任务正在运行的时候,低级LEVEL是不能运行的,而且高级LEVEL可以原创 2021-07-16 15:51:30 · 205 阅读 · 0 评论 -
X86栈切换,任务切换
栈切换:从TSS中选取目标DPL栈,读出段选择子和ESP;–>使用选择子读取栈描述符,检查特权级,类型等;–>临时保存旧栈(当前栈)SS, ESP;(1)–>新栈选择子, ESP代入SS, ESP, 切换新栈;–>将(1)保存的旧栈SS, ESP压入新栈(保护现场);–>根据调用门描述符 ‘参数个数’,从旧栈中读出压入新栈;–>压入CS, EIP(保存现场);–>从调用门描述符中读出段选择子+偏移–>CS:IP, 开始调用;任务切换:1.中原创 2021-07-16 15:26:55 · 196 阅读 · 0 评论 -
GDT、LDT、IDTR、TR
1、现在内存管理系统都是基于页式管理的, 段式管理说白了可有可无, 那是Intel老古董阶段留下来的遗毒, 以至于Intel的硬件构架白白地复杂了. Linux kernel直接让段式管理透明.2.全局描述符表GDT(Global Descriptor Table)在整个系统中,全局描述符表GDT只有一张(一个处理器对应一个GDT),GDT可以被放在内存的任何位置,但CPU必须知道GDT的入口,也就是基地址放在哪里,Intel的设计者门提供了一个寄存器GDTR用来存放GDT的入口地址,程序员将GDT设定在原创 2021-07-06 17:04:40 · 2100 阅读 · 0 评论 -
简述RPL, DPL, CPL的区别与联系
基本概念RPL: Requested Privilege Level, 请求特权级DPL: Descriptor Privilege Level,描述符特权级CPL: Current Privilege Level,当前特权级RPL, CPL与DPL实现数据段保护DPL存在于段描述符(Segment Descriptor)中,代表着要访问当前数据或者是代码段所需要的特权等级。CPL是当前代码的特权级,RPL是你请求的特权级,简单的说,只有当max(RPL, CPL) <= DPL时,访问才转载 2021-07-06 16:53:25 · 1043 阅读 · 0 评论 -
任务状态段(Task State Segment)
1 什么是TSSTSS 全称task state segment,是指在操作系统进程管理的过程中,任务(进程/线程)切换时保存任务线程信息。任务状态段TSS的结构TSS段的最小长度为104字节,低104字节依照下列格式存放数据。在这104字节以外还可以存放I/O许可位图以及其他信息,相应增加TSS段长度。2.TSS的结构3.字段静态字段(通常不会被改变,任务创建时设置):(1) I/O位图基地址字段:I/O许可位图相对TSS开始处的16位偏移值;(I/O许可位图基址大于或等于TSS段界限,原创 2021-07-06 16:13:27 · 411 阅读 · 0 评论 -
显卡的vbe标准
原作者地址显卡的vbe标准现在的显卡几乎全部支持VESA(电子视频标准协会)制定的标准,该标准的英文全称为VESA BIOS EXTENSION,简写VBE。这个标准经过1.0、1.1、1.2、2.0、2.0 Pro、3.0的升级,目前的最高版本是3.0。制订这个标准的成员来自Intel、Matrox、Microsoft、Nvidia、Phillips、SciTech、Trident、ULSI等诸多公司或组织,也就是说它是被全面支持的,比如市面上几乎所有的PC机显卡都遵从这一标准;还有在当你安装LIN转载 2021-07-03 20:11:21 · 923 阅读 · 0 评论 -
Day13_定时器中断处理
方法:采用了一个定时器链表,按照定时时间从早到大进行排序,可加速处理的速度并且加入了一个哨兵节点,定时时间设置为0xffffffff,来简化节点插入的操作Timer.h#ifndef __TIMER_H__#define __TIMER_H__#include "fifo.h"//设定最多有500个定时器#define MAX_TIMER 500//已配置状态#define TIMER_FLAGS_ALLOC 1//定时器运行状态#define TIMER_FLAGS_US原创 2021-07-02 19:45:29 · 222 阅读 · 0 评论 -
8253(8254)计时/计数器简介
点击此处 学习转载 2021-06-29 09:50:46 · 398 阅读 · 0 评论 -
day11_界面闪烁处理
问题由于在刷新的时候,总是先刷新refresh范围内的背景图层,然后再刷新窗口图层,所以会造成闪烁,还有当鼠标设备放在窗口上面的时候,也会造成闪烁解决①pMap 一个和屏幕等大的字符数组,来存放当前屏幕的被哪些Sheet占据当我们刷新图层的时候,需要遍历图层,只有pMap中有该图层,我们才刷新,否则不刷新②每个图层都有自己的缓冲区,我们是先把要画的内容,写入缓冲区中,然后由该缓冲区写入缓存,refresh图层Sheet.h#ifndef __SHEET_H__#define __SHEET_原创 2021-06-29 09:21:48 · 61 阅读 · 0 评论 -
Day10_界面叠加处理
界面叠加处理①当我们一个界面在另外一个界面的上方,或者当我们鼠标移动到一个界面的上方,那么我们处于下面的界面必定会被覆盖,那么当上面的东西,移动走了以后,需要将下面的在修改回去②如何区分界面谁在下,谁在上?设定一个height,即高度权重,权重越大,则越高,越高则最后描绘他的图像,不就可以达到覆盖下面界面的效果了吗?③那么可想而知,鼠标肯定是最上面的那个图层,桌面肯定是最下面的图层,其余窗口的话,height肯定需要上下浮动一个图层的构成//透明图层的结构体struct SHEET{原创 2021-06-28 10:22:34 · 86 阅读 · 0 评论 -
09_挑战内存管理
新增函数Memory.h#ifndef __MEMORY_H__#define __MEMORy_H__#define EFLAGS_AC_BITS 0x00040000 //AC 在第18位#define CR0_CACHE_DISABLE 0x60000000 //禁止缓存#define MEMORY_MANAGER_FREES 4096 //大约是32KBstruct FREE_INFO{ unsigned int unAddr;//空闲区 从哪开始 unsi原创 2021-06-27 07:40:06 · 293 阅读 · 0 评论 -
CR0控制寄存器
CR0是系统内的控制寄存器之一。控制寄存器是一些特殊的寄存器,它们可以控制CPU的一些重要特性。0位是保护允许位PE(Protedted Enable),用于启动保护模式,如果PE位置1,则保护模式启动,如果PE=0,则在实模式下运行。1 位是监控协处理位MP(Moniter coprocessor),它与第3位一起决定:当TS=1时操作码WAIT是否产生一个“协处理器不能使用”的出错信号。第3位是任务转换位(Task Switch),当一个任务转换完成之后,自动将它置1。随着TS=1,就不能使用协.原创 2021-06-14 09:13:17 · 5810 阅读 · 2 评论 -
A20Gate
很多稀奇古怪的东西都是由于系统升级时,为了保持向下兼容而产生的,A20 Gate就是其中之一。在8086/8088中,只有20根地址总线,所以可以访问的地址是2^20=1M,但由于8086/8088是16位地址模式,能够表示的地址范围是0-64K,所以为了在8086/8088下能够访问1M内存,Intel采取了分段的模式:16位段基地址:16位偏移。其绝对地址计算方法为:16位基地址左移4位+16位偏移=20位地址。但这种方式引起了新的问题,通过上述分段模式,能够表示的最大内存为:FFFFh:FFFFh原创 2021-06-14 09:11:18 · 240 阅读 · 0 评论 -
进入32位保护模式之路
; haribote-os boot asm; TAB=4BOTPAK EQU 0x00280000 DSKCAC EQU 0x00100000 DSKCAC0 EQU 0x00008000 ; BOOT_INFOCYLS EQU 0x0ff0 ; 设定启动区LEDS EQU 0x0ff1VMODE EQU 0x0ff2 ; 关于颜色数目的信息 颜色的位数SCRNX EQU 0x0ff4 ; 分辨率的X SCRNY EQU 0x0ff6 ;原创 2021-06-14 09:09:43 · 197 阅读 · 1 评论 -
day07&8_鼠标动起来
键盘控制器原理①自己去看②鼠标控制也属于键盘控制器的一部分硬件图代码 io_out8(PIC0_IMR, 0xf9); /* PIC1(11111001) 开启键盘和鼠标中断设置*/ io_out8(PIC1_IMR, 0xef); /* 从芯片设置:(11101111) */keymouse.h中的宏定义,函数声明,结构体声明#ifndef __KEYMOUSE_H__#define __KEYMOUSE_H__struct MOUSE_DEC{ unsigned ch原创 2021-06-13 10:48:35 · 226 阅读 · 0 评论 -
门描述符gate descriptors
门描述符(gate descriptors)在保护模式下,中断描述符表(IDT)中的每个表项由8个字节组成,其中的每个表项叫做一个门描述符(Gate Descriptor), “门”的含义是指当中断发生时必须先访问这些“门”,能够“开门”(即将要进行的处理需通过特权检查,符合设定的权限等约束)后,然后才能进入相应的处理程序。而门描述符则描述了“门”的属性(如特权级、段内偏移量等)在IDT中,可以包含如下3种类型的系统段描述符:中断门描述符(Interrupt-gate descriptor): 用于原创 2021-06-10 11:07:18 · 444 阅读 · 0 评论 -
06_day初始化PIC
PIC可编程中断控制器(PIC - Programmable Interrupt Controller)是微机系统中管理设备中断请求的管理者。当PIC向处理器的INT引脚发出一个中断信号时,处理器会立刻停下当时所做的事情并询问PIC需要执行哪个中断服务请求。PIC则通过向数据总线发出与中断请求对应的中断号来告知处理器要执行哪个中断服务过程。处理器则根据读取的中断号通过查询中断向量表(在32位保护模式下是中断描述符表)取得相关设备的中断向量(即中断服务程序的地址)并开始执行中断服务程序。当中断服务程序执行结原创 2021-06-08 10:02:11 · 251 阅读 · 0 评论 -
GDT 全局描述符表
我们知道CPU存在实模式和保护模式的操作模式。当计算机启动后,我们进入的是实模式,而实模式的内存寻址方式是通过:段值 × 16 + 偏移 = 物理地址。这样只能具有1MB的寻址能力。如果想要更为强大的寻址能力,就必须通过一定机制,进入具有更强大寻址能力的保护模式。在保护模式下,不光提供了强大的寻址能力,还提供了内存保护,能够防止用户程序改写内核代码,并为操作系统提供了更好的硬件保障。在该模式下,有了32位的寄存器,一个寄存器就可以表示4G的地址空间,那段值加偏移这样的寻址方式是不是就不用了呢?当然不会。在原创 2021-06-05 11:01:47 · 653 阅读 · 1 评论 -
Day_05初始化GDT和IDT
初始化GDT 和 IDT//初始化GDT 和 IDTvoid Init_GDT_IDT(void){ //将0x00270000开始的地址 存放GDT表 0x270000-0x27ffff struct SEGMENT_DESCRIPTOR *pGDT_Add = (struct SEGMENT_DESCRIPTOR *) 0x00270000; //将0x0026f800开始的地址 存放GDT表 0x26f800-0x270000 struct GATE_DESCRIPTOR *pIDT原创 2021-06-05 10:54:58 · 278 阅读 · 0 评论 -
Day_05显示鼠标
鼠标的形状 存在一个二位数组之中,大小是16*16的①我们是用一个MouseColor的数组 来存储这个鼠标的颜色②鼠标自身存储在cursor数组当中void InitMouseCursor8(char *pMouseColor, char BackColor)/* 准备鼠标指针 16*16的 */{ static char cursor[16][16] = { "**************..", "*OOOOOOOOOOO*...", "*OOOOOOOOOO*....",原创 2021-06-04 16:26:50 · 85 阅读 · 0 评论 -
Day_05显示变量的值
我们用sprintf函数 把变量格式化到一个字符数组中去,然后用我们自己写的字符串输出函数,打印出来做法 char szBuf[20]; sprintf(szBuf, "nXsize = %d", nXsize); OutPutString8_ASCII(pAdd, nXsize, 8, 8, COL8_DarkRed, szBuf);运行结果...原创 2021-06-04 15:50:48 · 67 阅读 · 0 评论 -
Day_05 显示字符串
使用了OSACK字体,都保存在一个文本文件里面如何使用’extern char hankaku[4096];数据都存放在 hankaku + ‘某个字符’*16 开始的地址空间中新增函数void OutPutString8_ASCII(char *pAdd, int nLineLen,int nX, int nY, char cColor, unsigned char *pString);代码void OutPutString8_ASCII(char *pAdd, int nLineLen原创 2021-06-04 15:45:32 · 72 阅读 · 0 评论 -
day_05 显示字符A
字符A的显示用一个8*16的长方形像素点阵来表示八位是一个字节, 所以一个字符 是16个字节来存储用一个char 数组来存储static char font_A[16] = { 0x00, 0x18, 0x18, 0x18, 0x18, 0x24, 0x24, 0x24, 0x24, 0x7e, 0x42, 0x42, 0x42, 0xe7, 0x00, 0x00};字符A的输出void OutPutFont8(unsigned char *pAdd, int nLineLen,原创 2021-06-02 16:21:55 · 125 阅读 · 0 评论 -
Day_05用结构体 从内存中 读取配置信息
结构体声明struct BOOTINFO{ char cCyls; char cLeds; char cVmode; char cReserve; short sScrnx; short sScrny; unsigned char * pVram;};新增代码void HariMain(void){ unsigned char *pAdd; int nXsize ; int nYsize; struct BOOTINFO *pBootIf = (struct BO原创 2021-06-02 15:52:52 · 124 阅读 · 0 评论 -
Day04_任务条
新增代码void HariMain(void){ int i; unsigned char *pAdd = (unsigned char *)0xa0000; int nXsize = 320; int nYsize = 200; init_palette(); //设定调色板 DrawBoxFillColor8(pAdd, 320, COL8_BigGreen, 50, 50, 100,100); DrawBoxFillColor8(pAdd, nXsize, COL8_Li原创 2021-06-02 15:12:58 · 105 阅读 · 0 评论 -
Day04_绘制矩形
也就是对 0xa0000-0xaffff这段内存地址中 写入颜色所对应的数值bootpack.c中新增的代码① 对所有颜色的宏定义#define COL8_BLACK 0#define COL8_BigRed 1#define COL8_BigGreen 2#define COL8_BigYellow 3#define COL8_BigBlue 4#define COL8_BigPurple 5#define COL8_LightBrilliantB原创 2021-06-02 14:48:14 · 96 阅读 · 0 评论 -
Day_04 显示条纹 图案
static unsigned char Table_Rgb就是一个调色板 数值 就代表 一个颜色void io_hlt(void);//允许中断void io_cli(void);//关中断void io_out8(int nPort, int nData);//向端口 写入RGBint io_load_eflags(void);//获取标志寄存器void io_store_eflags(int nEflags);//恢复标志寄存器void init_palette(void);/原创 2021-06-01 17:26:59 · 90 阅读 · 1 评论 -
自制操作系统第3天
画面模式的设定 和 读取键盘状态haribote.nas; haribote-os; TAB=4; BOOT_INFOCYLS EQU 0x0ff0 ; 设定启动区LEDS EQU 0x0ff1VMODE EQU 0x0ff2 ; 关于颜色数目的信息 颜色的位数SCRNX EQU 0x0ff4 ; 分辨率的X SCRNY EQU 0x0ff6 ; 分辨率的YVRAM EQU 0x0ff8 ; 图像缓冲区的开始地址 ORG 0xc200 ;原创 2021-06-01 15:50:00 · 103 阅读 · 0 评论 -
键盘IO中断调用(INT 16)
键盘I/O中断调用有三个功能,功能号为0, 1, 2,且必须把功能号放在AH中。(1)0号功能调用 格式:MOV AH, 0INT 16H功能:从键盘读入字符送AL寄存器。执行时,等待键盘输入,一旦输入,字符的ASCII码放入AL中。若AL=0,则AH为输入的扩展码。(2)1号功能调用格式:MOV AH, 01HINT 16H功能:用来查询键盘缓冲区,对键盘扫描但不等待,并设置ZF标志。若有按键操作(即键盘缓冲区不空),则ZF=0,AL中存放的是输入的ASCII码,AH中存放输入字符的扩展码。原创 2021-06-01 15:05:58 · 849 阅读 · 1 评论 -
读取多个扇区
从柱面0 磁头0 的扇区2 读到 柱面9 磁头0 的第18个扇区完读取了10个柱面; haribote-ipl; TAB=4 CYLS EQU 10 ;定义了一个常量 ORG 0x7c00 JMP entry DB 0x90 DB "HARIBOTE" ; 启动区的名称 可以使任意字符 DW 512 ; 设置每个扇区的大小 DB 1 ; 簇的大小 也就是OS 每次对磁盘读写的 最小单元 DW 1 ; FAT的 起始原创 2021-06-01 11:04:27 · 253 阅读 · 0 评论 -
读取软盘..
参数的设置①CH 代表要读取的柱面号(磁道号)②DH 代表磁头号③CL 代表扇区号④AH 代表要执行的动作 2是读取 3 是写入⑤AL 代表要读取的扇区个数⑥DL 代表驱动器号软驱从0开始,0:软驱A,1:软驱B;磁盘从80h开始,80h:硬盘C,81h:磁盘D⑦ES:BX 代表要读入的内存地址...原创 2021-06-01 10:26:56 · 461 阅读 · 0 评论 -
day01_启动程序装载器 IPL
; haribote-ipl; TAB=4 ORG 0x7c00 JMP entry DB 0x90 DB "HARIBOTE" ; 启动区的名称 可以使任意字符 DW 512 ; 设置每个扇区的大小 DB 1 ; 簇的大小 也就是OS 每次对磁盘读写的 最小单元 DW 1 ; FAT的 起始位置 第一个扇区 0 盘 0 道 1 扇区 ;BIOS 读取该扇区的内容 并将其放置在0x7C00位置 DB 2原创 2021-05-19 11:15:38 · 507 阅读 · 4 评论 -
Day01_FAT12 文件系统
一、简介FAT12FAT12是DOS时代就开始使用的文件系统(File System),直到现在仍然在软盘上使用,FAT12软盘的被格式化后为:有两个磁头,每个磁头80个柱面(磁道),每个柱面有18个扇区,每个扇区512个字节空间。所以标准软盘的总空间为:2 * 80 *18 * 512=1474560B=1440K=1.44M二 引导区引导区就是系统盘(通常是C盘,位于整个硬盘的0磁道0柱面1扇区)上的一块区域,引导区内写了一些信息,告诉电脑应该到哪去找操作系统的引导文件。最后两个字节是0原创 2021-05-18 17:22:06 · 184 阅读 · 2 评论 -
Day01_硬盘基本知识
① 硬盘基本知识1.盘片 : 一个硬盘 可能有很多盘片组成2.盘面:一个盘片 有上下两个盘面组成3磁头 :一个盘面 拥有一个磁头4.磁道:就是一个盘面上的 同心圆的个数5.柱面:所有盘片上 磁道数相同的同心圆 组成的柱面6.扇区:就是 一个磁道 被划分成了多少块②扇区、块/簇、page的关系1.扇区: 硬盘的最小读写单元2.块/簇: 是操作系统针对硬盘读写的最小单元3.page: 是内存与操作系统之间操作的最小单元。扇区 <= 块/簇 <= page...原创 2021-05-18 17:11:30 · 131 阅读 · 0 评论