zoukankan      html  css  js  c++  java
  • 自制操作系统Antz(1)——Boot Sector

    0.引子

      最近在看操作系统底层方面的东西,最开始的为什么是07c00h这个问题就让我对操作系统有了很大的兴趣。所以准备在看书之余顺便写一个操作系统(Anz)。至于为什么这个系统会被叫做Antz,可以参考Antz Uhl Kone(某个日漫男主的名字), 日语为アインズ·ウール·ゴウン , 与之对应的还有接下来准备写的自制脚本语言AntzScript,因为准备是用Java实现解释器,所以如何把AntzScript运行在Antz上是一个很大问题(其实问题就是引入Java)。

      Antz系统更新地址: https://www.cnblogs.com/LexMoon/category/1262287.html

      Linux内核源码分析地址:https://www.cnblogs.com/LexMoon/category/1267413.html

    1.关于Boot Sector

      引导扇区(Boot Sector) 通常指设备的第一个扇区,用于加载并转让处理器控制权给操作系统。

      1.1 主引导扇区

        硬盘的0柱面、0磁头、1扇区称为主引导扇区,也叫主引导记录MBR,该记录占用512个字节,它用于硬盘启动时将系统控制权转给用户指定的、在分区表中登记了某个操作系统分区。MBR的内容是在硬盘分区时由分区软件写入该扇区的,MBR不属于任何一个操作系统,不随操作系统的不同而不同,即使不同,MBR也不会夹带操作系统的性质,具有公共引导的特性。但安装某些多重引导功能的软件或LINUX的LILO时有可能改写它,它先于所有的操作系统被调入内存并发挥作用,然后才将控制权交给活动主分区内的操作系统。

      1.2 MBR成员

        1.主引导程序代码,占446字节
        2. 磁盘签名
        3.硬盘分区表DPT,占64字节
        4.主引导扇区结束标志55AAH
        硬盘的主引导程序代码是从偏移0000H开始到偏移01BDH结束的446字节;主引导程序代码包括一小段执行代码。启动PC 机时,系统首先对硬件设备进行测试,成功后进入自举程序INT 19H;然后读系统磁盘0柱面、0磁头、1扇区的主引导扇区MBR的内容到内存指定单元0:7C00 首地址开始的区域,并执行MBR程序段。

      1.3MBR功能

        1.扫描分区表查找活动分区
        2.寻找活动分区的起始扇区;
        3.将活动分区的引导扇区读到内存;
        4.执行引导扇区的运行代码。
           如果主引导代码未完成这些功能,系统显示下列错误信息
          Invalid partition table
          Error loading operating system
          Missing operating system
      MBR是BIOS接力的第一棒,在他之后,会由分区引导扇区DBR接力,至于为什么不直接给DBR。那是因为BIOS大小有限,无法完成所有操作,在给DBR之前会通过MBR完成。
      目前只需要了解MBR,至于DBR会在之后进行解释。

    2.Boot Sector实现代码

      在BIOS自检等一系列工作完成后,要开始引导了。计算机会将硬盘0面0道1扇区512字节加载到07c00h(0000::7c00)处。

      1)为什么是0面0道1扇区?

        这个可以理解为是规定,当Bios工作完成后会去将硬盘0面0道1扇区512字节进行加载。但是真实情况是根据“魔数”来确定的,魔数就是有特殊意义的数,更大作用是用来做标记,比如MBR就是在512个字节的最后两个字节填入 0x55 ,0xaa来进行标记的。放在第一个扇区是因为0面0道1扇区是磁盘最开始的地方,一开始检验出有 0x55 ,0xaa就直接开始加载。

      2)为什么是07c00h?

        这个也可以当作是规定,在IBM文档中没有具体说明07c00h是为什么,但是在世界上第一台个人计算机诞生时,07c00h就是在它当中初次诞生的,那时的DOS最多也就是32K,为了实现MBR中的栈需要512B,为了满足需求取最大为1K,也就是32K-1K,就是07c00h了。

     1 org 07c00h
     2 mov ax,cs
     3 mov ds,ax
     4 mov es,ax
     5 call DispStr
     6 jmp $
     7 
     8 DispStr:
     9   mov ax,BootMessage
    10   mov bp,ax
    11   mov cx,16
    12   mov ax,01301h
    13   mov bx,000ch
    14   mov dl,0
    15   int 10h
    16   ret
    17 BootMessage:  db "Antz Uhl Kone"
    18 times 510-($-$$) db 0
    19 
    20 dw 0xaa55

     第1行的org 07c00h已经做出讲解了,它规定了程序加载的区域。

     第2-4行是将ds,es和cs指向相同的地址

     第5行call DispStr是调用了子程序实现字符串显示。

     在子程序DispStr中:    

        mov ax,BootMessage   取得显示字符串的地址
        mov bp,ax      es:ax 串地址
        mov cx,16      cx,串长度
        mov ax,01301h     ah = 13 h al=01h
        mov bx,000ch     bh = 00 页号    bl = 0ch 字色
        mov dl,0
        int 10h         10h中断
        ret

     第6行的 jmp $是为了进行无限循环。

       $可以理解为当前行命令的起始地址,$$是表示当前段的起始地址。

       第18行的times 510-($-$$) db 0  是将剩下的地址全部填 0 ,在512个字节中,0x55,0xaa占两个字节,剩下的510个字节减去之前用过的($-$$)个字节,身下的512-2-$-$$个字节全部填0。

    3.代码生成Img镜像

      工具 : NASM , FloppyWriter

     

      先对asm文件使用NASM编译成为bin文件:

    nasm os.asm -o os.img

      

      此时在asm同级目录生成了一个os.bin文件。 

     新建一个文件为 One_Antz.img

        

      此时生成了一个空的img文件。

      打开FloppyWriter.exe,选择第二个

     

      先选择我们生成的bin文件,点击下一步

      再选择我们创建的img文件。

       镜像就制作成功了。

       

       生成的镜像就是我们之前创建的img文件,内容被直接写入了。

      现在可以使用虚拟机打开我们创建的镜像了。

      

      设置好镜像后打开虚拟机。

      

  • 相关阅读:
    zabbix 3.4自动化监控(6)
    zabbix 3.4 web监控(5)
    童年
    CSDN中快速转载别人文章
    10个提升效率的编程好习惯(转载)
    解决vscode中vim插件,不能使用Ctrl+c
    英语复习安排
    比勤奋更能拉开人生差距的,是成长型思维
    转载文章
    红宝书考研资料
  • 原文地址:https://www.cnblogs.com/LexMoon/p/antz01.html
Copyright © 2011-2022 走看看