在了解了内核及其相关知识之后,就要着手内核移植的实验了。
使用make menuconfig出现问题请移步make: *** 没有规则可以创建目标“menuconfig”。 停止。
Linux内核移植与编译
1.linux内核的下载
实验开始之前,你需要自行下载linux内核,因为最后要移植都开发板上,因此需要下载相应的内核,下载链接如下:
https://pan.baidu.com/s/1epiuTQm9JoziuFQ0DVpQ_w
2.linux内核的解压
下载完毕后,将文件利用vmware的共享文件夹传输到Ubuntu环境下,进入共享文件夹。
终端输入:cp linux-3.0.15.tar.gz /nfsroot/kernel,将内核文件拷贝到指定目录。进入该目录,对内核文件进行解压。
终端输入:tar xvzf linux-3.0.15.tar.gz,将内核文件解压到当前文件夹。
解压成功后,当前文件夹下会生成linux-3.0.15目录。
3.如何添加新的内核驱动
首先进入内核源码目录,终端输入:cd linux-3.0.15
接着进入drivers/char 目录,终端输入:cd drivers/char
在char目录下,我们利用vim编辑器编写一个helloworld.c文件,文件内容如下:
终端输入:vim helloworld.c
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_ALERT"Hello, world\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT"Goodbye, world\n");
}
module_init(hello_init);
module_exit(hello_exit);
进入内核源码目录修改drivers/char目录下的Kconfig文件,按照Kconfig的语法添加helloworld的程序菜单支持。
终端输入:cd /nfsroot/kernel/linux-3.0.15
vim drivers/char/Kconfig
在Kconfig文件中的source“driver/char/hw_random/Kconfig”下面添加如下内容(大约在264行)
进入末行模式,输入:g/source,找到相应的行,末行模式输入 :行数 即可将光标迅速跳转至相应行。
添加内容如下:
config HELLO_MODULE
bool "Hello World Test"
depends on CPU_EXYNOS4412
help
This is a demo to test kernel experiment On UP-CUP44.
注意:config HELLO_MODULE段要与前后段有换行隔开,且bool行前要有tab制表位,注意格式。
接下来对drivers/char目录下的Makefile文件进行修改,按照内核中Makefile的语法格式添加helloworld程序的编译支持。
终端输入:vim drivers/char/Makefile
当前处于末行模式,输入 :g/hw_random
找到obj-$(CONFIG_HW_RANDOM) += hw_random/,在其下面添加如下内容:
obj-$(CONFIG_HELLO_MODULE) += helloworld.o
接下来运行make menuconfig 配置内核对helloworld程序的支持。
终端输入:make menuconfig
进入Device Drivers --->,如下图所示:
接着进入Character devices --->,如下图所示:
但是经过寻找并没有发现hello菜单。
经过尝试,决定改用新建目录的方式将hello程序写进内核。
(参考网址:https://blog.csdn.net/u013359794/article/details/46501923)
在drivers/char下新建hello目录,目录中包含helloworld.c和Makefile以及Kconfig文件。
其中helloworld.c中的内容与上面的相同,Makefile的内容如下:
obj-$(CONFIG_HELLO) += helloworld.o
Kconfig的内容如下:
config HELLO_MOUDLE
bool "Hello World Test"
help
Test for adding driver to menuconfig.
接下来对上一级目录的Makefile和Kconfig文件进行修改:
进入内核源码目录linux-3.0.15,终端输入:vim drivers/char/Kconfig
在文件末endmenu之前添加:
source "drivers/char/hello/Kconfig"
终端输入:vim drivers/char/Makefile
在文件末尾处添加:
obj-$(CONFIG_HELLO_MOUDLE) += hello/
完成修改后,在源码目录输入make menuconfig,同样进入Device Drivers --->、Character devices --->发现新目录。
按空格键将尖括号中选为*,之后保存退出,选择yes。
之后执行make命令,将内核重新编译。编译成功后,会在内核源码目录的arch/arm/boot
目录下生成内核压缩文件zImage。在完成之后,按照配套文档将新生成的内核重新烧写到开发板,就能在串口终端显示内核在启动过程中打印的相应信息。
如果在make执行过程中出现:elf_i386或elf_x86_64:没有那个文件或目录
原因是gcc 4.6不再支持linker-style架构。
64位系统解决方法:
确保当前路径是在内核目录中,然后执行命令:vim arch/x86/vdso/Makefile,在Makefile中搜索elf_x86_64,然后把”-m elf_x86_64” 替换为 “-m64“;
在Makefile中搜索elf_i386,然后把”-m elf_i386” 替换为 “-m32“,保存退出,问题解决了。接着继续编译,就可以了。
32位系统解决方法:
在Makefile中搜索elf_i386,然后把”-m elf_i386” 替换为 “-m32“,保存退出,问题解决了。接着继续编译,就可以了。
如果make过程中出现 PATH_MAX未声明(在此函数内第一次使用)
发现PATH_MAX在limits.h中定义,在/scripts/mod/sumversion.c中添加#include <limits.h>即可。