基于Ubuntu制作内核镜像
准备工作:
1. 完整的linux内核(本次试验以linux2.6.35为例)
2. PC机
操作步骤:
1. 首先,将linux内核拷贝到系统的/usr/src目录下。
在这个拷贝的过程中有一点需要注意,下载的linux内核不能在windows下进行解压拷贝。Windows和linux对于文件的命名规则不同,在linux下,文件名是区分大小写的,名字相同大小写不同完全可以,但是在windows下,这种命名方式不行,如果在windows下解压缩,windows会自动删除文件名相同的文件中的一个。
2. 修改根目录下的Makefile文件,
修改如下:export KBUILD_BUILDHOST := $(SUBARCH)
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=
3. 将系统目录下的Kconfig拷贝到Linux2.6.35内核目录下
4. 执行: makeclean
Make menuconfig (注:参见文档linux修改kernel支持xr17d158方法-3)
Make bzImage
执行完到这一步,可能出现一个错误:
Error: gcc : 错误:elf_i386 : 没有那个文件或目录
Reason: PC机上安装的gcc 编译器不支持linker-style架构
Solution : 1, 修改 ./arch/x86/vdso/Makefile 中,找到VDSO_LDFLAGS_vdso.lds= -m elf_x86_64 –WL , ***
将“-melf_x86_64”替换为“-m 64 ”
2, 找到VDSO_LDFLAGS_vdso32.lds = -m elf_x86_i386 –WL ,***
把“-melf_x86_i386”替换为“-m32”
5. 执行make bzImage
成功则显示: Root device is(8,7)
Setup is 13532bytes (padded to 13824 bytes)
System is 3455kb
CRC 3fa36e81
Kernel :arch/x86/boot/bzImage is ready (#1)
6. 执行make modules
可能出现的错误:
Error : Infile include from driver /net/igbvf/ethtool.c : 36: 0 :
driver/net/igbvf/igbvf.h : 在文件作用域:
driver/net/igbvf/igbvf.h : 129 : 15 : error : 重复的成员’page’
Reason : 错误是由于gcc版本与内核版本冲突,首先建议更换内核,目前,我们修改内核代码以适应当前的编译器。
Solution :/drivers/net/igbvf/igbvf.h : 129 : 15 : 代码为:”struct page*page”和line124中有相同的定义,”struct page *page“,将line129中的定义改为”struct page *pagep”。
7. 重新执行make modules
8. 执行make modules_install
9. 执行make install
注:在执行make modules 的时候如果出现以下错误:
1,Make[1] : ***没有规则可以创建”***/***.o”需要的目标”***/***.c”,停止。
2,In file include from**/**/**.c : ** : ** :
Include/**/**/**.h: 在文件作用域 :include/**/**/**.h: ** : ** : 致命错误,linux/**/**.h : 没有这个文件或目录。
Reason : 由于windows 和linux 下解压缩的过程中的文件命名规则不同,在windows下可能会删除名字一样大小写不一样的文件,而linux下这种文件却是可以共存的。故可能是因为内核在windows下解压缩,造成文件的丢失。
Solution : 修改指定目录下的Makefile文件,将出现错误的文件所对应的Makefile配置代码注释掉。
Solu-Web : http://www.cnblogs.com/crazywangzx/p/3505289.html
http://loveboykan.blog.163.com/blog/static/182699468201211101659849/