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

  • 相关阅读:
    探索SaaS产业发展新机遇|鲁班会贵安首秀圆满收官
    带你认识三种kafka消息发送模式
    常用的echo和cat,这次让我折在了特殊字符丢失问题上
    当MySQL执行XA事务时遭遇崩溃,且看华为云如何保障数据一致性
    一图解析MySQL执行查询全流程
    HDFS源码解析:教你用HDFS客户端写数据
    大型集团企业云管平台建设参考架构
    带你了解家居智能的心脏:物联网关
    带你认识7种云化测试武器
    实践解析可视化开发平台FlinkSever优势
  • 原文地址:https://www.cnblogs.com/lr-ting/p/10542686.html
Copyright © 2011-2022 走看看