找回密码
 立即注册
首页 业界区 业界 【Linux】编译用于Exynos4412(ARM)的Linux-3.14内核 ...

【Linux】编译用于Exynos4412(ARM)的Linux-3.14内核

马璞玉 2025-6-2 22:35:00
【Linux】编译用于Exynos4412(ARM)的Linux-3.14内核

零、准备

在准备之前需要配置好交叉编译环境,本文不做介绍。
1、下载

Linux-3.14内核源代码

  • 下载页面:https://www.kernel.org/pub/linux/kernel/v3.x/
  • 下载链接:https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.14.tar.xz
下载后得到以下文件:
  1. yu@Yubuntu:~/kernel$ ls -l
  2. 总计 76568
  3. -rw-rw-r-- 1 yu yu 78399152  4月  9 01:21 linux-3.14.tar.xz
复制代码
1.png

2、解压
  1. yu@Yubuntu:~/kernel$ tar -vxf linux-3.14.tar.xz
复制代码
解压后得到如下文件:
  1. yu@Yubuntu:~/kernel$ ls -l
  2. 总计 76572
  3. drwxrwxr-x 23 yu yu     4096  3月 31  2014 linux-3.14
  4. -rw-rw-r--  1 yu yu 78399152  4月  9 01:21 linux-3.14.tar.xz
复制代码
壹、编译内核

1、设置CPU架构和交叉编译器

设置CPU架构和交叉编译器的方法有几种,临时设置、通过环境变量设置和修改Makefile设置。基于实际情况,在本次编译中,我希望我把我修改好的内核发给别人同样有效,而且我只针对一种CPU指令集来配置的,所以我选择修改Makefile。
使用vi编辑Makefile:
  1. yu@Yubuntu:~/kernel$ cd linux-3.14/
  2.   
  3. yu@Yubuntu:~/kernel/linux-3.14$ vi Makefile
复制代码
把198、199行的
  1. ARCH        ?= $(SUBARCH)
  2. CROSS_COMPILE   ?= $(CONFIG_CROSS_COMPILE:"%"=%)
复制代码
改为
  1. ARCH        ?= arm
  2. CROSS_COMPILE   ?= $(CONFIG_CROSS_COMPILE:"%"=%)
复制代码
2.png

保存并退出~
注:这里关于交叉编译器的安装和配置就不再介绍了。
2、设置处理器

使用如下命令设置处理器:
  1. yu@Yubuntu:~/kernel/linux-3.14$ make exynos_defconfig
复制代码
难搞,报警告了,具体情况如下:
3.png
  1. In file included from scripts/kconfig/zconf.tab.c:2537:
  2. scripts/kconfig/menu.c: In function ‘get_symbol_str’:
  3. scripts/kconfig/menu.c:587:46: warning: ‘jump’ may be used uninitialized in this function [-Wmaybe-uninitialized]
  4.   587 |                                 jump->offset = strlen(r->s);
  5.       |                                 ~~~~~~~~~~~~~^~~~~~~~~~~~~~
  6. scripts/kconfig/menu.c:548:26: note: ‘jump’ was declared here
  7.   548 |         struct jump_key *jump;
  8.       |                          ^~~~
复制代码
没关系,Linux论坛上已有解决方案了:
https://patchwork.kernel.org/project/linux-kbuild/patch/1415098919-21836-1-git-send-email-syntheticpp@gmx.net/
4.png

我们按照这个页面上的来修改我们的代码:
  1. yu@Yubuntu:~/kernel/linux-3.14$ vi scripts/kconfig/menu.c
复制代码
把548行的struct jump_key *jump;改为struct jump_key *jump = NULL;:
5.png

把586行的if (head && location && menu == location)改为if (jump && menu == location)(由于我上一个修改我是注释掉原有行,再在下面添加的新行,所以这边我的第二个位置显示的是587行了):
6.png

保存退出~
重新使用如下命令设置处理器:
  1. yu@Yubuntu:~/kernel/linux-3.14$ make exynos_defconfig
复制代码
7.png

搞定!
3、配置Linux系统内核

1. 配置工具
Linux系统内核的配置文件在上一个步骤中,被我们写到了.config文件中了,感兴趣的同学可以打开看看,很复杂,新手不建议修改。对于大多数情况,我们可以使用Linux内核源码这边给我们提供的配置工具来配置,配置工具在README中有介绍,大致有这么些:
8.png

其中,我们比较常用的是make menuconfig,对于远程使用SSH连接的同学友好些。
2. 前置准备
make menuconfig需要一些依赖,可以使用如下命令安装对应的依赖:
  1. sudo apt-get install libncurses5-dev
