使用GRUB 转发自http://www.osdever.net/tutorials/grub.php
GRUB的主页为 http://www.gnu.org/software/grub/grub.en.html.
=======================================================================
获取GRUB
=======================================================================
源码:
ftp://alpha.gnu.org/gnu/grub/grub-0.90.tar.gz
二进制文件:
ftp://alpha.gnu.org/gnu/grub/grub-0.90-i386-pc.tar.gz
DOS和Windows用户需要PARTCOPY或RAWRITE工具:
http://www.execpc.com/~geezer/johnfine/index.htm#zero
http://uranus.it.swin.edu.au/~jn/linux/rawwrite.htm
http://www.tux.org/pub/dos/rawrite/
=======================================================================
编译GRUB
=======================================================================
UNIX
configure ; make
DOS和Windows
...
=======================================================================
在没有文件系统的的软盘上安装GRUB
=======================================================================
1.得到GRUB的二进制文件(stage1和stage2)
2.把stage1和stage2连接成一个文件:
(DOS) copy /b stage1 + stage2 boot
(UNIX) cat stage1 stage2 > boot
3.把boot文件绝对写入软盘:
(DOS) rawrite boot a:
-或者-
(DOS) partcopy boot 0 168000 -f0
(UNIX) cat boot > /dev/fd0
由于boot远小于0x168000字节,PARTCOPY将会报错,这样写就没问题了。
=======================================================================
将GRUB安装在带文件系统的软盘上
=======================================================================
1.按上面的方法做一个无文件系统的可启动GRUB盘。
2.把stage1和stage2复制到被格式化成GRUB可认的软盘上。使用GRUB的setup命令,
这些文件必须方在/boot/grub目录下:
(DOS) mkdir a:/boot
mkdir a:/boot/grub
copy stage1 a:/boot/grub
copy stage2 a:/boot/grub
(UNIX) mount /dev/fd0 /mnt
mkdir /mnt/boot
mkdir /mnt/boot/grub
cp stage1 /mnt/boot/grub
cp stage2 /mnt/boot/grub
3.GRUB被安到软盘上后,stage2文件不能被修改,删除,磁盘整理,或者移动。如
果被改动,这个盘就不能再启动了。为了防止这样,可以把这个文件设置成只读。
(DOS) attrib +r +s stage2
(UNIX) chmod a-w stage2
这个DOS命令把stage2文件设置成系统只读文件。这是为了防止磁盘整理的需要。
提示:stage1文件被复制到启动区当中。如果这个文件被移动或删除,这个盘也
不能启动。
4.重新从没有文件系统的GRUB盘启动电脑。...
5a.
....
=======================================================================
制作一个多引导内核
=======================================================================
多引导内核头
------------
无论什么格式,你的内核必须有一个多引导内核头。此头
1.必须是以双字(四字节)边界对齐。
2.必须了内核文件的头8k内。
***提示:在.text段的头8K内不是说必须从文件起始开始。
ELF内核
-------
GRUB可以直接识别ELF格式文件。如果你的内核是ELF格式,你可以如下简单的使用
多引导头:
MULTIBOOT_PAGE_ALIGN equ 1<<0
MULTIBOOT_MEMORY_INFO equ 1<<1
MULTIBOOT_HEADER_MAGIC equ 0x1BADB002
MULTIBOOT_HEADER_FLAGS equ MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO
CHECKSUM equ -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)
; 多引导头 (in NASM syntax)
align 4
dd MULTIBOOT_HEADER_MAGIC
dd MULTIBOOT_HEADER_FLAGS
dd CHECKSUM
把这段代放在你的内核代码的开始处,然后编译你的内核。编译完成后,你可以用
GRUB的mbchk测试一下你的内核是否编译成多引导的。
内核装载地址
------------
GRUB从ELF格式内核中读取物理地址(装载地址;LMA)。这个值必须
1. at or above 1 meg, and
2. below the end of physical RAM
If the load address is below 1 meg, you get error #7:
Loading below 1MB is not supported
*** 提示: 这是GRUB的限制, 不是多引导的。
If the load address is beyond the end of RAM, you get error #28:
Selected item cannot fit into memory
And if you use a very high address like 0xC0000000, the math
apparently overflows, and you get error #7 again.
*** 提示: mbchk不检测这些错误。
通常,物理地址和VMA一样,可以通过连接脚本或连接命令设置("ld -Ttext=0x100000 ...")
如果你的ld版本支持,物理地址和虚拟地址可以在连接脚本中通过AT在分开设置:
OUTPUT_FORMAT("elf32-i386")
ENTRY(entry)
virt = 0xC0000000; /* 3 gig */
phys = 0x100000; /* 1 meg */
SECTIONS
{ .text virt : AT(phys)
{ code = .;
*(.text)
. = ALIGN(4096); }
.data : AT(phys + (data - code))
{ data = .;
*(.data)
. = ALIGN(4096); }
.bss : AT(phys + (bss - code))
{ bss = .;
*(.bss)
*(COMMON)
. = ALIGN(4096); }
end = .; }
连接后,使用objdump -h测试地址是否都正确。
(还未完成.....)
988



被折叠的 条评论
为什么被折叠?



