您当前的位置:首页 > 电脑百科 > 软件技术 > 操作系统 > 百科

操作系统学习 让启动镜像支持Fat12文件格式

时间:2020-12-28 10:55:53  来源:  作者:
操作系统学习 让启动镜像支持Fat12文件格式

 

一、Fat12 文件格式

1. 格式简要说明

  • Fat12是DOS支持的软盘格式。
  • FAT全称是文件分配表(File Allocation Table),用来记录存放文件名、起始扇区等文件信息。
  • 除了文件分配表,还有目录表(File Directory Table)。
  • 软盘有两个磁头,每个磁头80个柱面(磁道),每个柱面有18个扇区,每个扇区512个字节空间

软盘结构:

操作系统学习 让启动镜像支持Fat12文件格式

 

2. 引导扇区

简写格式

  • 面:C
  • 磁道:H
  • 扇区:S(每道18个扇区)

C0-H0-S1用来存放引导区,如果最后两个字节是0x55,0xaa(DW 0xAA55),BIOS就把这512字节读出来执行。

3. FAT

  • C0-H0-S2~C0-H0-S10(9个扇区) 存放 FAT表
  • C0-H0-S11~C1-H0-S1(9个扇区) 存放备用FAT表
  • C1-H0-S2~ C1-H0-S15(14个扇区)用于存放FDT(根目录)

4. FAT结构

  • FAT12的每个文件分配表项占12bit, 每个表项代表一个扇区。
  • 磁盘里所有扇区被线性索引(LBA)
  • FAT12每个表项的值指出文件存放的下一个扇区号
操作系统学习 让启动镜像支持Fat12文件格式

 


操作系统学习 让启动镜像支持Fat12文件格式

 

5. 根目录

  • 根目录紧跟着FAT表,从19分区开始。
  • 根目录由若干个目录条目组成,最多有BPB_RootEntCnt个。
  • 根目录中每个条目占32字节:

名称开始字节长度内容DIR_Name00xB文件名8字节,扩展名3字节DIR_Attr0xB1文件属性保留位0xC10保留DIR_WrtTime0x162最后一次写入的时间DIR_WrtDate0x182最后一次写入的日期DIR_FstClus0x1A2此文件在数据区和FAT表中的开始簇号DIR_FileSize0x1C4文件大小

6. 数据区

二、Fat12格式的引导区代码:

;%define _BOOT_DEBUG_   		; 做Boot Sector时把这行注释掉
						        ; 启用这行就用nasm Boot.asm -o Boot.com生成.com文件用于调试
						
%ifdef _BOOT_DEBUG_
   org  0100h
%else
   org 07c00h
%endif

CYLS EQU 10

; 把软盘按Fat12格式填充
   JMP init                ; 跳转指令

   DB      0x90            ; 空 DB,DD用来写单字节
   DB      "NotOneOS"      ; 厂商名,8字节,DB用来写双字节
   DW      512             ; 每个扇区大小512字节,DW用来写4字节
   DB      1               ; 每个簇的扇区数
   DW      1               ; Boot占的扇区
   DB      2               ; 有2个FAT表
   DW      224             ; 根目录大小224
   DW      2880            ; 磁盘扇区总数 2880
   DB      0xf0            ; 介质描述符,磁盘种类必须为0xf0
   DW      9               ; 每个FAT扇区数
   DW      18              ; 每个磁道18个扇区
   DW      2               ; 2个磁头
   DD      0               ; 隐藏扇区数
   DD      2880            ; 同上,磁盘大小
   DB      0, 0, 0x29      ; 0x29 扩展引用标记
   DD      0xffffffff      ; 无意义,固定这么写
   DB      "NotOneOS   "   ; 磁盘名(卷标),11字节
   DB      "FAT12   "      ; 磁盘格式名,8字节
   RESB    18              ; 空18个字节,填充0x00

init:
   MOV AX,0
   MOV SS,AX
   MOV SP,0x7c00        ; 堆栈空间,从0x7c00向前
   MOV DS,AX
   MOV AX,0x0820        ; 把磁盘数据加载到内存0x0820处。 0x8000~0x81ff的512字节给启动区用的,所以从0x0820开始
   MOV ES,AX            ; 初始化磁盘接口
   MOV CH,0             ; 柱面 0
   MOV DH,0             ; 磁头 0
   MOV CL,2             ; 扇区 2

readloop:
   MOV SI,0             ; 记录失败次数

retry:
   MOV    AH,0x02       ; 0x02 读磁盘
   MOV    AL,1          ; 读1个扇区
   MOV    BX,0
   MOV    DL,0x00       ; A驱动器

   INT    0x13          ; BIOS 读磁盘功能
   JNC    next          ; 成功跳转

   ADD    SI,1          ; 失败加一次
   CMP    SI,5          ; 到5次就跳到error
   JAE    error
   MOV    AH,0x00       ; 复位磁盘功能
   MOV    DL,0x00
   INT    0x13          ; 重置磁盘驱动器
   JMP    retry         ; 重试
   
