一个操作系统的实现:BOOT
参考书籍为《一个64位操作系统的设计与实现》、《30天自制操作系统》
Boot的作用主要是当BIOS将执行权交给boot后,初始化文件系统,然后寻找Loader文件,如果找到则将其载入内存中并移交执行权
之前在BS_OEMName处使用了自定义的厂商名,发现软盘无法挂载,后来发现此项长度要求为8
Boot引导如下:
org 0x7c00BaseOfStack equ 0x7c00
BaseOfLoader equ 0x1000 ; loder基地址
OffsetOfLoader equ 0x00 ; loder偏移RootDirSectors equ 14 ; 根目录所占扇区数
SectorNumOfRootDirStart equ 19 ; 根目录起始扇区号
SectorNumOfFAT1Start equ 1 ; FAT1表的起始扇区号
SectorBalance equ 17 ; 平衡文件\目录的起始簇号与数据区起始簇号的差值; 簇号对应扇区位置=根目录占用扇区数+根目录起始扇区号+(FAT表项-2)=根目录占用扇区数+FAT表项+SectorBalance; FAT12文件系统引导扇区结构
jmp short Label_Start nop ; BS_jmpBootBS_OEMName db 'QKKKboot' ; 注意这此项长度为8,否则将导致软盘无法挂载BPB_BytesPerSec dw 512BPB_SecPerClus db 1BPB_RsvdSecCnt dw 1BPB_NumFATs db 2BPB_RootEntCnt dw 224BPB_TotSec16 dw 2880BPB_Media db 0xf0BPB_FATSz16 dw 9BPB_SecPerTrk dw 18BPB_NumHeads dw 2BPB_HiddSec dd 0BPB_TotSec32 dd 0BS_DrvNum db 0BS_Reserved1 db 0BS_BootSig db 0x29BS_VolID dd 0BS_VolLab db 'boot loader'BS_FileSysType db 'FAT12 'Label_Start:; 初始化寄存器mov ax, csmov ds, axmov es, axmov ss, axmov sp, BaseOfStack; 清屏mov ax, 0600hmov bx, 0700hmov cx, 0mov dx, 0184fhint 10h; 设置光标位置mov ax, 0002hmov bx, 0000hmov dx, 0000h; 显示字符串 mov ax, 1301hmov cx, 25mov dx, 0000hmov bx, 0083hpush axmov ax, dsmov es, axpop axmov bp, StartBootMessageint 10h; 重置软盘xor ah, ahxor dl, dlint 13h; 文件搜索(loader.bin)mov word [SectorNo], SectorNumOfRootDirStart ; 根目录起始扇区号Label_Search_In_Root_Dir_Begin:cmp word [RootDirSizeForLoop], 0jz Label_No_LoaderBindec word [RootDirSizeForLoop]mov ax, 00hmov es, axmov bx, 8000h ; 设置缓冲区ES:BXmov ax, [SectorNo]mov cl, 1call Func_ReadOneSectormov di, 8000hmov si, LoaderFileName ;设置di和si,方便后面使用lodsb指令cld ;复位DF(DF=0)mov dx, 10h ; 每个扇区可容纳得目录项个数Label_Search_For_LoaderBin:cmp dx, 0jz Label_Goto_Next_Sector_In_Root_Dirdec dxmov cx, 11 ; 目录项的文件名长度11BLabel_Cmp_FileName:; 逐个字节比较文件名cmp cx,0jz Label_FileName_Founddec cxlodsb ; (DS:SI)->(AL),(SI++)cmp al, byte [es:di]jz Label_Go_Onjmp Label_DifferentLabel_Go_On:inc dijmp Label_Cmp_FileNameLabel_Different:and di, 0ffe0h ; di后5位置0,该语句将di恢复为8000hadd di, 20h ; 增加一个目录项长度mov si, LoaderFileNamejmp Label_Search_For_LoaderBinLabel_Goto_Next_Sector_In_Root_Dir:; 在下一个扇区搜索add word [SectorNo], 1jmp Label_Search_In_Root_Dir_BeginLabel_No_LoaderBin:; 找不到文件则报错mov ax, 1301hmov cx, 21mov dx, 0100hmov bx, 000chpush axmov ax, dsmov es, axpop axmov bp, NoLoaderMessageint 10hjmp $ ;无限循环; 如果找到loader.bin
Label_FileName_Found:mov ax, RootDirSectorsand di, 0ffe0h ; 后五位清0,表示回到当前目录首地址add di, 01ah ; 目录项的DIR_FSTCLUS位置,表示起始簇号mov cx, word [es:di]push cxadd cx, axadd cx, SectorBalance ; 这一步得到了簇所在位置(扇区号)mov ax, BaseOfLoadermov es, axmov bx, OffsetOfLoader ; ES:BX为loader将要载入内存的位置mov ax, cxLabel_Go_On_Loading_File:push axpush bxmov ah, 0ehmov al, '.'mov bl, 0fhint 10hpop bxpop ax; 以上功能为打印一个“.”可依此观察读了几个扇区数据,即loader占了多少扇区mov cl, 1call Func_ReadOneSectorpop axcall Func_GetFATEntrycmp ax, 0fffh ; 0FFF是文件最后一个簇的标志jz Label_File_Loadedpush axmov dx, RootDirSectorsadd ax, dxadd ax, SectorBalance ; 重新计算扇区号add bx, [BPB_BytesPerSec] ; bx表示内存偏移jmp Label_Go_On_Loading_FileLabel_File_Loaded:jmp BaseOfLoader:OffsetOfLoader ; 移交给loader; 读取软盘功能实现
Func_ReadOneSector:; int 13h,AH=02h 读取磁盘扇区; AL=读入的扇区数, CH=磁道号,CL=扇区号,DH=磁头号,DL=驱动器号,ES:BX=数据缓冲区;保存现场push bpmov bp, spsub esp, 2mov byte [bp-2], clpush bx ; LBA格式转CHS格式mov bl, [BPB_SecPerTrk]div bl ; 余数在ah,商在alinc ahmov cl, ahmov dh, alshr al, 1mov ch, aland dh, 1pop bxmov dl, [BS_DrvNum]
Label_Go_On_Reading:mov ah, 2mov al, byte [bp-2]int 13hjc Label_Go_On_Reading ; CF未复位则重新调用中断add esp, 2pop bpretFunc_GetFATEntry:;解析FAT表push espush bxpush axmov ax, 00mov es, ax ; 初始化espop axmov byte [Odd], 0mov bx, 3mul bxmov bx, 2 ; ax为FAT表号,扩大1.5倍div bx cmp dx, 0 ;判断当前表项是奇数还是偶数,jz Label_Evenmov byte [Odd], 1 ;奇数置1Label_Even:xor dx,dx mov bx, [BPB_BytesPerSec]div bx ; 商为FAT表偏移扇区号,余数为FAT表项在扇区的偏移push dx mov bx, 8000h ; 设置缓冲区add ax, SectorNumOfFAT1Startmov cl, 2call Func_ReadOneSector ;一次读出两个扇区,防止fat表横跨两个扇区pop dxadd bx, dxmov ax, [es:bx]cmp byte [Odd], 1jnz Label_Even_2shr ax, 4 ; 上一项为奇数,则下一项为偶数,右移4位是舍弃多余数据Label_Even_2:and ax, 0fffh ; 上一项为偶数,下一项是奇数,前四位置0,舍弃多余数据pop bxpop esret; 中间变量
RootDirSizeForLoop dw RootDirSectors ; 用于控制循环
SectorNo dw 0 ; 当前扇区号
Odd db 0 ; FAT表项奇偶标志; 消息类型定义
StartBootMessage: db "Created by Qkk,Start Boot"
NoLoaderMessage: db "ERROR:No LOADER Found"
LoaderFileName: db "LOADER BIN",0; 填充及引导标志设置times 510 - ($ - $$) db 0dw 0xaa55
一个操作系统的实现:BOOT相关推荐
- 一个操作系统的实现(1)
一个操作系统的实现 说明:本文是一个简单的学习记录,不是全面给大家提供学习的文章,文章内容均代表作者的个人观点,难免会有错误.转载请保留作者信息. 2010/11/20 ...
- 一个操作系统的实现01
老师说,写好操作系统,期末就没有大作业了 没有大作业=期末空闲时间更多=我可以看每到期末就看的停不下来的电视剧 欢迎大家来和我一起来学操作系统制作 参考书籍: 一个操作系统的实现 于渊 参考博客:ht ...
- orange's系统可以装mysql 吗?_bochs 2.4.2 ubuntu 安装运行问题《orange#39;s 一个操作系统的...
用源码安装完后会遇到的问题: <1> 运行可能碰到如下问题: Event type: PANIC Device: [ ] Message: dlopen failed for module ...
- Orange‘s’ 一个操作系统的实现
突然想要随时记录一下实验过程中的各种问题,因此有了此文档: 由于是中途开始的,所以就偷懒直接跳过了vm.ubuntu32位16.04.bochs2.6.8.nasm的安装,下面开始正文内容: 2022 ...
- 《一个操作系统的实现》读书笔记连载ing……
从昨天起深陷<一个操作系统的实现>这个书不能自拔,这本书可以说再次燃起了我小时候想写操作系统的美好愿望,所以说愿望总是美好的,还进入了大学开始真正去学计算机才发现似乎写操作系统是和我没什么 ...
- 《Orange’s 一个操作系统的实现》3.保护模式3----DOS加载.EXE过程
在<<Orange's 一个操作系统的实现>>一书中有时使用了org 0100h,为何是0100h?因为书中的例子是为了突破引导扇区512字节的限制, 而将asm文件编译为.c ...
- 《Orange’s 一个操作系统的实现》3.保护模式7-特权级转移(通过调用门转移目标段-无特权级转换)...
在上次的代码基础上,添加一个代码段作为通过调用门转移的目标段.了解一下调用的工作方法,代码分析如下: <<红色标识部分为新增代码>> ; =================== ...
- Orange's:一个操作系统的实现 Descriptor 3宏详解
补充:关于GDT/LDT.段选择子和段描述符的解释 GDT/LDT:GDT/LDT是段描述符表,里面定义了每个段的段描述符的界限和属性,而段描述符的基址是在代码段中初始化的. ...
- 在Linux下安装配置bochs,并成功跑一个简单的boot引导(超详细)
环境:centos7(建议带桌面的版本)镜像网址 环境配置:gcc.gas.nasm.make 1.配置环境 yum -y install xxx(eg:gcc.等) 若出现yum源问题请观看 没有可 ...
最新文章
- 关于redis的几件小事(一)redis的使用目的与问题
- 3D打印神经电极有助于将大脑连接到电脑
- Linux - Red Hat 7.3 介绍安装
- 打开指定大小的新窗口
- VC编写的程序不能在其他机器上运行的解决方案
- sscanf用法详解-hdu2072
- ArrayList 相关总结
- Vue中使用定时器setInterval和延迟执行setTimeout
- 5W2H分析法,哪哪儿都能用到的方法,人生也可以套路进来
- Mysql/Mariadb本地不可以登录,远程可以登录问题的解决
- .NET程序不需要受SVN版本控制的文件类型
- 内核aio_AIO 的主要内核参数
- NLP-2015:Subword NMT模型【使用子词来解决OOV问题】
- 模电设计学习笔记(一)跟随器
- BS 和CS的区别
- 课程设计---快递管理系统(boostrap + servlet + jQuery + Redis + MySQL)
- python精通要数学好_深度学习需要多强的数学基础?
- 期货交易结算信息(期货结算系统)
- YOLOv5剪枝 | 模型剪枝理论篇
- MAC上安装Ubantu双系统
热门文章
- 7000字和你聊聊如何设计一款高并发架构(建议收藏)
- 工作室课题-第二周笔记
- ubuntu 14.04 成功迁移根分区到SSD
- 解决“fatal: 'origin' does not appear to be a git repository...”
- No fallback instance of type class错误的解决方案
- 谷歌浏览器崩溃设置崩溃_Google的广告业务开始崩溃了吗?
- ROS学习记录(二)玩转海龟——海龟保姆级教程
- 计算机桌面输入法怎么恢复,电脑桌面系统输入法不见了?输入法不见了找回方法/步骤...
- 使用Blob对象接收后台返回的图片流并展示到前端页面
- android wine教程_如何在 Android 上借助 Wine 来运行 Windows Apps