zoukankan      html  css  js  c++  java
  • 自己写操作系统 1

    0、操作系统启动过程  https://blog.csdn.net/judyge/article/details/52278384

      第一步:读取BIOS

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

      第二步:硬件自检 

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

      第三步:启动顺序

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

      第四步:主引导记录

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

      第五步:bootloader

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

      第六步:加载内核

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

    我们制作的操作系统将从第三步之后开始,通过vitrualbox 加载软盘img镜像的方式启动

    BIOS读img文件的前512字节,主引导记录,主引导记录的前446字节(boot.bin的前446字节,也是boot.img的前446字节)为bootloader,确定启动哪个操作系统

    1、制作boot.bin (需要下载安装 nasm   https://www.nasm.us/)

    编辑文件boot.asm

    org 07c00h ; 告诉编译器程序加载到7c00处
    
    mov ax, cs
    
    mov ds, ax
    
    mov es, ax
    
    call DispStr ; 调用显示字符串例程
    
    jmp $ ; 无限循环
    
    DispStr:
    
    mov ax, BootMessage
    
    mov bp, ax ; ES:BP = 串地址
    
    mov cx, 16 ; CX = 串长度
    
    mov ax, 01301h ; AH = 13,  AL = 01h
    
    mov bx, 000ch ; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮)
    
    mov dl, 0
    
    int 10h ; 10h 号中断
    
    ret
    
    BootMessage: db "Hello, One OS!" ; 想要开机后在屏幕上显示的字符串
    
    times  510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节
    
    dw  0xaa55 ; 结束标志
    

      nasm boot.asm -o boot.bin

    2、制作img镜像 https://blog.csdn.net/sunjing_/article/details/78781411

    制作img镜像方法一:Linux下的dd命令(亲测可用)

    1. 制作软盘镜像文件diska.img
    命令: dd if=/dev/zero of=diska.img bs=512 count=2880
    2. 复制boot.bin到boot.img中
    命令: dd if=boot.bin of=boot.img bs=512 count=1
    3. 复制diska.img中从第512字节往后的内容添加到boot.img中
    命令: dd if=diska.img of=boot.img skip=1 seek=1 bs=512 count=2879
     
    尝试过,如果把这里的第2,3步换成用FloppyWriter在windows上写boot.bin到diska.img镜像中,会出现virtualbox能识别diska.img镜像,但运行过程报“FATAL: No bootable medium found! System halted.”的错误,也就是说boot.bin其实没有生效。
     
    制作img镜像方法二:使用bximage工作和dd命令(亲测可用)
    使用linux下bximage命令,以ubuntu为例
    sudo apt-get install bximage
    bximage
    fd
    [Enter]
    [Enter]
    默认生成a.img的软盘镜像文件
     
    然后把boot.bin写入a.img文件前512字节内
    dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc
    如图:

    这里也尝试过,把方法一中第一步生成的img文件,代替bximage工具生成的img文件,然后继续使用方法二中的dd命令,生成的a.img,在vitrualbox上无法启动,此处不知道原因,希望有高手解答。

     
     3、使用vitrualbox启动boot.img  http://www.cnblogs.com/777777-716/p/5003964.html

     

    然后,启动运行就可以(下面这张是我的图,上面都是网图)

     

    附:

    https://www.csdn.net/gather_26/MtTacg0sODU2My1ibG9n.html

    https://github.com/lucasysfeng/lucasOS.git

  • 相关阅读:
    代码重构~提取方法
    代码重构~提取到类
    不说技术~有时,开发者还是应该讲究一点!
    代码重构~封装成员变量
    将不确定变为确定~LINQ查询包含对不同数据上下文上所定义项的引用
    真实的用户,真实的中国互联网
    John Resig: JavaScript's Chuck Norris
    chrome插件IE tab使用技巧
    人生的疆域与生存的幻象—阅读丰富人生
    WPF 创建多行TextBox
  • 原文地址:https://www.cnblogs.com/lr-ting/p/10542686.html
Copyright © 2011-2022 走看看