知识大全 自己动手写操作系统(一)

Posted 文件

篇首语:今日长缨在手,何时缚住苍龙。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 自己动手写操作系统(一)相关的知识,希望对你有一定的参考价值。

  自由软件社区是一个充满自由和梦想的地方 在 余年的时间里它创造了一个又一个奇迹 然而 这些奇迹的创造者不只是Stallman 也不只是Linus Torvalds 而是活跃在世界各地的不计其数的开发人员     在使用各种功能强大的自由软件时 我总会对其开发者充满崇敬之情 期盼有朝一日自己也能成为他们中的一员 很多对自由社区充满向往之情的人 虽然也想努力融身于其中 但又不知该怎么做 那么 就请与我们一起从编写一个简单的操作系统开始吧!     我们要做的事情    有人可能担心自己既没有学过计算机原理 也没有学过操作系统原理 更不懂汇编语言 对C语言也一知半解 能写操作系统吗?答案是没问题 我将带大家一步一步完成自己的操作系统 当然如果学一学上述内容再好不过     首先要明确处理器(也就是CPU)控制着计算机 对PC而言 启动的时候 CPU都处在实模式状态 相当于只是一个Intel 处理器 也就是说 即使你现在拥有一个奔腾处理器 它的功能也只能是 级别 从这一点上来讲 可以使用一些软件把处理器转换到著名的保护模式 只有这样 我们才可以充分利用处理器的强大功能     编写操作系统开始是对BIOS控制 取出存储在ROM里的程序 BIOS是用来执行POST(Power On Self Test 自检)的 自检是检查计算机的完整性(比如外设是否工作正常 键盘是否连接等) 这一切完成以后 你就会听到PC喇叭发出一声清脆的响声 如果一切正常 BIOS就会选择一个启动设备 并且读取该设备的第一扇区(即启动扇区) 然后控制过程就会转移到指定位置 启动设备可能是一个软盘 光盘 硬盘 或者其它所选择的设备 在此我们把软盘作为启动设备 如果我们已经在软盘的启动扇区里写了一些代码 这时它就被执行 因此 我们的目的很明确 就是往软盘的启动扇区写一些程序     首先使用 汇编来写一个小程序 然后将其拷贝至软盘的启动扇区 为了实现拷贝 要写一个C程序 最后 使用软盘启动计算机     需要的工具    ● as 这是一个汇编程序 它负责把写的代码转换成目标文件     ● ld 这是一个连接器 as 产生的目标代码由它来转换成真正的机器语言 机器语言是 能够解读的形式     ● GCC 著名的C编程器 因为我们需要写一个C程序将自己的OS转移到软盘中     ● 一张空软盘 它用于存储编写的操作系统 也是启动设备     ● 一台装有Linux的计算机 这台机器可以很旧 都可以     在大部分标准Linux发行版中都会带有as 和ld 在我使用的Red Hat 中就包含有这两个工具 并且在默认的情况下 它已经安装在机器里 如果使用的Linux没有这两个工具 可以从网上下载(~mayday/) 这两个工具都包含在一个名为bin 的软件包中 此外 有关的文档也可以在网上获得(/docs/ldp/howto/Assembly HOWTO/l)     开始工作    使用一个你喜欢的编辑器输入以下内容     entry start  start:   mov ax # xb    mov es ax   seg es   mov [ ] # x    seg es   mov [ ] # x f  loop : jmp loop      这是as 可以读懂的一段汇编程序 第一个句子指明了程序的入口点 声明整个过程从start处开始 第二行指明了start的位置 说明整个程序要从start处开始执行 xb 是显存的开始地址 #表明其后是一个立即数 执行语句     mov ax #oxb      ax寄存器的值就变为 xb 这就是显存的地址 下面再将这个值移至es寄存器 es是附加段寄存器 请记住 有一个分段的体系结构 它的各段寄存器为代码段 数据段 堆栈段和附加段 对应的寄存器名称分别为cs ds ss和es 事实上 我们把显存地址送入了附加段 因此 任何送入附加段的东西都会被送到显存中     要在屏幕上显示字符 就需要向显存中写两个字节 前一个是所要显示字符的ASCⅡ值 第二个字节表示该字符的属性 属性包括字符的前景色 背景色及是否闪烁等等 seg es指明下一个将要执行的指令是指向es段的 所以 我们把值 x (在ASCⅡ中表示的字符是A)送到显存的第一个字节中 接下来要把字符的属性送到下一个字节当中 在此输入的是 x f 该属性指的是在蓝色背景下显示白色的字符 因此 如果执行这个程序 就可以在屏幕上得到显示在蓝底上的一个白色的A 接着是一个循环 因为在执行完显示字符的任务后 要么让程序结束 要么使用一个循环使其永远运行下去 把该文件命名为boot s 然后存盘     此处显存的概念说得不是很清楚 有必要进一步解释一下 假设屏幕由 列× 行组成 那么第一行就需要 字节 其中一个字节用于表示字符 另外一个字节用于表示字符的属性 如果要在第三行显示某一字符的话 就要跳过显存的第 和 字节(它们是用于显示第 列的) 第 和 字节(它们是用于显示第 列的) 然后把需要显示字符的ASCⅡ码值入第 字节 把字符的属性写入第 字节     把程序写至启动扇区    下面写一个C程序 把我的操作系统写入软盘第一扇区 程序内容如下     #include <sys/types h> /* unistd h 需要这个文件 */  #include /* 包含有read和write函数 */  #include   int main()     char boot_buf[ ];   int floppy_desc file_desc;   file_desc = open( /boot O_RDONLY);   read(file_desc boot_buf );   close(file_desc);   boot_buf[ ] = x ;   boot_buf[ ] = xaa;   floppy_desc = open( /dev/fd O_RDWR);   lseek(floppy_desc SEEK_CUR);   write(floppy_desc boot_buf );   close(floppy_desc);      首先 以只读模式打开boot文件 然后在打开文件时把文件描述符复制到file_desc变量中 从文件中读取 个字符 或者读取直到文件结束 在本例中由于文件很小 所以是读取至文件结束 然后关闭文件     最后 行代码打开软盘驱动设备(一般来说是/dev/fd ) 使用lseek找到文件开始处 然后从缓冲中向软盘写 个字节     在read write open和lseek的帮助页中 可以看到与函数所有有关的参数及其使用方法 程序中有两行比较难懂     boot_buf[ ] = x ;  boot_buf[ ] = xaa;     该信息是用于BIOS的 如果它识别出该设备是一个可启动的设备 那么在第 和 的位置 该值就应该是 x 和 xaa 程序会把文件boot读至名为boot_buf的缓冲中 它要求改变第 和第 字节 然后把boot_buf写至软盘之上 如果执行代码 软盘上的前 字节就包含了启动代码 最后 把文件存为write c     编译运行    使用下面的命令把文件变为可执行文件     as boot s o boot o  ld d boot o o boot  cc write c o write     首先将boot s文件编译成目标文件boot o 然后将该文件连接成最终的boot文件 最后C程序编译成可执行的write文件     插入一个空白软盘 运行以下程序      /write    重新启动电脑 进行BIOS的界面设置 并且把软盘设为第一个启动的设备 然后插入软盘 电脑从软盘上启动     启动完成后 在屏幕上可以看到一个字母A(蓝底白字) 启动速度很快 几乎是在瞬间完成 这就意味着系统已经从我们制作的软盘上启动了 并且执行了刚才写入启动扇区的程序 现在 它正处在一个无限循环的状态 所以 如果想进入Linux 必需拿掉软盘 并且重启机器     至此 这个操作系统就算完成了 虽然它没有实现什么功能 但是它已经可以启动机器了     下一期我将在这个启动扇区程序里加入一些代码 使它可以做一些比较复杂的事情(比如使用BIOS中断 保护模式切换等等) cha138/Article/program/Oracle/201311/18813

