自己动手制作操作系统
nwindows吧
全部回复
仅看楼主
level 11
首先要明确处理器(也就是CPU)控制着计算机。对PC而言,启动的时候,CPU都处在实模式状态,相当于只是一个Intel 8086处理器。也就是说,即使你现在拥有一个奔腾处理器,它的功能也只能是8086级别。从这一点上来讲,可以使用一些软件把处理器转换到著名的保护模式。只有这样,我们才可以充分利用处理器的强大功能。
编写操作系统开始是对BIOS控制,取出存储在ROM里的程序。BIOS是用来执行POST(Power On Self Test,自检)的。自检是检查计算机的完整性(比如外设是否工作正常、键盘是否连接等)。这一切完成以后,你就会听到PC喇叭发出一声清脆的响声。如果一切正常,BIOS就会选择一个启动设备,并且读取该设备的第一扇区(即启动扇区),然后控制过程就会转移到指定位置。启动设备可能是一个软盘、光盘、硬盘,或者其它所选择的设备。在此我们把软盘作为启动设备。如果我们已经在软盘的启动扇区里写了一些代码,这时它就被执行。因此,我们的目的很明确,就是往软盘的启动扇区写一些程序。
首先使用8086汇编来写一个小程序,然后将其拷贝至软盘的启动扇区。为了实现拷贝,要写一个C程序。最后,使用软盘启动计算机
2014年12月08日 09点12分 1
level 11
把程序写至启动扇区
下面写一个C程序,把我的操作系统写入软盘第一扇区。程序内容如下:
#include <sys/types.h> /* unistd.h 需要这个文件 */
#include <unistd.h> /* 包含有read和write函数 */
#include <fcntl.h>
int main()
{
char boot_buf[512];
int floppy_desc, file_desc;
file_desc = open("./boot", O_RDONLY);
read(file_desc, boot_buf, 510);
close(file_desc);
boot_buf[510] = 0x55;
boot_buf[511] = 0xaa;
floppy_desc = open("/dev/fd0", O_RDWR);
lseek(floppy_desc, 0, SEEK_CUR);
write(floppy_desc, boot_buf, 512);
close(floppy_desc);
}
首先,以只读模式打开boot文件,然后在打开文件时把文件描述符复制到file_desc变量中。从文件中读取510个字符,或者读取直到文件结束。在本例中由于文件很小,所以是读取至文件结束。然后关闭文件。
最后4行代码打开软盘驱动设备(一般来说是/dev/fd0)。使用lseek找到文件开始处,然后从缓冲中向软盘写512个字节。
在read、write、open和lseek的帮助页中,可以看到与函数所有有关的参数及其使用方法。程序中有两行比较难懂:
boot_buf[510] = 0x55;
boot_buf[511] = 0xaa;
该信息是用于BIOS的,如果它识别出该设备是一个可启动的设备,那么在第510和511的位置,该值就应该是0x55和0xaa。程序会把文件boot读至名为boot_buf的缓冲中。它要求改变第510和第511字节,然后把boot_buf写至软盘之上。如果执行代码,软盘上的前512字节就包含了启动代码。最后,把文件存为write.c。
编译运行
使用下面的命令把文件变为可执行文件:
as86 boot.s -o boot.o
ld86 -d boot.o -o boot
cc write.c -o write
首先将boot.s文件编译成目标文件boot.o,然后将该文件连接成最终的boot文件。最后C程序编译成可执行的write文件。
插入一个空白软盘,运行以下程序:
./write
重新启动电脑,进行BIOS的界面设置,并且把软盘设为第一个启动的设备。然后插入软盘,电脑从软盘上启动。
启动完成后,在屏幕上可以看到一个字母A(蓝底白字),启动速度很快,几乎是在瞬间完成。这就意味着系统已经从我们制作的软盘上启动了,并且执行了刚才写入启动扇区的程序。现在,它正处在一个无限循环的状态。所以,如果想进入Linux,必需拿掉软盘,并且重启机器。
2014年12月08日 10点12分 3
level 11
至此,这个操作系统就算完成了,虽然它没有实现什么功能,但是它已经可以启动机器了。
2014年12月08日 10点12分 4
level 8
不明觉厉
2014年12月08日 13点12分 5
level 9

艹,本野爹想搞个基于i586和i686的Linux System
GCC能编译不?
sudo yum install gcc
PS我常用圣斗士,一般不用阿卡林!!!
---
小小Ghost 垃圾技术。厚颜无耻 是非最多。不知天高地厚挑衅W吧。惹怒了Win吧热血男儿。小小Ghost 给我听着。毁灭Win吧 历史铭刻。如果一再冒犯泱泱大W吧。让你看看Win吧吧友的本色。狗日的小Ghost 别再招惹W吧。Windows吧它从来就是我们的。狗日的Ghost狗 别再嚣张得瑟。反G行动Windows吧吧友没有畏惧过。狗日的小Ghost 别再招惹Windows吧。爱我W吧反Ghost始终会有我。狗日的Ghost狗 滚出大Windows吧。Windows吧吧友心中都有一团战火。(Ghost狗 哪里跑)
2014年12月09日 10点12分 6
level 9

艹,你懂不懂专业名词???
第一扇区应该直接简写为MBR
还有你的C代码可以直接拉近GCC编译吗
---
小小Ghost 垃圾技术。厚颜无耻 是非最多。不知天高地厚挑衅W吧。惹怒了Win吧热血男儿。小小Ghost 给我听着。毁灭Win吧 历史铭刻。如果一再冒犯泱泱大W吧。让你看看Win吧吧友的本色。狗日的小Ghost 别再招惹W吧。Windows吧它从来就是我们的。狗日的Ghost狗 别再嚣张得瑟。反G行动Windows吧吧友没有畏惧过。狗日的小Ghost 别再招惹Windows吧。爱我W吧反Ghost始终会有我。狗日的Ghost狗 滚出大Windows吧。Windows吧吧友心中都有一团战火。(Ghost狗 哪里跑)
2014年12月09日 10点12分 7
我表示从未学过C。。我只会C艹,E,C#。。目前在学JAVA
2014年12月09日 10点12分
回复@blu168a :E是易语言。。。c艹看起来舒服点
2014年12月09日 11点12分
level 9
太长不看[滑稽][滑稽][滑稽][滑稽][滑稽][滑稽]
2014年12月10日 11点12分 8
1