我的实验环境是:
- Ubuntu 12.04 x86
- qemu
- linux-2.6.32
- busybox 1.19.4
安装qemu
1 | $ sudo apt-get install qemu qemu-system |
Linux内核编译
1 | $ wget https://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.tar.gz |
编译过程中可能出现一些问题,主要是因为gdb版本不同,建议先进行修改再进行编译,可以省很多时间。
修改:
1.在内核目录arch/x86/vdso/Makefile中,大约在28,29行 找到 VDSO_LDFLAGS_vdso.lds = -m elf_x86_64 -Wl,-soname=linux-vdso.so.1 \ -Wl,-z,max-page-size=4096 -Wl,-z,common-page-size=4096 把”-m elf_x86_64” 替换为 “-m64”
2.然后再继续找,大约在72行左右,找到VDSO_LDFLAGS_vdso32.lds = -m elf_i386 -Wl,-soname=linux-gate.so.1中的 “-m elf_i386” 替换为 “-m32”
3.打开文件drivers/net/igbvf/igbvf.h,看128行,代码为:struct page *page;再往上看,第123行,也有struct page *page;这行代码,这个结构定义在内部的一个结构体中。就是他的名字与128行的重复了,而4.6.3的编译器对不支持这种方式的定义,将128行的代码注释掉。
编译busybox
1 | $ cd .. |
编译出错
1 | make: *** [busybox_unstripped] Error1 |
make menuconfig去掉如下选项
Linux System Utilities -> [] Support mounting NFS file system 网络文件系统
Networking Utilities -> [] inetd (Internet超级服务器)
编译成功后做如下配置:
1 | $ cd _install |
8.18补充
最近又发现了一些qemu的使用姿势:
1 | #!/bin/sh |
将上述内容保存到boot.sh文件,添加可执行权限,./boot.sh
即可启动内核。其中-m
是指定RAM大小(默认384);--nographic
和console=ttyS0
一起使用,启动的界面就变成当前终端;-s
相当于-gdb tcp::1234
的简写,可以直接通过主机的gdb远程连接。
reference
http://bobao.360.cn/learning/detail/3700.html
https://github.com/surajx/qemu-arm-linux/wiki/Compile-Linux,-BusyBox-for-ARM-and-load-it-using-QEMU
http://8happyer.blog.163.com/blog/static/96453662012263536678/