分享

在bochs上用grub引导自己的kernel

 dwlinux_gs 2014-10-21
NOTE:
1)以grub 0.97版本,linux(redhad)下操作为例;
2)创建一个支持fat16文件系统的启动盘。
1. 下载
在这里可以下载到各种grub的源代码:ftp://alpha.gnu.org/pub/gnu/grub/
2. 解压
在源码压缩包所在目录下执行: tar -xvzf grub-0.97.tar.gz
或在windows下使用winrar等工具将压缩包解开,放到linux指定目录下。
3. 编译
编译时执行命令:
$ cd ./grub-0.97 (进入grub源码所在目录)
【可以在下面每个命令执行完成之后,进入相应的子目录看看在这个阶段生成了什么文件】
$ ./configure (将按照缺省配置设定编译配置,生成各个子目录中的Makefile文件;使用./configure --help命令可以得到各种选项配置参数;这个阶段主要查看Makefile文件,或者根据执行完configure命令后的输出查看验证一些文件是不是刚才生成的)
$ make (根据./configure的配置结果,生成grub需要的各种二进制文件;这个阶段重要查看各个目录中的二进制文件,比如.o, 可执行文件等)
【make install (这个命令没有试过,根据一些网文,应该是把make之后生成的一些二进制文件放到linux系统相应的目录下,比如:<根据shell变量的设置> /usr/share/grub/i386-pc 或 /usr/local/share/grub/i386-pc等目录)】
【由于我们不准备给linux使用这些生成的二进制文件,所以就不执行make install这个命令了,二进制文件已经在我手中了,我想怎样用就怎样用。】
4. Julien Lecomte's Blog ? How to make a Bochs disk image.htm 【http://www./blog/2007/07/3/
根据标题,就知道这篇网文是干什么的了,一步一步跟着做吧。(这篇文章写的太好了,我这篇文章的类型应该算是“整理”,可惜这里没有这样的文章类型,就厚着脸皮“原创”一次吧:)
1)生成10MB大小的disk image
$ dd if=/dev/zero of=disk.img count=20160
2)在镜像文件上简历分区表(下面是每一步的操作步骤,操作时顺便注意一下命令的结果和输出等)
$ fdisk disk.img
   x     -> Extra functionality
   c 20  -> 20 cylinders
   h 16  -> 16 heads
   s 63  -> 63 sectors per track
   r     -> Return to main menu
   n     -> Create a new partition
   p     -> Primary
   1     -> Partition #1
   1     -> First cylinder
   20    -> Last cylinder
   a     -> Set bootable flag
   1     -> Partition number
   w     -> Write partition to disk
10 cylinders * 16 heads * 63 sectors per track = 10080 blocks
20 cylinders * 16 heads * 63 sectors per track = 20160 blocks

【每道扇区数63一般不会变,磁头数一般也不会变,只有柱面数变化时才能扩大磁盘的容量】
$ hexdump -s 0x1BE -x -n 16 disk.img (man hexdump 可获得参数用途)
00001be    0180 0001 0f04 133f 003f 0000 4e81 0000
对比下列两组数据可以得到5MB和10MB disk image的区别(Julien Lecomte创建的是5M的,咱这里是10M的)
0180 0001 0f83 093f 003f 0000 2721 0000 (5M)
0180 0001 0f04 133f 003f 0000 4e81 0000 (10M)
分区标识:(使用 fdisk 的l命令可以列出所有的分区标识码,16进制)
83 for Linux
04 for FAT16 <32M

3)安装lookback设备(得到独立分区第一个扇区在disk image文件中的偏移,63 * 512 = 32256)
$ fdisk -l -u disk.img
You must set cylinders.
You can do this from the extra functions menu.
Disk disk.img: 0 MB, 0 bytes
16 heads, 63 sectors/track, 0 cylinders, total 0 sectors
Units = sectors of 1 * 512 = 512 bytes
   Device Boot    Start       End    Blocks   Id  System
