鱼C论坛

 找回密码
 立即注册

操作系统学习笔记20130911——进入32位模式并且导入C语言1

热度 1已有 420 次阅读2013-9-11 22:02

       实在很好奇,忍不住了想看下面的内容,开始。
      按照作者写的提纲来安排进度,第一项是制作真正的IPL。
       IPL,也就是Initial program loader启动程序装载器。之前的学习中IPL并没装载任何的程序,所以在这里我们开始实际的操作。
       好吧,作者说马上我们要学的就是个中间空空的壳子而已。不碍事,慢慢来。Begin~
      
       从简单的开始就是开始装载原先软盘里面的512字节的启动区的内容。
      INT  0x13   ;
      JC  error
      部分的新指令JC全程是jump if carry.含义就是如果进位标志是1的话就跳转。
       INT 后面是0x13,就是要调用BIOS 的0x13函数。查找的话得到的结果就是写盘。(这里还有很多的例子,0x03是写盘,0x02是读盘)而如果用到这个调用的话会有个返回值,这个返回值是0,或者1.刚刚说到的进位标志就是在调用了之后返回的结果。如果是0,那么就没有错误,但是返回的是1的话就有错误。有错的话就是1了,那么error了。
     但是进位标志的设计初衷是用来表示有没有进位的,这里也就用来报告BIOS有没有错误。后面还提到了几个寄存器。DHDLCHCL。CHCL分别是柱面号,扇区号。DHDL分别是磁头号,驱动器号。
       目前的情况是默认0号磁盘来实现。OK,当知道了是从0好2磁盘启动的时候,下面就需要从这个软盘的什么地方来读取数据。
       软盘的内部是从最外的0号到80号,同心圆结构。每个号是一个柱面,0到79号。cylinder.柱面。每个柱面有18个扇区。也就是80X18个扇区。扇区的话就是sector。扇形的意思。 
       和老式唱片机一样,有个磁头。(我严重怀疑这个软盘就是用的老式唱片设计)。磁头有2个,分别是0号和1号。
       因为软盘是可以2面读写的,加上有2个磁头,那么总的容量就是80X18X2X512就是1440KB。
       OK~这个软盘的结构看完了就看下面的启动加载器的问题吧。
       包含有IPL的启动区位置是  C0-H0-S1  也就是柱面0,磁头0,扇区1。(最外面一圈的0磁头方向的,1号扇区~)
   
   下面要开始研究的就是缓冲区地址的问题了,因为软盘的内容要加载到内存里。但是就一个BX来表示内存地址的话又太小了,于是就引入了EBX。但这是后话,好在当时设计了段寄存器(segment register)。在使用段寄存器的时候我们用这样的格式ES:BX的格式来表示地址。MOV AL,[ES:BX]的含义就是ESX16+BX的内存地址。从内存分布图上来看的话0x7c00~0x7dff是没有特殊用途的,于是我们可以随意用。
   在指定内存地址的时候必须有段寄存器参与其中的,要是没有指定的话就是默认的值。就是DS:
  
   下面就是试错。也就是说磁盘有时候会发生错误~这个作者讲的很少,就讲了一个新的概念就是系统复位。这里的2,3行汇编程序就可以看得懂。
  
   读到第18扇区
   读到18扇区不就是读完一个柱面cylinder么。
   有个新的指令,JMB。jump if below or equal。小于等于则跳转。
          
           一个柱面读完了就要读10个柱面。
          0柱面的一面读完了的话下面就要读取1面的反面了。C0-H1-S1。
          这里的新的指令JB就是jump if below.开头的EQU就是就是相当于C语言的#define命令,用于申明常数。EQU就是equal的意思。
           这里就完成了讲软盘的内容加载到内存的步骤。之后再把程序装到磁盘上启动电脑的话就完成了一个启动加载的过程。
       
         下面是着手开发操作系统。
          这里是书本54页,打个书签,明儿继续~
     

路过

鸡蛋

鲜花
1

握手

雷人

刚表态过的朋友 (1 人)

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-13 05:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

返回顶部