linux内核移植与编译

在了解了内核及其相关知识之后,就要着手内核移植的实验了。

使用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,将内核文件解压到当前文件夹。

扫描二维码关注公众号,回复: 4790393 查看本文章

解压成功后,当前文件夹下会生成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>即可。

 

猜你喜欢

转载自blog.csdn.net/Wangguang_/article/details/85236514