bochs使用及硬盘储存结构详解
bochs使用及硬盘储存结构详解
0x00 bochs简介
bochs是一款跨平台的 开源的x86硬件模拟器,用于运行旧的linux或者dos系统是极其合适的,也可以用来编写操作系统或者实模式下的一些软件
去官网下载最近的版本,直接安装,打开后是这个界面,我们点load,然后选择从官网下载的freedosimg解压后的目录里的bochsrc文件
然后返回界面点击start 就可以运行freedos了
0x01 如何配置
我们刚刚load的 bochsrc文件,实际上是配置文件,用文本工具打开后如下图
megs: 32 #内存大小 32MB
romimage: file=$BXSHARE/BIOS-bochs-latest#BIOS文件的路径
vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest#vga文件路径
vga: extension=vbe, update_freq=15
floppya: 1_44=a.img, status=inserted#挂载软盘,盘符为a 对应物理路径为a.img 大小1.44MB
floppyb: 1_44=b.img, status=inserted#挂载软盘,盘符为b 对应物理路径为b.img 大小1.44MB
ata0-master: type=disk, path=c.img, cylinders=306, heads=4, spt=17#硬盘 盘符c:
#cylinders 柱面数 heads 磁头数 spt 每磁道扇区数
boot: c#设置启动盘
log: bochsout.txt
mouse: enabled=1#启用鼠标
cpu: ips=15000000#instruction per second cpu速度
0x02 硬盘储存结构详解
如上图,一个硬盘多个磁头(heads),每个磁头对应一个盘面,每个盘面被分成很多磁道(tracks)一个盘面的磁道数即是柱面(cylinders),每个磁道又分成若干扇区(sector),一个扇区一般储存512BYTE
spt 即 sectors per track (每个磁道扇区数)
硬盘扇区定位
以下引用csdn博主的一段内容
有了扇区(sector),有了柱面(cylinder),有了磁头(head),显然可以定位数据了,这就是数据定位(寻址)方式之一,CHS(也称3D),对早期的磁盘(上图所示)非常有效,知道用哪个磁头,读取哪个柱面上的第几扇区就OK了。CHS模式支持的硬盘容量有限,用8bit来存储磁头地址,用10bit来存储柱面地址,用6bit来存储扇区地址,而一个扇区共有512Byte,这样使用CHS寻址一块硬盘最大容量为256
- 1024 * 63 * 512B = 8064 MB(1MB = 1048576B)(若按1MB=1000000B来算就是8.4GB)
但现在很多硬盘采用同密度盘片,意味着内外磁道上的扇区数量不同,扇区数量增加,容量增加,3D很难定位寻址,新的寻址模式:LBA(Logical Block Addressing)。在LBA地址中,地址不再表示实际硬盘的实际物理地址(柱面、磁头和扇区)。LBA编址方式将CHS这种三维寻址方式转变为一维的线性寻址,它把硬盘所有的物理扇区的C/H/S编号通过一定的规则转变为一线性的编号,系统效率得到大大提高,避免了烦琐的磁头/柱面/扇区的寻址方式。在访问硬盘时,由硬盘控制器再将这种逻辑地址转换为实际硬盘的物理地址。 ———————————————— 版权声明:本文为CSDN博主「zztan」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/zztan/java/article/details/70861021
早起硬盘每个磁道扇区数相等,写入时给出 磁头 柱面 扇区 即可,所以需要知道硬盘的C/H/S三个参数,即有多少个磁头 多少个柱面 每个磁道/柱面多少个扇区,在现在BIOS int13仍然要求提供上面的数据
而现在的硬盘,实际上是“同密度扇区”,也就是外磁道长,所以扇区多,内磁道短,所以扇区少,直接对所有扇区线性编址,但是为了兼容,仍然有一个CHS参数, 那以前用chs模式下用磁头 柱面 扇区 做参数的程序访问硬盘怎:根据C/H/S三个参数,将其转换为线性的扇区地址即可,比如C/H/S 分别是 10,20,30,那么访问磁头5柱面20,扇区18,其线性地址即是 5 * 20 * 30 + 20 * 30 + 18 -1,之所以减1,是因为线性编址是从0开始。
0x03 bochs安装系统到硬盘
1获得一个空硬盘
从网上下载的系统文件有img格式,一般大小1.44mb,是软盘,直接可以启动的系统,而iso则是光盘映像,大小一般超过1.44mb,里面是系统安装程序,不能直接使用。
为了将系统安装到硬盘上,我们得现有一个硬盘。
如上图,使用bochs安装目录里的bximage.exe可以在安装目录生成一个空的硬盘img文件,依次输入参数,就可以生成指定大小的空硬盘。
值得注意的是,该硬盘的C /H/S参数是它自己确定的,(H总是16 S总是63 C根据硬盘总大小计算)并且,该程序还给出如何把生成img当做bochs主硬盘的配置,如下图:
根据bochs官方文档(下面引用),像上图这样不配置C/H/S参数,那么默认H是16 S是63,C会根据总大小计算出来,所以上图不配置也可以正确运行,如果H不是16,S不是63,就要特别设置
Disk geometry autodetection works with images created by bximage if CHS is set to 0/0/0 (cylinders are calculated using heads=16 and spt=63). For other hard disk images and modes the cylinders, heads, and spt are mandatory.
2启动安装程序
在上面的配置中,我们的虚拟计算机已经有了一个空硬盘,但是注意,该硬盘甚至没有分区,所以我们启动安装程序,给他分区并安装操作系统。
往配置文件写入,引入dos安装程序的iso,放到光驱中,并将启动设置为光驱启动。
ata0-master: type=disk, path=c.img, mode=flat #bximage生成的硬盘
ata0-slave: type=cdrom, path="MS-DOS.iso", status=inserted#安装程序挂载到光驱
boot: cdrom
这样,再启动bochs时,就会进入安装程序,然后在安装程序里分区该硬盘,安装系统到该硬盘,即可
ata0-master: type=disk, path=c.img, mode=flat #bximage生成的硬盘
boot: c
然后再删除光驱配置,从c盘启动,即可