Acrnel
浏览 181 | 评论 1
Andy
2020年06月27日
  • 一个内核的构思,2020年6月14日V0.1


    第一节 开发环境

      我们在linux下制作软盘、编译内核等,因此需要linux开发环境。如果你用windows, 那么在windows下安装VMware, 在VMware中安装ubuntu虚拟机,此ubuntu作为开发环境。

      注:笔者的开发环境是windows--VMware--ubuntu14.04.

    第二节 计算机启动过程

      写操作系统看似是一个复杂的过程,但只要我们将过程分解,完成每一步,那么完成一个操作系统就是水到渠成的事了。好了,我们就看一下计算机的启动过程,看操作系统何时被启动的。

      第一步:读取BIOS

      按下电源按钮后,计算机首先读取一块ROM芯片,这块芯片里的程序是"基本输入输出系統"(Basic Input/Output System),即BIOS.

      第二步:硬件自检

      BIOS会检查计算机硬件是否满足运行条件,如果硬件出现问题,主板会发出不同含义的蜂鸣,启动中止。

      第三步:启动顺序

      硬件检查完成后,BIOS会将控制权交给下一阶段的启动程序,注意,“下一阶段的启动程序”可能存放在硬盘中,也可能存放在CD/DVD中,或者软盘中等等,可以设置BIOS选择从哪个设备启动。

      第四步:主引导记录

      BIOS找到了“下一阶段的启动程序”所在设备,会读取该设备的第一个扇区,即读取最前面的512字节,称为主引导记录。主引导记录会告诉计算机下一步到哪里去找操作系统。

      第五步:bootloader

      计算机读取"主引导记录"前面446字节的机器码之后,运行事先安装的“启动管理器”bootloader,由用户选择启动哪个操作系统。如果你安装了多个操作系统,那么就要从这步做出选择了。

      第六步:加载内核

      好了,选择操作系统(内核)后,会加载内核,下面就交给内核去处理了。

    第三节 主引导记录

      我们使用虚拟机来启动操作系统,上面的第一步和第二步我们不做,由虚拟机去完成;第三步“启动顺序”我们选择从软盘启动(我们用镜像代替,并不是真的软盘),需要对虚拟机做下设置,选择从软盘启动。下面重点来看第四步,我们写一下“主引导记录”,让BIOS读取我们写的主引导记录。

      1. 主引导记录代码

    
    ; 文件名 boot.asm
     
    org 7c00h                     ; BIOS读入MBR后,从0x7c00h处开始执行
     
    ; 下面部分和10h有关中断,10h中断用来显示字符
    mov ax, cs
    mov es, ax
    mov ax, msg
    mov bp, ax                    ; ES:BP表示显示字符串的地址
    mov cx, msgLen                ; CX存字符长度
    mov ax, 1301h                 ; AH=13h表示向TTY显示字符,AL=01h表示显示方式(字符串是否包含显示属性,01h表示不包含)
    mov bx, 000fh                 ; BH=00h表示页号,BL=0fh表示颜色
    mov dl, 0                     ; 列
    int 10h
      
    msg: db "hello world, welcome to OS!"
    msgLen: equ $ - msg           ; 字符串长度
    times 510 - ($ - $$) db 0     ; 填充剩余部分
    dw 0aa55h                     ; 魔数,必须有这两个字节BIOS才确认是MBR
    
    1. 编译
     # nasm boot.asm -o boot.bin 
    如果没有nasm,安装它 sudo apt-get install nasm, 执行完上述命令,会生成boot.bin文件,这就是我们的主引导记录二进制。.asm -o boot.bin 制作软盘镜像,加入主引导记录    如何用dd命令制作软盘,自行google之。   1. 首先,我们制作一个空的软盘镜像empty.img:   > # dd if=/dev/zero of=empty.img bs=512 count=2880   2. 之后,我们制作一个包含主引导记录boot.bin的镜像文件Acrnel.img: > # dd if=boot.bin of=Acrnel.img bs=512 count=1   3. 然后,将empty.img中1个扇区后的数据拷贝到Acrnel.img的后: > # dd if=empty.img of=Acrnel.img skip=1 seek=1 bs=512 count=2879   这样就做成了一个大小为1.44Mb的包含主引导记录的软盘镜像文件Acrnel.img。   4. 将虚拟机ubuntu中的文件Acrnel.img拷贝到windows下(鼠标直接拖拽,如果不行google之)。
    本文作者:Andy
    本文链接:http://www.andyccr.com/e/index.php/archives/461/
    最后修改时间:2020-06-27 11:31:20
    本站未注明转载的文章均为原创,并采用 CC BY-NC-SA 4.0 授权协议,转载请注明来源,谢谢!
    评论
    与本文无关评论请发留言板。请不要水评论,谢谢。
    textsms
    支持 Markdown 语法
    email
    link
    评论列表
    已有 1 条评论
    gax
    2020-06-21 14:03
    棒!