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

Posted

篇首语:无私是稀有的道德,因为从它身上是无利可图的。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 自己动手写操作系统(二)相关的知识,希望对你有一定的参考价值。

    上一期 我讲述了如何在软盘的启动扇区写一些代码 然后再从软盘启动的过程 制作好一个启动扇区 在切换到保护模式之前 我们还应该知道如何使用BIOS中断 BIOS中断是一些由BIOS提供的 为了使操作系统的创建更容易的低级程序 在本文中 我们将学习处理BIOS的中断     为什么要用BIOS    BIOS会把启动扇区拷贝至RAM中 并且执行这些代码 除此之外 BIOS还要做很多其它的事情 当一个操作系统刚开始启动时 系统中并没有显卡驱动 软盘驱动等任何驱动程序 因此 启动扇区中不可能包含任何一个驱动程序 我们要采取其它的途径 这个时候 BIOS就可以帮助我们了 BIOS中包含有各种可以使用的程序 包括检测安装的设备 控制打印机 计算内存大小等用于各种目的的程序 这些程序就是所说的BIOS中断     如何调用BIOS中断    在一般的程序设计语言中 函数的调用是一件非常容易的事情 比如在C语言中 如果有一个名为display的程序 它带有两个参数 其中参数noofchar表示显示的字符数 参数attr表示显示字符的属性 那么要调用它 只需给出程序的名称即可 对于中断的调用 我们使用的是汇编语言中的int指令     比如 在C语言中要显示一些东西时 使用的指令如下所示     display(nofchar attr)      而使用BIOS时 要实现相同功能使用的指令如下     int x      如何传递参数    在调用BIOS中断之前 我们需要先往寄存器中送一些特定的值 假设要使用BIOS的中断 h 该中断的功能是把数据从软盘传送至内存之中 在调用该中断之前 要先指定拷贝数据的段地址 指定驱动器号 磁道号 扇区号 以及要传送的扇区数等等 然后 就要往相应的寄存器送入相应的值 在进行下面的步骤前 读者有必要对这一点有比较明确地认识     此外 一个比较重要的事实是同一个中断往往可以实现各种不同的功能 中断所实现的确切功能取决于所选择的功能号 功能号一般都存在ah寄存器之中 比如中断 h可以用于读磁盘 写磁盘等功能 如果把 送入ah寄存器中 那么中断选择的功能就是写磁盘 如果把 送入ah寄存器中 选择的功能则是读磁盘等     我们要做的事情    这次我们的源代码由两个汇编语言程序和一个C程序组成 第一个汇编文件是引导扇区的代码 在引导扇区中 我们写的代码是要把软盘中第二扇区拷贝至内存段的 x 处(地址是 x 即偏移地址为 ) 这时我们需要使用BIOS的中断 h 这时启动扇区的代码就会把控制权转移至 x 处 在第二个汇编文件中 代码会使用BIOS中断 h在屏幕上显示一个信息 C程序实现的功能则是把可执行的文件 拷贝至启动扇区 把可执行的文件 拷贝至软盘的第二扇区     启动扇区代码    使用中断 h 启动扇区把软盘第二扇区里的内容加载至内存的 x 处(段地址为 x ) 下面的代码是用于实现这一目的的代码 将其保存至文件sbect s中     LOC = x   entry start  start:   mov ax #LOC    mov es ax   mov bx #    mov dl #    mov dh #    mov ch #    mov cl #    mov al #    mov ah #    int x    jmpi #LOC      上面代码第一行类似于一个宏 接下去的两行则是把值 x 加载至es寄存器中 这是软盘上第二扇区代码将拷贝到的地方(第一扇区是启动扇区) 这时 把段内的偏移设为     接下来把驱动器号送入dl寄存器中 其中磁头号送入dl寄存器中 磁道号送入ch寄存器中 扇区号送入cl寄存器中 扇区数送入al寄存器之中 我们想要实现的功能是把扇区 磁道号为 驱动器号为 的内容送至段地址 x 处 所有这些参数都和 MB的软盘相对应     把 送入ah寄存器中 是选择了由中断 h提供的相应功能 即实现从软驱转移数据的功能     最后调用中断 h 并且转至偏移为 的段地址 x 处     第二个扇区的代码    第二个扇区中的代码如下所示(把这些代码保存至文件sbect s之中)     entry start  start:   mov ah # x    xor bh bh   int x      mov cx #    mov bx # x    mov bp #mymsg   mov ax # x    int x     loop : jmp loop   mymsg:   byte    ascii Operating System is Loading      上面代码将被加载至段地址为 x 处 并且被执行 在这段代码中 使用了中断 h来获取目前的光标位置 然后显示信息     从第 行到第 行用于得到目前光标的位置 在此中断 h选用的是功能 然后 清除了bh寄存器的内容 并把字符串送至ch寄存器中 在bx中 我们送入了页码及显示的属性 此处 我们想要在黑背景上显示白色的字符 然后 把要显示字符的地址送到bp之中 信息由两个字节组成 其值分别为 的 它们分别对应回车和LF(换行)的ASCⅡ值 接下来是一个由 个字符组成的串 在下面实现的功能是输出字符串然后移动光标 最后是调用中断 然后进入循环     C程序代码    C程序的源代码如下所示 将其存储为write c文件     #include /* unistd h needs this */  #include /* contains read/write */  #include   int main()     char boot_buf[ ];   int floppy_desc file_desc;   file_desc = open( /bsect 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_SET);   write(floppy_desc boot_buf );   file_desc = open( /sect O_RDONLY);   read(file_desc boot_buf );   close(file_desc);   lseek(floppy_desc SEEK_SET);   write(floppy_desc boot_buf );   close(floppy_desc);       在上一期中 我曾经介绍过如何操作能启动的软盘 现在这一个过程稍微有点不同 首先把由bsect s编译出来的可执行文件bsect拷贝至软盘的启动扇区 然后再把由sect s产生的可执行文件sect 拷贝至软盘的第二个扇区     把上述文件置于同一目录之下 然后分别对其进行编译 方法如下所示     as bsect s o bsect o  ld d bsect o o bsect     对sect s文件重复以上的操作 得出可执行文件sect 编译write c 插入软盘后执行write文件 命令如下所示     cc write c o write   /write    下一步我们要做的事情    从软盘启动以后 可以看到显示出来的字符串 这是使用了BIOS中断来完成的 下一期要做的事情是在这个操作系统中实现实模式向保护模式的转换 cha138/Article/program/Oracle/201311/16947

