其实博主本来想在寒假自己写一个OSkernal的,高高兴兴的影印了本《一个操作系统的实现》。

然后又去图书馆借来《30天自制操作系统》和《X86/X64体系探索编程》,结果还是被自己的懒惰给打败了。。。

原本我感觉自制力还不错的,好歹春节前也看了很多东西,但是过了一个春节就懒散了。。

当然也有一部分原因是因为《30天》写的实在是太乱了。。缺少一个理论的上的指导和概括,看的云里雾里。

再就是汇编。。。博主原来只学过8086和AT&T汇编啊。。。这下又来个nasm汇编。。这学期还开了个ARM汇编。。Orz。。。

不过nasm汇编真的是很好用,它还有类似c++默认构造的宏指令,很强大啊!

当然了,如果我不是一个喜欢深究的人,也可以用《30天》提供的工具也能很快的写出来。但我毕竟还是有点追求的。。

废话了这么多,开始进入主题吧。。

首先,bootsector是个什么东西呢?其实就是个引导的作用,引导到bootloader或者是操作系统上。

注意,bootsector不是双系统的那种引导,而是在它之前的程序。

那么bootsector程序是如何发挥作用的呢?这得从计算机的开机流程讲起。

还记得学校上的操作系统教材上面说,计算机开机加电直接就去读取硬盘上的操作系统。(但其实漏掉了好些东西啊!!国产教材误人子弟啊!!!!)

其实一开机,并不是直接读硬盘,而是从主板的BIOS启动。

(BIOS不知道可以自己百度,它还把一些自带的中断加载到了内存中)

上电后,BIOS的ROM中程序通过硬件加载到内存。

根据BIOS的ROM中的程序,来检测相关硬件是否安装正确。然后才是寻找操作系统。

完整流程如下:

bios->bootsector->bootloader->kernel(后面两个以后再说)

这样就有问题了,BIOS怎么知道操作系统放在哪呢?

这需要了解通用计算机所遵循的规范了,bios只从硬盘的第一个扇区读取并加载程序。

扇区又是什么呢?这里我简单的带着你联想一下.

由于原来32位地址总线只能寻址4G的大小。那么硬盘不断发展,64位总线还没出现,但是硬盘大小超过4g。

所以多出来的部分就没有用了!但是工程师很聪明,所以就让每个地址存储的内容更多吧!(自己回顾组成原理)

所以,硬盘就出现了所谓的扇区!一般一个扇区的大小为512b。4G*512b=2t的样子。

这样来算,现在的发展已经够用了,以后换到64位系统就不用担心地址不够了。

回到正题。由于BIOS只能自动读一个扇区,512b的大小。

这么点大小肯定装不下操作系统~所以只好用bootsector来转让计算机使用的权力了。

于是我们就清楚了bootsector的作用----读入硬盘上的其他程序,并将cpu交给它。

下面是我写的bootsector。由于没有文件系统也不想用fat12,所以读取loader的位置是我自己随便定的。

如果fat12那一段不注释的话,U盘就可以被识别了,但是U盘中的内容都是乱的~~~

linux下可以用dd命令直接写到你的U盘中去。

dd if=$(OBOOT) of=$(DEVICE) bs=512 count=1 conv=notrunc
OBOOT表示生成文件,直接用nasm汇编生成.bin文件即可。

DEVICE就是你U盘在linux下的路径了。

