OS
Geek-zhu
这个作者很懒,什么都没留下…
展开
-
INT 15h AX=E820h的用法
简单来说,每执行一次这个指令将会将一个描述内存区域的数据结构保存到ES:DI,然后返回一个ebx,用于确定下一个能够探测的内存区域,当ebx=0时,表示当前已经时最后一个内存区域了。那么ebx的初始值呢,就是设置成ebx=0。其中可能遇到检查发生错误的情况,这个指令就会直接将CF设置为1。 下图时输入时各个寄存器的作用: 寄存器 作用 eax 功能码,当输入e820h时能够探测内存 ebx 主要用于指向内存区域,第一次调用时ebx=0,被称为continuation value es原创 2020-08-30 15:16:00 · 1189 阅读 · 0 评论 -
30天自制操作系统-第10天 harib09d 关于sheet_refreshsub的详细解释
隔了几天没做实验了,在看sheet_refreshsub的时候,源码还是很明白,但是后面有点不太清楚。所以把自己的理解放上来。 这个sheet图层恰好满足那四种情况,以(sht->vx0,sht->vy0)为起点边长分别为bxsize,bysize,图中以(vx0,vy0)到(vx1,vy1)是要刷新的范围, 简而言之,就是去掉与当前图层无关的刷新范围,如果如果当前图层起点(x坐标或y坐标)在刷新范围(大矩形框)内,将刷新范围的起始点(对应x坐标或y坐标)从(vx0,vy0)移动到图层的的起始原创 2020-07-10 01:30:46 · 197 阅读 · 0 评论 -
30天自制操作系统-第9天 harib06d 图解内存释放
其实还是比较简单的,只是纯代码可能不好理解,加上图片就好理解了 情况1(左部合并) 要释放的内存块(绿色内存区域)左边是空闲的,就将它和左边合并,由于没有内存块数量的变化,就不需要移动内存块,对应的代码部分如下 if (i > 0) { /* 前がある */ if (man->free[i - 1].addr + man->free[i - 1].size == addr) { /* 前のあき領域にまとめられる */ man->free[i - 1].size原创 2020-07-02 10:35:02 · 165 阅读 · 0 评论 -
30天自制操作系统-第8天 harib05c 关于鼠标3字节数据的详细解释
问题 在做这个实验的时候,发现作者在文中介绍的鼠标数据信息不太详细,有一部分代码似懂非懂,但又没有找到具体的教程,经查询资料,终于得到解决,现在放上来方便大家。 背景介绍 在自制操作系统中使用的是PS/2鼠标,而一开始我在网上查询到的是USB的4字节信息,虽然读着好像差不多,还是有点不放心,后来发现PS/2鼠标数据包刚好是3字节。 PS/2鼠标介绍 实际上,PS/2鼠标有很多模式,包括Reset,Stream,Remote,Wrap模式,除此之外微软还提供了Intellimouse扩展,但是我们实际只需要关原创 2020-07-01 19:44:43 · 329 阅读 · 0 评论 -
30天自制操作系统-第7天 harib04f 无法读取键盘
30天自制操作系统-第7天 harib04f 无法读取键盘第7天 harib04f 运行截图原因1原因之二 第7天 harib04f 运行截图 在CMD中执行了make run之后 ,运行截图如上,虽然执行了鼠标中断void inthandler2c(int *esp),显示了“INT 2C (IRQ-12) : PS/2 mouse”,但是这时候你会发现之前的键盘中断不能用了。 原因1 在void inthandler2c(int *esp) 的源码中,有个无限for循环,所以一旦执行了这个鼠标中断,原创 2020-06-30 20:14:36 · 277 阅读 · 0 评论