next:
    MOV     AX,ES       ; 内存地址向后移动0x0020
    ADD     AX,0x0020   
    MOV     ES,AX       ; 通过AX给ES加0x0020

    ADD     CL,1        ; 扇区+1
    CMP     CL,18       ; 有没有到18个扇区
    JBE     readloop    ; CL<=18,就跳到 readloop
    
    MOV     CL,1
    ADD     DH,1
    CMP     DH,2
    JB     readloop    ; 如果 DH < 2 ,则跳到readloop
    
    MOV     DH,0
    ADD     CH,1
    CMP     CH,CYLS
    JB     readloop    ; 如果CH<CYLS , 则跳到readloop

    JMP     success

print:
   MOV   AL, [SI]
   ADD   SI, 1
   CMP   AL, 0
   JE    end
   MOV   AH, 0x0e
   MOV   BX, 15
   INT   0x10
   JMP   print

end:
   HLT
   JMP end             ; 无限循环

error:                 ; 打印错误信息
   MOV SI, error_msg
   JMP print

success:
   MOV SI, success_msg
   JMP print

BootMessage:   
   DB "Hello, MY OS!"   ; 想要开机后在屏幕上显示的字符串
   DB 0
success_msg: 
   DB "Success"         ; 成功
   DB 0
error_msg:    
   DB "Error"           ; 失败
   DB 0

   times  510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节 $$表示一个section的开始处汇编后地址
   DW  0xaa55           ; 结束标志

; 继续按Fat12填充磁盘剩余空间
    DB      0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
    RESB    4600
    DB      0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
    RESB    1469432

三、 文件读写

使用BIOS中断 int 13h,参数:

操作系统学习 让启动镜像支持Fat12文件格式

 

知道扇区号的时候,要计算int 13h的参数:

设扇区号/每磁道扇区数(18) = 商 Q,余数R ,则:

  • 柱面号= Q >> 1 (相当于 Q/2 无余数)
  • 磁头号=Q & 1
  • 起始扇区号=R+1

四、读磁盘镜像并写入文件,查看文件格式

下面使用VirtualBox读入磁盘镜像,并写入一个文件。(新建虚拟机并加虚拟磁盘的方法前面章节有提到。)

操作系统学习 让启动镜像支持Fat12文件格式

 


使用VsCode打开磁盘镜像,可以看到存储区域已经有了变化:

操作系统学习 让启动镜像支持Fat12文件格式

 


这里使用的是笨方法保存文件,也可以使用edimg.exe程序来做。

  • 文件名保存到 0x002600处
  • 文件的内容存在 0x40200处

后面章节来看如何让程序加载NotOneOS.sys里的代码。

本章代码与编译运行方法已放到gitee:
gitee.com/xundh/learn-os



