操作系统引导-----QEMU环境下制作boot引导程序
目标
制作一个光盘实现qemu下操作系统的引导
储备知识
df命令
:列出文件系统的整体磁盘使用量
du命令
:常用于计算目录所占容量
-h :以(G/M)方式显示容量
-k:以KB方式显示
-m:以MB方式显示
mkfs命令
:使用指定的文件系统格式化磁盘
-t :接文件系统格式,如ext3,ext2,vfat等mount命令
:将文件系统挂载到指定的目录下losetup命令
:连接文件与循环设备(/dev/loop)
详解
-d 卸除设备。
-e<加密方式> 启动加密编码。
-o<平移数目> 设置数据平移的数目。
循环设备可把文件虚拟成区块设备,籍以模拟整个文件系统,让用户得以将其视为硬盘驱动器,光驱或软驱等设备,并挂入当作目录来使用。/dev/loop
设备
/dev/loop(或称vnd (vnode disk)、lofi(循环文件接口))是一种伪设备,这种设备使得文件可以如同块设备一般被访问。
在使用之前,循环设备必须与现存文件系统上的文件相关联。这种关联将提供给用户一个应用程序接口,接口将允许文件视为块特殊文件(参见设备文件系统)使用。因此,如果文件中包含一个完整的文件系统,那么这个文件就能如同磁盘设备一般被挂载。
这种设备文件经常被用于光盘或是磁盘镜像(IOS、IMG)。通过循环挂载来挂载包含文件系统的文件,便使处在这个文件系统中的文件得以被访问。这些文件将出现在挂载点目录。
在一个目录上挂载包含包含文件系统的文件的步骤:
使用一个循环设备(/dev/loop)连接文件(使用命令losetup
)
在目录上挂载该循环设备(使用命令 mount)其他
/dev
虚拟设备
/dev/null: “空”设备,也有人称它为黑洞。任何输入到这个“设备”的数据都将被直接丢弃
最常用的用法是把不需要的输出重定向到这个文件。
/dev/zero:零”设备,可以无限的提供空字符(0x00,ASCII代码NUL)。常用来生成一个特定大小的文件。
/dev/random和/dev/urandom:随机数设备,提供不间断的随机字节流。二者的区别是/dev/random产生随
机数据依赖系统中断,当系统中断不足时,/dev/random设备会“挂起”,因而产生数据速度较慢,但随机性
好;/dev/urandom不依赖系统中断,数据产生速度快,但随机性较低。
生成一个大小为1.44mb软盘,并且将其挂载到指定目录下
实现过程
- 先生成一个空的大小为1.44MB的磁盘
mkdosfs
命令
详解
-F 指定 FAT 表的大小,通常是 12 或是 16 个位元组。12 位元组通常用于磁碟片,16 位元组用于一般硬盘的分割区,也就是所谓的 FAT16 格式。这个值通常系统会自己选定适当的值。在磁碟片上用 FAT16 通常不会发生作用,反之在硬盘上用 FAT12 亦然。
xxd
命令查看其内容
xxd -u -a -g l -c 16 floopy
其前512字节是一个引导扇区(Boot Sector),前62字节是BPB的结构,BPB数据结构的字段是windows文件系统和操作系统约定好的,用于描述磁盘的物理布局,可以适用于FAT系列文件系统和NTFS文件系统。这里我们看到最后的文件系统类型为FAT12
FAT引导扇区结构
详细介绍链接
引导代码
boot.asm程序:
jmp init; BS_jmpBoot短跳转指令(加上nop填充后为3个字节)
nop
Bs_OEMName db "Jiaxgong";Bs_OEMName 厂商名称 8字节
BPB_BytsPerSec dw 512;每扇区字节数
BPB_SecPerClus db 1;每簇扇区数
BPB_RsvdSecCnt dw 1;保留区中的保留扇区数FAT12必须为1,(引导记录占用的扇区数)
BPB_NumFATs db 2;此卷中FAT表的份数,建议为2
BPB_RootEntCnt dw 512;根目录中的目录项数 FAT12中建议取值512
BPB_TotSec16 dw 2880;扇区总数
BPB_Media db 0xf0;BPB_Media 存储介质f0表示可移动介质,f8表示固定介质
BPB_FATSz16 dw 9;一个FAT表所占的扇区数
BPB_SecPerTrk dw 18;每磁道扇区数
BPB_NumHeaders dw 2;磁头数
BPB_HiddSec dd 0;FAT分区之前的隐藏扇区数,对于未分区介质必须为0
BPB_TotSec32 dd 0
BS_drveNum db 0;int13得到的驱动器号
BS_Reserved1 db 0;保留(供NT使用)
BS_BootSig db 0x29;扩展引导标记,指明此后的3个域可用
BS_VolID dd 0;卷标序列号
BS_VolLab db "VirtualBoot";磁盘卷标,此域必须与根目录中11字节长的卷标一致
BS_FilSysType db "FAT12 ";文件系统类型init:mov ax, 7c00hmov ds, axmov es, axmov ss, axmov sp, 180hcall DispStrloop:jmp loopDispStr:mov ax, BootMsgmov bp, axmov cx, 16mov ax, 01301hmov bx, 000chmov dl, 0int 10hretBootMsg: db "Hello, OS World!"times 510-($-$$) db 0dw 0xaa55
以上程序写好后,使用nasm
命令汇编成二进制文件
nasm boot.asm -o boot.bin
汇编完成后,可以使用以下命令查看boot.bin的大小,刚好为512字节
wc -c boot.bin
plus:反汇编指令ndisasm boot.bin -o 0x7c00>> disboot.asm
可以查看处理过后的汇编代码
将引导代码写入floopy软盘中
dd if=boot.bin ibs=512 of=floopy obs=512 count=1 seek=0 conv=notrunc
notrunc意味着不缩减输出文件,也就是说,如果输出文件已经存在,只改变指定的字节,然后退出,并保留输出文件的剩余部分。没有这个选项,dd将创建一个512字节长的文件。
写入完成后,使用qemu启动软盘(a.img就是上面的floppy软盘,为了和命令区分,改为了a.img)
qemu-system-x86_64 -drive file=a.img,of=floppy
操作系统引导-----QEMU环境下制作boot引导程序相关推荐
- Windows环境下制作Ubuntu的U盘启动工具
Windows用户想要尝试一下Ubuntu或其他Linux系统?最简单的方法就是使用VMware Workstation,只是虚拟机会真实占用内存,如果你的电脑内存8G及以上可以试试.内存偏小,或者觉 ...
- mac 环境下 制作windows系统U盘启动盘
mac 环境下 制作windows系统U盘启动盘 下载系统文件 ylmf.iso 转换为img文件 hdiutil convert /Users/os/Downloads/ylmf.iso -fo ...
- Ubuntu环境下制作Windows U盘启动工具
Ubuntu环境下制作Windows U盘启动工具 第一次写这个,着实不会,权当自个儿记录一下吧.这两天准备学习语言,把elementaryOS改装Ubuntu ,装的时候迷糊眼一顿next,结果把原 ...
- ubuntu环境下制作win10启动盘,ubuntu安装图形化磁盘分区工具
一: ubuntu 磁盘管理工具 ---- GParted 图形化分区工具 安装GParted:sudo apt-get install gparted 启动:sudo gparted 手动删除合并分 ...
- 【虚拟机装黑苹果(第二弹)】Win10/macOS环境下制作黑苹果安装U盘(能被Vmware虚拟机识别)
目录 1 为什么要制作黑苹果安装U盘? 2 Win10环境制作黑苹果安装U盘 3 macOS环境制作黑苹果安装U盘 4 总结 参考文献 1 为什么要制作黑苹果安装U盘? 很多网友都知道如何在Vmw ...
- 关于VS环境下制作和使用静态库和动态库
转载理由:虽然操作什么的很基础,不过作为初学还是很好的文章,手把手教学 关于VS2013下制作和使用静态库和动态库 引言 什么是库:库是写好的现有的,成熟的,可以复用的代码. 所谓静态.动态是指链接. ...
- Docker环境下Spring Boot应用内存飙升分析与解决
目录 Spring Boot应用内存飙升 服务现状 JVM默认内存设置 优化 限制JVM内存 参数解释 JVM常见参数 java.security.egd 作用 优化后的Dockerfile文件 优化 ...
- 在DOS环境下制作Windows启动盘
制作一张系统启动盘可以在Windows系统出现问题的时候,使用启动盘来引导系统,然后再查找故障并加以解决,下面就来介绍一下制作启动盘的方法. 1.在Windows中创建启动盘 打开控制面板,双击&qu ...
- windows操作系统,python环境下django的自动安装
首先,在Windows操作系统下安装python,完成python环境的搭建.(我看有的博客需要配置环境变量,其实不必要,因为我们在安装的时候只要勾选如下图所示即可避免不必要的麻烦) 第二步,使用快捷 ...
- Linux环境下制作启动U盘
背景 在装了Ubuntu的PC上,想用U盘重装系统. 注: 本文操作都是以root用户进行的. 已经下载了Ubuntu的ISO文件在/root下. 步骤 1.查看U盘对应的设备名称 插入U盘后,使用下 ...
最新文章
- 用Python找出数组中出现次数超过一半的数
- jQuery动态改变图片显示大小(修改)
- ARC106——E - Medals
- jq 自动滑动轮换(向后插入小块)
- 我要自学网java jsp_学javaweb需要什么基础?零基础如何学习javaweb?
- vim环境设置和自动对齐
- 使用Dockerfile构建Nginx,Tomcat,MySQL镜像
- python html解析对比_python htmlparse页面解析示例
- 数据分析能不能替代Data Mining?
- Java判断是否为素数
- python爬取视频代码
- Themida和Winlicense加壳软件脱壳教程
- Android 桌面Widget (小组件)开发详解
- dvi是什么意思_VGA线和DVI线,VGA线和DVI线是什么意思
- Java XLS 转 XLSX
- 2018年11月TIOBE编程语言排行榜,Java稳居第一
- Python Matplotlib 3D绘图详解(汇总)
- Python从网易云音乐、QQ 音乐、酷狗音乐、虾米音乐等搜索和下载歌曲
- 人工智能:极大极小算法
- 华为公布未来五年规划:将发展高端手机
热门文章
- 代理工具及使用技巧Proxy Hunter
- 贝壳完成在香港双重主要上市:市值超1200亿港元
- 介绍几款WAP网页制作工具
- 算法导论 pdf_[LaTeX 宏包] clrscode3e - 排版《算法导论》风格的伪代码
- windows 2008 中IIS7.0以上如何设置404错误页面
- .Net·使用ILSpy反编译exe或dll文件保存为项目结构
- python+pygame 最强大脑联动归位游戏
- 安装R软件(R、studio)的安装包下载官网和教程
- 阿里大淘系模型治理方案分享
- C#中制作启动窗体的方法和问题