disk.img1   *        63     20159     10048+  83  Linux
$ losetup -o 32256 /dev/loop0 disk.img
4)把disk.img格式化fat文件系统
$ mkdosfs /dev/loop0
mkdosfs 2.8 (28 Feb 2001)
Loop device does not match a floppy size, using default hd params
$ hexdump -s 0x1BE -x -n 16 disk.img
00001be    0180    0001    0f83    133f    003f    0000    4e81    0000

可以看到格式化时,并不能改变分区格式,分区格式任然是0x83。
5)改变分区格式(因为我们想做的是使用fat格式的文件系统,而不是linux的,所以需要改变分区格式)
$fdisk disk.img
   t    ->change a partition's system id
   4    ->FAT16 <32M
$ hexdump -s 0x1BE -x -n 16 disk.img
00001be    0180    0001    0f04    133f    003f    0000    4e81    0000
可以看到分区类型已经改变,由原来的0x83变成0x04;在使用fdisk不能改变分区格式时,可以使用二进制编辑工具改变它,这样不会出什么问题(我已经做过实验了)。
6)挂载disk.img
$ mount -o loop /dev/loop0 /mnt
7)安装grub
$ mkdir -p /mnt/boot/grub
$ pwd
/os/grub-0.97
$ cp ./stage1/stage1 ./stage2/fat_stage1_5 ./stage2/stage2 /mnt/boot/grub/
$ vi /mnt/boot/grub/grub.conf
default=0
timeout=500
title=My Kernel (2010.03.20)
root (hd0,0)
kernel /kernel.bin (需要把我们自己的内核镜像kernel.bin copy到disk.img第一分区文件系统的根目录下)
$ cp /mnt/boot/grub/grub.conf /mnt/boot/grub/menu.lst
有了menu.lst才能显示选择菜单,否则(只有grub.conf)只是进入grub的命令状态。
8)解挂disk.img
$ umount /mnt
9)卸载loseup设备
$ losetup -d /dev/loop0
10)完成grub安装
$ pwd
/os/grub-0.97/grub
$ ./grub --device-map=/dev/null
   device (hd0) ../disk.img (disk.img在上一级目录/os/grub-0.97中)
   geometry (hd0) 20 16 63 (指明磁盘结构)
   root (hd0,0)
   setup (hd0)
   quit
执行过程中的log:
grub> device (hd0) disk.img
Error 15: File not found
grub> device (hd0) ../disk.img
grub> geometry (hd0)
drive 0x80: C/H/S = 620/128/63, The number of sectors = 20160, ../disk.img
   Partition num: 0,  Filesystem type is fat, partition type 0x4
grub> geometry (hd0) 20 16 63
drive 0x80: C/H/S = 20/16/63, The number of sectors = 20160, ../disk.img
   Partition num: 0,  Filesystem type is fat, partition type 0x4
grub> root (hd0,0)
 Filesystem type is fat, partition type 0x4
grub> setup (hd0)
 Checking if "/boot/grub/stage1" exists... yes
 Checking if "/boot/grub/stage2" exists... yes
 Checking if "/boot/grub/fat_stage1_5" exists... yes
 Running "embed /boot/grub/fat_stage1_5 (hd0)"...  16 sectors are embedded.
succeeded
 Running "install /boot/grub/stage1 (hd0) (hd0)1+16 p (hd0,0)/boot/grub/stage2 /boot/grub/menu.l
st"... succeeded
Done.
11)设置.bxrc 文件,让bocks使用刚刚做好的grub启动盘。
文件内容:
megs: 32
romimage: file=$BXSHARE/BIOS-bochs-latest, address=0xf0000
vgaromimage: $BXSHARE/VGABIOS-elpin-2.40
ata0-master: type=disk, path=f.img, mode=flat, cylinders=20, heads=16, spt=63
boot: disk
log: bochsout.txt
mouse: enabled=0
keyboard_mapping: enabled=1, map=$BXSHARE/keymaps/x11-pc-us.map
5. 把自己的kernel.bin copy到disk.img上fat系统的根目录中,我们的kernel(支持multi boot)便可以被引导起来了。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多