30天自制操作系统
文章平均质量分 51
kepler-moment
这个作者很懒,什么都没留下…
展开
-
第2天
org 0x7c00 ;将程序加载到此处执行jmp entry ;跳转到entry;.....;中略;.....;核心程序entry: mov ax,0 mov ss,ax mov sp,0x7c00 mov ds,ax mov es,ax mov si,msg putloop: mov al,[si] add si,1 cmp al,0 je fi原创 2013-09-18 19:58:28 · 379 阅读 · 0 评论 -
第3天 进入32位模式并导入C语言
1、读盘昨天写的IPL并没有装载程序,今天我们来写一个可以真正装载程序的IPL。我们先来看软盘结构。如图所示。一张软件有正反两面,对应读取用的磁头(0,1),而从外到内又分为80个环(0~79),称为柱面。每个柱面又分为18个扇区(1~18)。因为软盘的第一个扇区(正面的第0个柱面的第1个扇区)为启动区,所以我们读软盘的时候应该从第2个扇区开始读。org 0x7c00jmp原创 2013-09-22 17:08:55 · 1114 阅读 · 0 评论 -
第4天 C语言与画面显示的练习
1、利用汇编来理解指针mov [0x7cff],12我们知道,上面这条语句是无法通过编译的,因为在指定内存时,不知道到底是BYTE、WORD、还是DWORD,所以我们要将其改成mov byte [0x7cff],12我们是这样来定义指针的:int *p;p = 0xa0000;*p = 12;int是4字节,那么p = 0xa0000就相当于mov原创 2013-09-27 15:28:23 · 592 阅读 · 0 评论 -
第5天 结构体、文字显示与GDT/IDT初始化
1、分段GDT,IDT都是与CPU有关的设定。为了让操作系统能够使用32位模式,需要对CPU做各种设定。在汇编语言中,有一个指令叫做org。它指定了程序要装载的地址,而当CPU读到这段地址时,程序便会运行。现在的操作系统能同时运行多个程序,但如果出现内存的使用范围重叠了怎么办?必须让某个程序放弃执行,同时报出一个“内存冲突”的错误。但实际上是有某种方法能解决这个问题的。这个方法就是分段。原创 2013-10-13 14:14:07 · 915 阅读 · 0 评论 -
第6天 分割编译与中断处理
今天我们来详细了解一下段结构体的各个属性及几个函数。struct SEGMENT_DESCRIPTOR{ short limit_low, base_low; char base_mid, access_right; char limit_high, base_high;};结构体SEGMENT_DESCRIPTOR就是段描述符,保存了段的基址,上限,权限等。各个属性的排列顺原创 2013-10-13 18:36:52 · 562 阅读 · 0 评论 -
第9天 内存管理
内存管理有内存分配和内存释放两部分。我们假设现在有128M内存可以使用,且将这些内存分块,每块为4KB,那么,共有32768个块。书中列举了两种方法来管理这些块。1、用char table[32768]来保存内存的分配情况,如果第i块用了,则char[i] = '1',否则为'0'class MEMBLOCKS{private: static const unsigned i原创 2013-10-18 18:53:27 · 494 阅读 · 0 评论 -
第1天
启动区(boot sector):软盘的第一个扇区称为启动区。计算机读写软盘的时候,并不是一个字节一个字节地读写的,而是以512字节为一个单位进行读写。因此,软盘的512字节就称为一个扇区。那为什么第一个扇区称为启动区呢?因为计算机首先从最初的一个扇区开始读软盘,然后去检查这个扇区最后2个字节的内容。如果最后2个字节不是55AA,计算机会认为这张盘上没有所需要的启动程序,就会报一个不能启动的错误。原创 2013-09-14 14:24:27 · 808 阅读 · 0 评论