复制代码
libncurses5-dev是一个基于文本的GUI开发库,用于支持在C等编程语言中开发基于文本终端的交互式应用程序,提供了屏幕绘制、键盘输入处理等功能。
另外,make menuconfig对屏幕大小有一定要求,我们最好把当前命令窗口拉伸到最大
3. 配置命令
执行如下命令开始配置:
  1. yu@Yubuntu:~/kernel/linux-3.14$ make menuconfig
复制代码
9.png

界面上方的文本即是使用帮助,同学们可以自己阅读一下,本文不介绍如何配置Linux内核,同学们根据自己的需要在此界面修改好Linux内核配置后再往下。
4. 配置参考
这里给出我的参考配置:
1). 网卡驱动
10.png
  1.     Device Drivers  --->            
  2. [*]   Network device support  --->   
  3. [*]     Ethernet driver support  --->
  4. <*>     DM9000 support               
复制代码
2). 网络支持
11.png
  1. [*] Networking support  --->               
  2.       Networking options  --->              
  3. <*>     Packet socket                       
  4. <*>     Unix domain sockets                 
  5. [*]     TCP/IP networking                  
  6. [*]       IP: kernel level autoconfiguration
复制代码
3). 文件系统
12.png
  1.     File systems  --->                                             
  2. [*]   Network File Systems  --->                                   
  3. <*>     NFS client support                                         
  4. <*>       NFS client support for NFS version 3                     
  5. [*]         NFS client support for the NFSv3 ACL protocol extension
  6. [*]     Root file system on NFS                                    
复制代码
4). 串口配置
13.png
  1.     System Type  --->                       
  2. (2)   S3C UART to use for low-level messages
复制代码
5). 交叉编译
14.png
  1.     General setup  --->                             
  2. (arm-none-linux-gnueabi-)   Cross-compiler tool prefix
复制代码
配置完成后,使用方向键选择“Save”以保存配置。
15.png

配置并保存成功~
4、编译Linux系统内核

因为是针对的exynos4412编译的Linux内核,而exynos4412使用的引导程序是U-Boot,所以把编译好的Linux内核文件封装成uImage格式是比较好的选择。
uImage是一种经过封装的内核镜像格式,它在嵌入式系统中较为常用,特别是使用U-Boot作为引导加载器的系统。这种格式在普通的内核镜像基础上添加了一个头部信息,该头部信息包含了镜像的加载地址、入口地址、镜像大小等内容,便于U-Boot识别和加载内核。
命令make uImage的意思是让make工具依据Makefile里的规则来构建uImage格式的内核镜像。
那么,我们执行如下代码开始编译Linux系统内核:
  1. yu@Yubuntu:~/kernel/linux-3.14$ make uImage
