如何编写操作系统
如何编写自己的操作系统
有人可能担心自己既没有学过计算机原理,也没有学过操作系统原理,更不懂汇编语言,如何关闭软驱
对C语言也一知半解,能写操作系统吗?答案是没问题。我将带大家一步一步完成自己的操作系统。
当然如果学一学上述内容再好不过。
首先要明确处理器(也就是CPU)控制着计算机。对PC而言,启动的时候,CPU都处在实模式状态,
相当于只是一个Intel 8086处理器。也就是说,即使你现在拥有一个奔腾处理器,它的功能也只能
是8086级别。从这一点上来讲,可以使用一些软件把处理器转换到著名的保护模式。只有这样,
我们才可以充分利用处理器的强大功能。
编写操作系统开始是对BIOS控制,取出存储在ROM里的程序。BIOS是用来执行POST(Power On Self Test,
自检)的。自检是检查计算机的完整性(比如外设是否工作正常、键盘是否连接等)。这一切完成以后,
你就会听到PC喇叭发出一声清脆的响声。如果一切正常,BIOS就会选择一个启动设备,
并且读取该设备的第一扇区(即启动扇区),然后控制过程就会转移到指定位置。
启动设备可能是一个软盘、光盘、硬盘,或者其它所选择的设备。在此我们把软盘作为启动设备。
如果我们已经在软盘的启动扇区里写了一些代码,这时它就被执行。因此,我们的目的很明确,
就是往软盘的启动扇区写一些程序。
首先使用8086汇编来写一个小程序,然后将其拷贝至软盘的启动扇区。为了实现拷贝,要
写一个C程序。
最后,使用软盘启动计算机。
需要的工具
● as86:这是一个汇编程序,它负责把写的代码转换成目标文件。
● ld86:这是一个连接器,as86产生的目标代码由它来转换成真正的机器语言。
  机器语言是8086能够解读的形式。
● GCC:著名的C编程器。因为我们需要写一个C程序将自己的OS转移到软盘中。
● 一张空软盘:它用于存储编写的操作系统,也是启动设备。
● 一台装有Linux的计算机:这台机器可以很旧,386、486都可以。
在大部分标准Linux发行版中都会带有as86和ld86。在我使用的Red Hat 7.3中就包含有这两个工具,
并且在默认的情况下,它已经安装在机器里。如果使用的Linux没有这两个工具,可以从网上下载
(http: //uk/~mayday/),这两个工具都包含在一个名为bin86的软件包中。
此外,有关的文档也可以在网上获得 (/docs/ldp/howto/Assembly-HOWTO/as86.html)。
开始工作
使用一个你喜欢的编辑器输入以下内容:
entry start
start:
mov ax,#0xb800
mov es,ax
seg es
mov [0],#0x41
seg es
mov [1],#0x1f
loop1: jmp loop1
这是as86可以读懂的一段汇编程序。第一个句子指明了程序的入口点,声明整个过程从start处开始。
第二行指明了start的位置,说明整个程序要从start处开始执行。0xb800是显存的开始地址。
#表明其后是一个立即数。执行语句:
mov ax,#oxb800
ax 寄存器的值就变为0xb800,这就是显存的地址。下面再将这个值移至es寄存器,es是附加段寄存器。
请记住8086有一个分段的体系结构。它的各段寄存器为代码段、数据段、堆栈段和附加段,
对应的寄存器名称分别为cs、ds、ss和es。事实上,我们把显存地址送入了附加段,因此,
任何送入附加段的东西都会被送到显存中。
要在屏幕上显示字符,就需要向显存中写两个字节。前一个是所要显示字符的ASCⅡ值,
第二个字节表示该字符的属性。属性包括字符的前景、背景及是否闪烁等等。
seg es指明下一个将要执行的指令是指向es段的。所以,我们把值0x41(在ASCⅡ中表示的字符是A)送到
显存的第一个字节中。接下来要把字符的属性送到下一个字节当中。在此输入的是0x1f,
该属性指的是在蓝背景下显示白的字符。因此,如果执行这个程序,
就可以在屏幕上得到显示在蓝底上的一个白的 A。接着是一个循环。
因为在执行完显示字符的任务后,要么让程序结束,要么使用一个循环使其永远运行下去。
把该文件命名为boot.s,然后存盘。
--------------------------------------------------------------------------------
2 如何编写自己的操作系统
此处显存的概念说得不是很清楚,有必要进一步解释一下。假设屏幕由80列×25行组成,
那么第一行就需要160字节,其中一个字节用于表示字符,另外一个字节用于表示字符的属性。
如果要在第三行显示某一字符的话,就要跳过显存的第0和1字节(它们是用于显示第1列的),
第2和3字节(它们是用于显示第2列的),然后把需要显示字符的ASCⅡ码值入第4字节,
把字符的属性写入第5字节。
把程序写至启动扇区
下面写一个C程序,把我的操作系统写入软盘第一扇区。程序内容如下:
#include /* unistd.h 需要这个文件 */
#include /* 包含有read和write函数 */
#include
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);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。