相关参考

知识大全 自己动手写操作系统(二)

    上一期我讲述了如何在软盘的启动扇区写一些代码然后再从软盘启动的过程制作好一个启动扇区在切换到保护模式之前我们还应该知道如何使用BIOS中断BIOS中断是一些由BIOS提供的为了使操作系统的创建

知识大全 本人的动手能力比较差,做事情有种手忙脚乱的感觉,现在想去学小车驾照,但又害怕自己操作能力不行,

本人的动手能力比较差,做事情有种手忙脚乱的感觉,现在想去学小车驾照,但又害怕自己操作能力不行,跟你的动手能力无关,是你自己没有信心而已。做事之前都暗示自己“这个我能做好么?我能不出错么?”所以,你啥都

知识大全 自己动手编写组件

ASP讲座之十:自己动手编写组件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一组件编写速成—

知识大全 自己写的数据库操作类

ASP教程:自己写的数据库操作类  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  程序代码lish

人体奥秘 自己动手摘除阑尾

   阑尾炎是一种常见病,多发病,弄不好容易有生命危险。所以,得了急性阑尾炎要及时治疗。   1961年冬天,前苏联医生列奥尼德?罗戈佐夫随

教你自己动手粉刷涂料

天花板用的时间长了难免会显得破旧,有时还会发现墙面起泡、开裂,甚至整片剥落。这时候,我们就要重新粉刷它。如果想感受一下粉刷的乐趣,就自己动手吧,一定要记得先用刷子刷天花板、灯具边缘,再用滚筒作大面积的

宜家效应是指劳动会增加人们对劳动成果的感情,当人们自己动手制作东西时,他们都会觉得自己的创作特别有价值。根据上述定义,下

宜家效应是指劳动会增加人们对劳动成果的感情,当人们自己动手制作东西时,他们都会觉得自己的创作特别有价值。根据上述定义,下列最能体现宜家效应的是_____A、让人们亲手做折纸,然后连同他人做的折纸放在一

自己动手能治疗银屑病

银屑病是一种难以治愈的皮肤顽疾,但它并不是什么难治之症,这种皮肤病还是可以完全治愈的。其实在生活中,银屑病就可以自己经常动手做一些菜品或食物就能治疗银屑病。下面就为大家简单介绍几种治疗银屑病的食物:1

自己动手能治疗银屑病

银屑病是一种难以治愈的皮肤顽疾,但它并不是什么难治之症,这种皮肤病还是可以完全治愈的。其实在生活中,银屑病就可以自己经常动手做一些菜品或食物就能治疗银屑病。下面就为大家简单介绍几种治疗银屑病的食物:1

知识大全 文明礼仪伴我行的作文(不要抄网的).急

文明礼仪伴我行的作文(不要抄网的).急!自己怎么不去写自己动手,丰衣足食回忆校园生活你最难忘的一件事90字急!你好,很高兴为你解答。偶然联络到当年同桌,嘘寒之后,忽地想到那些时日的点点滴滴,不禁心头一