Linux 环境下文件写入.img
Linux 环境下文件写入.img
刺猬@http://blog.csdn.net/littlehedgehog
下面我们先用bximage创建一个软盘映像。(当然 你也可以用其他的工具创建,比如windows平台上的VPC就有这个功能)
$ bximage
========================================================================
bximage
Disk Image Creation Tool for Bochs
$Id: bximage.c,v 1.32 2006/06/16 07:29:33 vruppert Exp $
========================================================================
Do you want to create a floppy disk image or a hard disk image?
Please type hd or fd. [hd] fd
Choose the size of floppy disk image to create, in megabytes.
Please type 0.16, 0.18, 0.32, 0.36, 0.72, 1.2, 1.44, 1.68, 1.72, or 2.88.
[1.44]
I will create a floppy image with
cyl=80
heads=2
sectors per track=18
total sectors=2880
total bytes=1474560
What should I name the image?
[a.img]
Writing: [] Done.
I wrote 1474560 bytes to a.img.
The following line should appear in your bochsrc:
floppya: image="a.img", status=inserted
创建了映像文件后,需要将生成的二进制文件写入软盘的绝对扇区。我们看一下dd这个小工具的用法。
$ dd --help
用法:dd [操作数] ...
或:dd 选项
复制文件,并根据以下的操作数将数据转换并格式化。
bs=字节 强迫 ibs=<字节> 及 obs=<字节>
cbs=字节 每次转换指定的<字节>
conv=关键字 根据以逗号分隔的关键字表示的方式来转换文件
count=块数目 只复制指定量<块数目>的输入数据
ibs=字节 每次读取指定的<字节>
if=文件 读取<文件>内容而非标准输入的数据
iflag=标记 以指定标记取代逗号作为读入符号列表的分隔符
obs=字节 每次写入指定的<字节>
of=文件 将数据写入<文件>而不在标准输出显示
oflag=标记 以指定标记取代逗号作为写出符号列表的分隔符
seek=块数目 先略过以 obs 为单位的指定<块数目>的输出数据
skip=块数目 先略过以 ibs 为单位的指定<块数目>的输入数据
status=noxfer 不显示数据传输状态
<块数目>和<字节>可以加上以下的单位:
xM=M、c=1、w=2、b=512、kB=1000、K=1024、MB=1000*1000、M=1024*1024、
GB=1000*1000*1000、G=1024*1024*1024,还有 T、P、E、Z、Y 如此类推。
每个<关键字>可以是:
ascii 由 EBCDIC 码转换至 ASCII 码
ebcdic 由 ASCII 码转换至 EBCDIC 码
ibm 由 ASCII 码转换至替换的 EBCDIC 码
block 将结束字符块里的换行替换成等长的空格
unblock 会将 cbs 大小的块中尾部的空格替换为一个换行符
lcase 将大写字符转换为小写
nocreat 不创建输出文件
excl 如果输出文件已存在则操作失败
notrunc 不截断输出文件
ucase 将小写字符转换为大写
swab 交换每一对输入数据字节
noerror 读取数据发生错误后仍然继续
sync 将每个输入数据块以 NUL 字符填满至 ibs 的大小;当配合 block
或 unblock 时,会以空格代替 NUL 字符进行填充
fdatasync 在操作完成前切实写入输出文件
fsync 和上者类似,但同时也写入元数据
每个<标记>符号可以是:
append 追加模式 (只对输出操作有意义)
direct 使用 Direct I/O 存取模式
dsync 对数据采用 I/O 同步
sync 和上者类似,但同时也对元数据生效
nonblock 使用无阻塞 I/O
nofollow 不跟随链接文件
noctty 不根据文件指派控制终端
对运行中的“dd”进程发送一个 USR1 信号会使得
I/O 的统计信息被打印到标准错误设备然后恢复复制操作。
$ dd if=/dev/zero of=/dev/null& pid=$!
$ kill -USR1 $pid; sleep 1; kill $pid
18335302+0 records in
18335302+0 records out
9387674624 bytes (9.4 GB) copied, 34.6279 seconds, 271 MB/s
可用选项有:
--help 显示此帮助信息并离开
--version 显示版本信息并离开
请向 <bug-coreutils@gnu.org> 报告错误。
我们用如下命令写入软盘绝对扇区。
$ dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc
记录了 1+0 的读入
记录了 1+0 的写出
512 字节 (512 B) 已复制,0.000112553 秒,4.5 MB/秒
好了,现在终于可以看执行效果了。在终端输入
$ bochs -q -f bochsrc.bxrc
虚拟机运行效果显示如图所示:那个红色的T清晰可见。虽然我们并没有做清屏的工作。
在Linux调试大概就是这样吧。写个Makefile用来处理一系列的任务应该是个不错的选择。
不过在windows里面的时候我记得是写一个批处理文件 ,想进行模拟的时候只要双击那个批处理文件就可以了。在Linux里面可不可以呢,答案是肯定的。我们可以写一个shell脚本本执行。和Windows里的那个批处理文件一样,也是只用两行代码就行:
#!/bin/sh
bochs -q -f bochsrc.bxrc
写完后保存了任意文件名,然后,为这个文件名加可执行权限 。比如我的(文件名为run):
$ sudo chmod +x run
然后想进行模拟时只要在终端里输入
$ sudo ./run
就可以看到bochs运行了。
如果调试带有文件 系统的软盘映像文件 怎么办。别着急,下面几条命令也可以搞定。
首先在/mnt目录下建一个文件 夹,将来我们的映像文件就被 mount到这里。
$ cd /mnt/
$ sudo mkdir floppy
然后回到我们的操作系统开发目录,将软盘映像文件挂载到上面刚刚建 好的目录下面。假设我的软盘映像文件 为:floppya.img
那么我用下面的命令持载:
$ sudo mount ./floppya.img /mnt/floppy/ -o loop
其中-o loop的意思就是将映像文件看作一个块设备(回环设备)。
然后我们就可以很方便的往这个目录里面写文件了。
写完文件后别忘了卸载掉刚刚挂上去的软盘映像。
然后用bochs 进行模拟,效果如下所示:
更多推荐
所有评论(0)