复制代码
难搞,刚开始编译就报错了:
16.png
  1. /usr/bin/ld: scripts/dtc/dtc-parser.tab.o:(.bss+0x50): multiple definition of `yylloc'; scripts/dtc/dtc-lexer.lex.o:(.bss+0x0): first defined here
  2. collect2: error: ld returned 1 exit status
  3. make[2]: *** [scripts/Makefile.host:127:scripts/dtc/dtc] 错误 1
  4. make[1]: *** [scripts/Makefile.build:455:scripts/dtc] 错误 2
  5. make: *** [Makefile:527:scripts] 错误 2
复制代码
经查询,是因为GCC版本太高了导致的,我们可以稍作修改,使用如下命令编辑dtc-lexer.lex.c_shipped文件:
  1. yu@Yubuntu:~/kernel/linux-3.14$ vi scripts/dtc/dtc-lexer.lex.c_shipped
复制代码
在640行,在YYLTYPE yylloc;前面加上extern,即把YYLTYPE yylloc;改为extern YYLTYPE yylloc;:
17.png

保存并退出。
重新编译:
  1. yu@Yubuntu:~/kernel/linux-3.14$ make uImage
复制代码
好,这次编译了大概3分钟,现在又又出错了:
18.png
  1. "mkimage" command not found - U-Boot images will not be built
  2. make[1]: *** [/home/yu/kernel/linux-3.14/arch/arm/boot/Makefile:80:arch/arm/boot/uImage] 错误 1
  3. make: *** [/home/yu/kernel/linux-3.14/arch/arm/Makefile:305:uImage] 错误 2
复制代码
本次出错的原因在于找不到mkimage命令,我们需要安装U-Boot工具(u-boot-tools),这个是用于U-Boot引导加载程序的辅助工具集,可帮助我们进行U-Boot的配置、编译、调试以及映像文件处理等工作。
我们使用如下命令安装U-Boot工具:
  1. sudo apt-get install u-boot-tools
复制代码
19.png

好,继续编译:
  1. yu@Yubuntu:~/kernel/linux-3.14$ make uImage
复制代码
经过大约4分钟,编译完成~
20.png

编译好的内核二进制文件在arch/arm/boot目录下:
21.png

我们可以使用如下命令复制到TFTP服务器上去,方便等下开发板下载运行:
  1. yu@Yubuntu:~/kernel/linux-3.14/arch/arm/boot$ cp uImage ~/share/tftp/linux
复制代码
下面的步骤是可选的,本文仅做介绍。
5、编译内核模块

在使用make menuconfig配置Linux内核时,有的功能被设置为模块(M),模块不会在上一个步骤被编译进内核,我们需要单独编译,使用如下命令开始编译内核模块:
  1. yu@Yubuntu:~/kernel/linux-3.14$ make modules
复制代码
编译内核模块成功:
22.png

其中,以.ko结尾的即为内核模块(Kernel Object)文件。
我们将来在Linux中可以使用insmod或modprobe命令来加载.ko内核模块,使用rmmod 命令卸载内核模块。
6、查看编译耗时

使用如下命令可以查看编译耗时:
  1. yu@Yubuntu:~/kernel/linux-3.14$ $(which time) -v make uImage
复制代码
23.png

我这边耗时约3分钟。
贰、编译设备树

ARM芯片中很多功能,每个芯片的功能都不一样,为了解决硬件多样性与内核可移植性之间的矛盾,我们引入了设备树。设备树相当于一份硬件说明书,告诉内核什么设备在哪里。
1、创建设备树文件

我们使用的芯片是Exynos4412,在Linux中已存在相关的设备树文件了,但是已存在的不一定能直接使用,需要结合实际对其进行修改。
我们使用如下命令复制一份设备树文件:
  1. yu@Yubuntu:~/kernel/linux-3.14$ cp arch/arm/boot/dts/exynos4412-origen.dts arch/arm/boot/dts/exynos4412-ex4412.dts
复制代码
设备树文件与C语言文件一样,需要编译,故我们编辑对应的Makefile文件:
  1. yu@Yubuntu:~/kernel/linux-3.14$ vi arch/arm/boot/dts/Makefile
复制代码
24.png

我们同样的把“exynos4412-origen”的复制一份修改一下即可。
2、修改设备树文件

我们需要针对我们自己的硬件对设备树进行修改:
  1. yu@Yubuntu:~/kernel/linux-3.14$ vi arch/arm/boot/dts/exynos4412-ex4412.dts
复制代码
25.png

在根节点内添加网卡的硬件信息。
3、编译设备树文件

使用如下命令开始编译设备树文件:
  1. yu@Yubuntu:~/kernel/linux-3.14$ make dtbs
复制代码
26.png

编译好后的文件为arch/arm/boot/dts/exynos4412-ex4412.dtb,这个文件我们后面启动Linux内核时需要用到的,我们可以复制到TFTP服务器上去。
使用如下命令复制设备树文件到TFTP服务器上去:
  1. yu@Yubuntu:~/kernel/linux-3.14$ cp arch/arm/boot/dts/exynos4412-ex4412.dtb ~/share/tftp/dt.dtb
复制代码
叁、优化和运行

1、优化

我们需要对内核代码进行一下小小的修改,以便更适配我们的硬件:
1). 忽略无用的时钟,使用如下命令编辑相关代码:
  1. yu@Yubuntu:~/kernel/linux-3.14$ vi drivers/clk/clk.c
复制代码
27.png

修改完成后保存退出~
2). 优化eMMC,使用如下命令编辑相关代码:
  1. yu@Yubuntu:~/kernel/linux-3.14$ vi drivers/mmc/core/mmc.c
复制代码
28.png

修改完成后保存退出~
2、重新编译

1). 编译Linux内核:
  1. yu@Yubuntu:~/kernel/linux-3.14$ make uImage
复制代码
29.png

编译完成后使用如下命令把uImage复制到TFTP服务器上,方便开发板使用:
  1. yu@Yubuntu:~/kernel/linux-3.14$ cp arch/arm/boot/uImage ~/share/tftp/linux
复制代码
2). 编译设备树:
  1. yu@Yubuntu:~/kernel/linux-3.14$ make dtbs
复制代码
30.png

编译完成后使用如下命令把设备树文件复制到TFTP服务器上,方便开发板使用:
  1. yu@Yubuntu:~/kernel/linux-3.14$ cp arch/arm/boot/dts/exynos4412-ex4412.dtb ~/share/tftp/dt.dtb
复制代码
3、运行

配置好网络和U-Boot相关设置,启动开发板:
31.png

成功在开发板上运行我们自己编译的Linux内核~
肆、参考资料


  • https://patchwork.kernel.org/project/linux-kbuild/patch/1415098919-21836-1-git-send-email-syntheticpp@gmx.net/
  • https://www.kernel.org/pub/linux/kernel/v3.x/
  • https://www.kernel.org/
  • https://blog.csdn.net/zhoukaiqili/article/details/126191871
  • https://blog.csdn.net/eibo51/article/details/51901480

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册