然后就可以通过U盘启动,来执行你的bootsector了~

  1.  
    %include "boot.inc"
  2.  
    %ifdef DEBUG
  3.  
    org 0100h ;07c00h 0100
  4.  
    %else
  5.  
    org 07c00h
  6.  
    %endif
  7.  
    jmp short LABEL_START
  8.  
    nop
  9.  
     
  10.  
    ;head of FAT12
  11.  
    ; BS_OEMName DB 'meiboyu ' ; OEM String, 必须 8 个字节
  12.  
    ; BPB_BytsPerSec DW 512 ; 每扇区字节数
  13.  
    ; BPB_SecPerClus DB 1 ; 每簇多少扇区
  14.  
    ; BPB_RsvdSecCnt DW 1 ; Boot 记录占用多少扇区
  15.  
    ; BPB_NumFATs DB 2 ; 共有多少 FAT 表
  16.  
    ; BPB_RootEntCnt DW 224 ; 根目录文件数最大值
  17.  
    ; BPB_TotSec16 DW 2880 ; 逻辑扇区总数
  18.  
    ; BPB_Media DB 0xF0 ; 媒体描述符
  19.  
    ; BPB_FATSz16 DW 9 ; 每FAT扇区数
  20.  
    ; BPB_SecPerTrk DW 18 ; 每磁道扇区数
  21.  
    ; BPB_NumHeads DW 2 ; 磁头数(面数)
  22.  
    ; BPB_HiddSec DD 0 ; 隐藏扇区数
  23.  
    ; BPB_TotSec32 DD 0 ; wTotalSectorCount为0时这个值记录扇区数
  24.  
    ; BS_DrvNum DB 0 ; 中断 13 的驱动器号
  25.  
    ; BS_Reserved1 DB 0 ; 未使用
  26.  
    ; BS_BootSig DB 29h ; 扩展引导标记 (29h)
  27.  
    ; BS_VolID DD 0 ; 卷序列号
  28.  
    ; BS_VolLab DB 'MOS by mby '; 卷标, 必须 11 个字节
  29.  
    ; BS_FileSysType DB 'FAT12 ' ; 文件系统类型, 必须 8个字节
  30.  
     
  31.  
    times 18 db 0
  32.  
    LABEL_START:
  33.  
    mov ax, cs
  34.  
    mov ds, ax
  35.  
    mov es, ax ;make all pointer point null place
  36.  
     
  37.  
    mov dx,0
  38.  
    mov ax,BootMessage
  39.  
    mov cx,BMlength
  40.  
    mov dh,0
  41.  
     
  42.  
    call showStr ;show string function
  43.  
     
  44.  
    call Loader ;Loader getting loading
  45.  
    jmp fin ;while(1)
  46.  
     
  47.  
    Loader:
  48.  
    mov ax,4200h
  49.  
    mov dl,0x80
  50.  
    mov cx,0
  51.  
    mov ds,cx
  52.  
    mov si,DAP
  53.  
    int 0x13
  54.  
    jc LoaderError
  55.  
     
  56.  
    mov ax,0 ;clean es register
  57.  
    mov es,ax
  58.  
     
  59.  
    mov dx,0
  60.  
    mov ax,LSuccess
  61.  
    mov cx,LSlength
  62.  
    mov dh,1
  63.  
    call showStr
  64.  
     
  65.  
    jmp BaseOffLoader:SetOffLoader ;jump to Loader !
  66.  
     
  67.  
    LoaderError:
  68.  
    mov ax,0
  69.  
    mov es,ax
  70.  
    mov ax,LError
  71.  
    mov cx,LElength
  72.  
    mov dh,1
  73.  
    call showStr
  74.  
    fin:
  75.  
    hlt
  76.  
    jmp fin
  77.  
     
  78.  
    showStr:
  79.  
    mov bp,ax
  80.  
    mov ax,01301h
  81.  
    mov bx,000Fh
  82.  
    mov dl,0
  83.  
    int 10h
  84.  
    ret
  85.  
     
  86.  
    LSuccess: db "Loader OK!"
  87.  
    LSlength equ $-LSuccess
  88.  
     
  89.  
    LError: db "Booting Loader get wrong!"
  90.  
    LElength equ $-LError
  91.  
     
  92.  
    BootMessage: db "Boot Sector Start!"
  93.  
    BMlength equ $-BootMessage
  94.  
     
  95.  
    DAP:
  96.  
    db 16 ;packet size
  97.  
    db 0 ;must 0
  98.  
    dw 100 ;number of block need to read
  99.  
    dw 0 ;the offset
  100.  
    dw 8000h ;the segment address
  101.  
    dw 1h ;start block
  102.  
    dw 0
  103.  
    dw 0
  104.  
    dw 0
  105.  
     
  106.  
     
  107.  
    times 510-($-$$) db 0
  108.  
    dw 0xaa55

程序短,所以懒得用宏了。。这样对于新手看着也方便。

具体汇编的内容很简单,我就不讲了,这里说一下我写这个遇到的个坑。。。

使用BIOS的int 13h+al=02h的时候,在真机上是无法加载loader的!!软盘跟U盘还是有区别的!

我看《一个操作系统 的实现》和《30天》的时候,就是这里。。他们都使用的是软盘,但是用U盘就有问题!!

于是发现要用扩展BIOS中断,详细的可以去google扩展BIOS中断。(我记得我是在wiki上看到的,但是现在找不到了)

当然看我的代码也可以~

bootsector就介绍到这里了。过几天我再来写loader的部分~

恩。。现在正在写,并且写图形化界面的时候又遇到坑了。。

PS:

装过win+linux双系统的知道,得先装windows再装linux。

我估计就是windows直接重写bootsetor,然后直接引导到他的loader了,而linux的引导程序grub会识别原来的系统。