Tags:镜像   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
阿里云镜像源地址及安装网站地址https://developer.aliyun.com/mirror/centos?spm=a2c6h.13651102.0.0.3e221b111kK44P更新源之前把之前的国外的镜像先备份一下 切换到yumcd...【详细内容】
2021-12-27  Tags: 镜像  点击:(1)  评论:(0)  加入收藏
因为你懂得的原因,下载docker镜像速度非常喜感,故收集几个国内常用的docker镜像。Docker中国区官方镜像地址:https://registry.docker-cn.com网易163的镜像http://hub-mirror.c...【详细内容】
2021-10-28  Tags: 镜像  点击:(48)  评论:(0)  加入收藏
ISO文件也就是光盘镜像文件,我们可以在光盘上安装虚拟光驱软件来挂载打开ISO镜像文件,也可以利用解压缩软件来打开ISO镜像文件。下面来具体说说win10iso文件如何打开。1、首先...【详细内容】
2021-08-18  Tags: 镜像  点击:(119)  评论:(0)  加入收藏
dockerfile的基本认识1. dockerfile的基本定义`dockerfile`是一个包含用于组合镜像的命令的文本文档,可以在命令中调用任何命令, docker通过读取Dockerfile中的指令自动生...【详细内容】
2021-07-05  Tags: 镜像  点击:(127)  评论:(0)  加入收藏
虽然docker history命令可以看到所有历史层级的操作,但是还是需要手动去写Dockerfiledfimage就是这样一个工具dfimage是一个alpine的镜像,启动的时候,通过将docker.sock映射到...【详细内容】
2021-06-25  Tags: 镜像  点击:(112)  评论:(0)  加入收藏
对于初学者来说,刚刚接触docker会有点迷,特别是镜像与容器。其实我们可以理解镜像与容器为一对多的关系。下图错误的示范,为什么是错误的呢?因为可以通过一个镜像确实可以启动...【详细内容】
2021-06-09  Tags: 镜像  点击:(136)  评论:(0)  加入收藏
Photo by William Warby on Unsplash您是否曾经想过为什么您的单应用程序Docker容器会增长到400 MB? 或者,也许为什么一个只有几十MB的应用程序二进制文件会生成一个MB的Docke...【详细内容】
2021-04-02  Tags: 镜像  点击:(233)  评论:(0)  加入收藏
简介Docker离不开可靠的镜像管理,官方默认的DockHub,虽然Docker官方也提供了公共的镜像仓库Registry,但是功能略显简单。Harbor是由VMware公司开源的企业级的Docker Registry管...【详细内容】
2021-03-17  Tags: 镜像  点击:(277)  评论:(0)  加入收藏
1.创建一个简单的应用程序在安装好Docker后,现在让我们来创建一个简单的应用程序。我们先创建一个简单的Node.js Web应用,然后将它打包到镜像中。该应用可以接受HTTP请求并返...【详细内容】
2021-03-10  Tags: 镜像  点击:(219)  评论:(0)  加入收藏
Nextcloud 是一款开源免费的私有云存储网盘项目,可以让你快速便捷地搭建一套属于自己或团队的云同步网盘,从而实现跨平台跨设备文件同步、共享、版本控制、团队协作等功能。它...【详细内容】
2021-03-01  Tags: 镜像  点击:(302)  评论:(0)  加入收藏
▌简易百科推荐
详细说明及例子 :对一组文件中的每一个文件执行某个特定命令普通格式:FOR %variable IN (set) DO command [command-parameters] %variable 指定一个单一字母可替换的参数。 ...【详细内容】
2021-12-27  中微中科技    Tags:DOS   点击:(3)  评论:(0)  加入收藏
Windows11都出来了,XP和Windows7真的被淘汰了吗,很显然并不会,系统有很多分类就不一一介绍了,以Windows系列系统举例,最初XP系统也是分代的,后来WIN7出现在了大众的视线,因为普遍的...【详细内容】
2021-12-09  WHW与某人    Tags:Windows7   点击:(19)  评论:(0)  加入收藏
Unix与Linux均是是多用户、多任务的操作系统,也有多种版本。Unix诞生于20世纪70年代初,而Linux发明于20世纪90年代初;可以说Unix之于Linux属于承上启下的关系。Unix诞生于贝尔...【详细内容】
2021-10-11  小扇子的笔记    Tags:Unix   点击:(85)  评论:(0)  加入收藏
很多朋友经常问我这个问题,总是主观地认为64位操作系统就是要比32位的操作系统高端,高级、快等等的,现用我个人的观点和大家科普一下两者的区别。1、对于电脑硬件配置的要求不...【详细内容】
2021-09-07  一个人6639    Tags:操作系统   点击:(82)  评论:(0)  加入收藏
它看起来像复古计算,但它是一个现代的操作系统,你可以用它来完成任务。在整个 1980 年代和 1990 年代,我主要是一个 DOS 用户。我喜欢 DOS 提供的命令行环境,它随着每一个连续的...【详细内容】
2021-06-17  Jim Hall  Linux中国  Tags:FreeDOS   点击:(170)  评论:(0)  加入收藏
开源操作系统 FreeDOS是一个久经考验的项目,可帮助用户玩复古游戏、更新固件、运行过时但受欢迎的应用以及研究操作系统设计。FreeDOS 提供了有关个人计算历史的见解(因为它实...【详细内容】
2021-03-16      Tags:FreeDOS   点击:(252)  评论:(0)  加入收藏
现代计算机之父冯诺伊曼最先提出程序存储的思想,并成功将其运用在计算机的设计之中,该思想约定了用二进制进行计算和存储,还定义计算机基本结构为 5 个部分,分别是中央处理器(CPU)、内存、输入设备、输出设备、总线。...【详细内容】
2021-03-04      Tags:操作系统   点击:(212)  评论:(0)  加入收藏
初学操作系统的时候,我就一直懵逼,为啥进程同步与互斥机制里有信号量机制,进程通信里又有信号量机制,然后你再看网络上的各种面试题汇总或者博客,你会发现很多都是千篇一律的进程...【详细内容】
2021-03-01      Tags:通信机制   点击:(184)  评论:(0)  加入收藏
Unix很美。 请允许我为您画一些快乐的小树。 我不会解释很多命令,这很无聊,网络上已经有上百万的教程可以做到这一点。我将让您能够对系统进行推理。您想做的每件奇特的事都...【详细内容】
2021-02-26      Tags:Unix   点击:(209)  评论:(0)  加入收藏
微软倾力打造的Windows 10X系统已经完全泄露,但镜像仅支持Surface Pro 7。不过,大神Albacore(thebookisclosed)制作了非官方的镜像打包工具(Mega网盘),可以提取本地驱动和配置文...【详细内容】
2021-02-03      Tags:Win10X   点击:(189)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条