好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

怎样自己写操作系统.pdf

14页
  • 卖家[上传人]:橙**
  • 文档编号:333356903
  • 上传时间:2022-09-02
  • 文档格式:PDF
  • 文档大小:115.68KB
  • / 14 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 怎样自己写操作系统2009-10-07 16:56 电子书:http:/ 自由软件社区是一个充满自由和梦想的地方,在10 余年的时间里它创造了一个又一个奇迹然而,这些奇迹的创造者不只是Stallman,也不只是 Linus Torvalds,而是活跃在世界各地的不计其数的开发人员在使用各种功能强大的自由软件时,我总会对其开发者充满崇敬之情,期盼有朝一日自己也能成为他们中的一员很多对自由社区充满向往之情的人,虽然也想努力融身于其中,但又不知该怎么做那么,就请与我们一起从编写一个简单的操作系统开始吧!我们要做的事情有人可能担心自己既没有学过计算机原理,也没有学过操作系统原理,更不懂汇编语言,对 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转移到软盘中名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 14 页 -一张空软盘:它用于存储编写的操作系统,也是启动设备。

      一台装有 Linux 的计算机:这台机器可以很旧,386、486都可以在大部分标准 Linux 发行版中都会带有as86 和 ld86在我使用的 Red Hat 7.3中就包含有这两个工具,并且在默认的情况下,它已经安装在机器里如果使用的 Linux 没有这两个工具,可以从网上下载(http:/www.cix.co.uk/mayday/),这两个工具都包含在一个名为bin86 的软件包中此外,有关的文档也可以在网上获得(www.linux.org/docs/ldp/howto/Assembly-HOWTO/as86.html)开始工作使用一个你喜欢的编辑器输入以下内容:entry start start:mov ax,#0 xb800 mov es,ax seg es mov 0,#0 x41 seg es mov 1,#0 x1f loop1:jmp loop1 这是 as86 可以读懂的一段汇编程序第一个句子指明了程序的入口点,声明整个过程从 start处开始第二行指明了start的位置,说明整个程序要从start处开始执行0 xb800是显存的开始地址表明其后是一个立即数执行语句:mov ax,#oxb800 ax 寄存器的值就变为0 xb800,这就是显存的地址。

      下面再将这个值移至es 寄存器,es 是附加段寄存器请记住8086有一个分段的体系结构它的各段寄存器为代码段、数据段、堆栈段和附加段,对应的寄存器名称分别为cs、ds、ss 和es事实上,我们把显存地址送入了附加段,因此,任何送入附加段的东西都会被送到显存中要在屏幕上显示字符,就需要向显存中写两个字节前一个是所要显示字符的ASC 值,第二个字节表示该字符的属性属性包括字符的前景色、背景色及是否闪烁等等seg es 指明下一个将要执行的指令是指向es 段的所以,我们把值 0 x41(在 ASC 中表示的字符是A)送到显存的第一个字节中接下来要把字符的属性送到下一个字节当中在此输入的是0 x1f,该属性指的是在蓝色背景下显示白色的字符因此,如果执行这个程序,就可以在屏幕上得到显示在蓝底上的一个白色的 A接着是一个循环因为在执行完显示字符的任务后,要么让程序结束,要么使用一个循环使其永远运行下去把该文件命名为boot.s,然后名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 14 页 -存盘此处显存的概念说得不是很清楚,有必要进一步解释一下假设屏幕由 80 列25行组成,那么第一行就需要160字节,其中一个字节用于表示字符,另外一个字节用于表示字符的属性。

      如果要在第三行显示某一字符的话,就要跳过显存的第0 和 1 字节(它们是用于显示第1 列的),第 2 和 3 字节(它们是用于显示第2 列的),然后把需要显示字符的ASC 码值入第 4 字节,把字符的属性写入第5 字节把程序写至启动扇区下面写一个 C程序,把我的操作系统写入软盘第一扇区程序内容如下:#include /*unistd.h 需要这个文件 */#include /*包含有 read 和 write函数*/#include int main()char boot_buf512;int floppy_desc,file_desc;file_desc=open(./boot,O_RDONLY);read(file_desc,boot_buf,510);close(file_desc);boot_buf510=0 x55;boot_buf511=0 xaa;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_buf510=0 x55;boot_buf511=0 xaa;名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 14 页 -该信息是用于 BIOS的,如果它识别出该设备是一个可启动的设备,那么在第 510和 511的位置,该值就应该是 0 x55和 0 xaa程序会把文件 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,必需拿掉软盘,并且重启机器至此,这个操作系统就算完成了,虽然它没有实现什么功能,但是它已经可以启动机器了下一期我将在这个启动扇区程序里加入一些代码,使它可以做一些比较复杂的事情(比如使用 BIOS中断、保护模式切换等等)上一期,我讲述了如何在软盘的启动扇区写一些代码,然后再从软盘启动的过程制作好一个启动扇区,在切换到保护模式之前,我们还应该知道如何使用BIOS中断BIOS中断是一些由 BIOS提供的、为了使操作系统的创建更容易的低级程序在本文中,我们将学习处理BIOS的中断为什么要用 BIOS BIOS会把启动扇区拷贝至RAM 中,并且执行这些代码除此之外,BIOS还要做很多其它的事情当一个操作系统刚开始启动时,系统中并没有显卡驱动、软盘驱动等任何驱动程序。

      因此,启动扇区中不可能包含任何一个驱动程序,我们要采取其它的途径这个时候,BIOS就可以帮助我们了BIOS中包含有各种可以名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 14 页 -使用的程序,包括检测安装的设备、控制打印机、计算内存大小等用于各种目的的程序这些程序就是所说的BIOS中断如何调用 BIOS中断在一般的程序设计语言中,函数的调用是一件非常容易的事情比如在 C语言中,如果有一个名为 display的程序,它带有两个参数,其中参数noofchar 表示显示的字符数,参数attr表示显示字符的属性那么要调用它,只需给出程序的名称即可对于中断的调用,我们使用的是汇编语言中的int指令比如,在 C语言中要显示一些东西时,使用的指令如下所示:display(nofchar,attr);而使用 BIOS时,要实现相同功能使用的指令如下:int 0 x10 如何传递参数在调用 BIOS中断之前,我们需要先往寄存器中送一些特定的值假设要使用 BIOS的中断 13h,该中断的功能是把数据从软盘传送至内存之中在调用该中断之前,要先指定拷贝数据的段地址,指定驱动器号、磁道号、扇区号,以及要传送的扇区数等等。

      然后,就要往相应的寄存器送入相应的值在进行下面的步骤前,读者有必要对这一点有比较明确地认识此外,一个比较重要的事实是同一个中断往往可以实现各种不同的功能中断所实现的确切功能取决于所选择的功能号,功能号一般都存在ah 寄存器之中比如中断 13h 可以用于读磁盘、写磁盘等功能,如果把3 送入 ah 寄存器中,那么中断选择的功能就是写磁盘;如果把2 送入 ah 寄存器中,选择的功能则是读磁盘等我们要做的事情这次我们的源代码由两个汇编语言程序和一个C程序组成第一个汇编文件是引导扇区的代码在引导扇区中,我们写的代码是要把软盘中第二扇区拷贝至内存段的 0 x500 处(地址是 0 x5000,即偏移地址为0)这时我们需要使用BIOS的中断 13h这时启动扇区的代码就会把控制权转移至0 x500 处在第二个汇编文件中,代码会使用 BIOS中断 10h 在屏幕上显示一个信息C程序实现的功能则是把可执行的文件 1 拷贝至启动扇区,把可执行的文件2 拷贝至软盘的第二扇区启动扇区代码使用中断 13h,启动扇区把软盘第二扇区里的内容加载至内存的0 x5000 处(段地址为 0 x500)下面的代码是用于实现这一目的的代码,将其保存至文件 sbect.s名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 14 页 -中。

      LOC1=0 x500 entry start start:mov ax,#LOC1 mov es,ax m。

      点击阅读更多内容
      相关文档
      2025年秋学期浙教版初中科学七年级上册教学计划教学进度表.docx 2025年秋学期浙教版初中科学八年级上册教学计划教学进度表.docx 2025年秋学期浙教版初中科学九年级上册教学计划教学进度表.docx 初中英语新人教版八年级上册全册单词和句子整理(表格版)(2025秋).doc 9 《从百草园到三味书屋》 鲁迅 教学设计 初中语文统编版(2024)七年级上册 第三单元.docx 课外古诗词诵读《峨眉山月歌》李白教学设计初中语文统编版(2024)七年级上册 第三单元.docx 12 《论语》十二章 教学设计初中语文统编版(2024)七年级上册 第三单元.docx 初中英语新人教版七年级上册全册单词和句子整理(2025秋).doc 初中英语新外研版八年级上册Unit 3 Make it happen单词解析(C部分)(2025秋).doc 初中英语新人教版八年级上册Unit 1 Happy Holiday听力和重难点简析(2025秋).doc 2023-2024学年山东省青岛高二上学期物理12月月考试题及答案.pdf 2023-2024学年重庆市沙坪坝区九年级上学期数学期末试题及答案.pdf 2023-2024学年山东省滨州高二上学期历史期末考试题及答案.pdf 2023-2024学年重庆市渝北区九年级上学期数学期末试题及答案.pdf 2024-2025学年山东济南章丘区七年级上册数学期中试卷及答案.pdf 2022-2023学年江苏省连云港高二下学期生物期中考试题及答案.pdf 2025年陕西学考选择性考试生物试题及答案.pdf 2025年甘肃学考选择性考试物理真题及答案.pdf 2025年福建学考选择性考试物理真题及答案.pdf 2025年辽宁学考选择性考试政治真题及答案.pdf
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.