自己写操作系统---bootsector篇的更多相关文章

  1. 如何写好一篇高质量的IEEE/ACM Transaction级别的计算机科学论文?

    转自<知乎>如何写好一篇高质量的IEEE/ACM Transaction级别的计算机科学论文? 问题: 作为一个博士生,一直为写论文头疼,读过很多高质量论文,觉得写的真好,但是轮到自己写总 ...

  2. 写了一篇关于 FastAdmin 插件路由的分析文章

    写了一篇关于 FastAdmin 插件路由的分析文章 插件路由演示 ThinkPHP 的路由就像是整个应用的调度室,让你的应用 url 更友好,而且让应用更安全,不会让真实的地址暴露出去. 了解过 L ...

  3. 外国人专门写了一篇文章,来分析为什么go在中国如此火

    外国人专门写了一篇文章,来分析为什么go在中国如此火: <Why is Golang popular in China?> http://herman.asia/why-is-go-pop ...

  4. CesiumLab V1.4 分类3dtiles生成(倾斜单体化、楼层房间交互)我记得我是写过一篇关于倾斜单体化的简书文章的,但是现在找不到了。不过找不到也好,就让他随风逝去吧,因为当时我写那篇文章的时候,就发现了cesium实际是有另一种更高效的单体化。就下面这个示例https://cesiumjs.org/Cesium/Build/Apps/Sandcastle/index.html?src=

    我记得我是写过一篇关于倾斜单体化的简书文章的,但是现在找不到了.不过找不到也好,就让他随风逝去吧,因为当时我写那篇文章的时候,就发现了cesium实际是有另一种更高效的单体化.就下面这个示例 http ...

  5. 搭载Dubbo+Zookeeper踩了这么多坑,我终于决定写下这篇!

    大家好,我是melo,一名大二上软件工程在读生,经历了一年的摸滚,现在已经在工作室里边准备开发后台项目啦. 这篇文章我们不谈数据结构了,来谈谈入门分布式踩过的坑.感觉到了分布式这一层,由于技术更新迭代 ...

  6. 自己动手写插件底层篇—基于jquery移动插件实现

    序言 本章作为自己动手写插件的第一篇文章,会尽可能的详细描述一些实现的方式和预备知识的讲解,随着知识点积累的一点点深入,可能到了后期讲解也会有所跳跃.所以,希望知识点不是很扎实的读者或者是初学者,不要 ...

  7. 非常好!!!【从头开始写操作系统系列】实现一个-GDT(1)【转】

    转自:http://blog.csdn.net/luoyhang003/article/details/47338019 权声明:本文为博主原创文章,未经博主允许不得转载.(文章来源:http://b ...

  8. linux操作系统基础篇(七)

    Linux服务篇(二) 1.nfs服务的搭建 安装: yum install rpcbind nfs-utils -y 配置: NFS服务的配置文件为 /etc/exports,这个文件是NFS的主要 ...

  9. linux操作系统基础篇(二)

    Linux用户.群组.权限 1.用户也是由一个个文件组成的下列文件都是存放用户信息的文件 useradd user1 /etc/passwd: 存放用户信息  /etc/shadow/ :存放用户密码 ...

随机推荐

  1. little_rockie

    https://www.cnblogs.com/nxld/p/6058591.html

  2. PHP程序员应该知道的15个库

    最几年,PHP已经成为最受欢迎的一种有效服务器端编程语言.据2013年发布的一份调查报告显示,PHP语言已经被安装在全球超过2.4亿个网站以及210万台Web服务器之上.PHP代表超文本预处理器,它主 ...

  3. 洛谷P3243 [HNOI2015]菜肴制作 拓扑排序+贪心

    正解:拓扑排序 解题报告: 传送门! 首先看到它这个约束就应该要想到拓扑排序辣QwQ 首先想到的应该是用优先队列代替队列,按照节点编号排序 然后也很容易被hack:<5,1> 正解应为5, ...

  4. GDB常用命令使用说明(一)

    本文由霸气的菠萝原创,转载请注明出处:http://www.cnblogs.com/xsln/p/gdb_instructions1.html 全部关于gdb的文章索引请点这里 GDB(GNU Deb ...

  5. hadoop备战:yarn框架的简单介绍(mapreduce2)

    新 Hadoop Yarn 框架原理及运作机制 重构根本的思想是将 JobTracker 两个基本的功能分离成单独的组件,这两个功能是资源管理和任务调度 / 监控.新的资源管理器全局管理全部应用程序计 ...

  6. Celery配置Redis数据库保存Return结果状态

    使用windows版本 1.于GitHUB下载https://github.com/ServiceStack/redis-windows Window版本,到路径: 2. 运行路径下:D:\redis ...

  7. js定位当前位置的坐标经纬度和地点名称和天气

    <script src="http://api.map.baidu.com/api?v=2.0&ak=s6vFvPKgaEnI2ImqBpKGDj0m">< ...

  8. The Die Is Cast(poj 1481简单的双dfs)

    http://poj.org/problem?id=1481 The Die Is Cast Time Limit: 1000MS   Memory Limit: 10000K Total Submi ...

  9. SQL备份数据库代码

    SQL备份数据库代码 #region 服务每天备份一次数据库 /// <summary> /// 服务每天备份一次数据库 /// </summary> public void ...

  10. selenium webdriver处理HTML5 的视频播放

    import org.openqa.selenium.By; import org.openqa.selenium.JavascriptExecutor; import org.openqa.sele ...