相关参考

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

  自由软件社区是一个充满自由和梦想的地方在余年的时间里它创造了一个又一个奇迹然而这些奇迹的创造者不只是Stallman也不只是LinusTorvalds而是活跃在世界各地的不计其数的开发人员    

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

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

一位医科大学生,自己动手术割去了自己的阴茎,这是什么症状?

在某医学院的男生宿舍里,有人发现一个二年级男生,在自己的床上躺在血泊中。目睹者惊呆了,立即报告了班主任,用救护车送往医院抢救,因为出血过多,这位学生已昏迷不醒。班主任、系领导发现他的宋上放着手术包,其

一位医科大学生,自己动手术割去了自己的阴茎,这是什么症状?

在某医学院的男生宿舍里,有人发现一个二年级男生,在自己的床上躺在血泊中。目睹者惊呆了,立即报告了班主任,用救护车送往医院抢救,因为出血过多,这位学生已昏迷不醒。班主任、系领导发现他的宋上放着手术包,其

知识大全 自己写的一个未成熟的数据库连接池(二)

  /**  *Statement的自封装屏蔽了getResultSetexecuteQuerygetGeneratedKeys方法返回自己的接管类  *目的适记录SQl的动作和设置相应连接最后活动时

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

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

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

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

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

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

教你自己动手粉刷涂料

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

自己动手能治疗银屑病

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