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

零、准备

1、下载

Linux-3.14内核源代码

下载后得到以下文件:

yu@Yubuntu:~/kernel$ ls -l
总计 76568
-rw-rw-r-- 1 yu yu 78399152 4月 9 01:21 linux-3.14.tar.xz

2、解压

yu@Yubuntu:~/kernel$ tar -vxf linux-3.14.tar.xz

解压后得到如下文件:

yu@Yubuntu:~/kernel$ ls -l
总计 76572
drwxrwxr-x 23 yu yu 4096 3月 31 2014 linux-3.14
-rw-rw-r-- 1 yu yu 78399152 4月 9 01:21 linux-3.14.tar.xz

壹、编译

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

设置CPU架构和交叉编译器的方法有几种,临时设置、通过环境变量设置和修改Makefile设置。基于实际情况,在本次编译中,我希望我把我修改好的内核发给别人同样有效,而且我只针对一种CPU指令集来配置的,所以我选择修改Makefile

使用vi编辑Makefile

yu@Yubuntu:~/kernel$ cd linux-3.14/

yu@Yubuntu:~/kernel/linux-3.14$ vi Makefile

把198、199行的

ARCH        ?= $(SUBARCH)
CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)

改为

ARCH        ?= arm
CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)



保存并退出~

注:这里关于交叉编译器的安装和配置就不再介绍了。

2、设置处理器

使用如下命令设置处理器:

yu@Yubuntu:~/kernel/linux-3.14$ make exynos_defconfig

难搞,报警告了,具体情况如下:

In file included from scripts/kconfig/zconf.tab.c:2537:
scripts/kconfig/menu.c: In function ‘get_symbol_str’:
scripts/kconfig/menu.c:587:46: warning: ‘jump’ may be used uninitialized in this function [-Wmaybe-uninitialized]
587 | jump->offset = strlen(r->s);
| ~~~~~~~~~~~~~^~~~~~~~~~~~~~
scripts/kconfig/menu.c:548:26: note: ‘jump’ was declared here
548 | struct jump_key *jump;
| ^~~~

没关系,Linux论坛上已有解决方案了:

https://patchwork.kernel.org/project/linux-kbuild/patch/1415098919-21836-1-git-send-email-syntheticpp@gmx.net/

我们按照这个页面上的来修改我们的代码:

yu@Yubuntu:~/kernel/linux-3.14$ vi scripts/kconfig/menu.c

把548行的struct jump_key *jump;改为struct jump_key *jump = NULL;

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



保存退出~

重新使用如下命令设置处理器:

yu@Yubuntu:~/kernel/linux-3.14$ make exynos_defconfig

搞定!

3、配置Linux系统内核

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

其中,我们比较常用的是make menuconfig,对于远程使用SSH连接的同学友好些。

但是它需要一些依赖,可以使用如下命令安装对应的依赖:

sudo apt-get install libncurses5-dev

libncurses5-dev是一个基于文本的GUI开发库,用于支持在C等编程语言中开发基于文本终端的交互式应用程序,提供了屏幕绘制、键盘输入处理等功能。

另外,make menuconfig对屏幕大小有一定要求,把当前命令窗口拉伸到最大后执行如下命令开始配置:

yu@Yubuntu:~/kernel/linux-3.14$ make menuconfig



界面上方的文本即是使用帮助,同学们可以自己阅读一下,本文不介绍如何配置Linux内核,同学们根据自己的需要在此界面修改好Linux内核配置后再往下。



配置并保存成功~

4、编译Linux系统内核

因为是针对的exynos4412编译的Linux内核,而exynos4412使用的引导程序是U-Boot,所以把编译好的Linux内核文件封装成uImage格式是比较好的选择。

uImage是一种经过封装的内核镜像格式,它在嵌入式系统中较为常用,特别是使用U-Boot作为引导加载器的系统。这种格式在普通的内核镜像基础上添加了一个头部信息,该头部信息包含了镜像的加载地址、入口地址、镜像大小等内容,便于U-Boot识别和加载内核。

命令make uImage的意思是让make工具依据Makefile里的规则来构建uImage格式的内核镜像。

那么,我们执行如下代码开始编译Linux系统内核:

yu@Yubuntu:~/kernel/linux-3.14$ make uImage

难搞,刚开始编译就报错了:

/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
collect2: error: ld returned 1 exit status
make[2]: *** [scripts/Makefile.host:127:scripts/dtc/dtc] 错误 1
make[1]: *** [scripts/Makefile.build:455:scripts/dtc] 错误 2
make: *** [Makefile:527:scripts] 错误 2

经查询,是因为GCC版本太高了导致的,我们可以稍作修改,使用如下命令编辑dtc-lexer.lex.c_shipped文件:

yu@Yubuntu:~/kernel/linux-3.14$ vi scripts/dtc/dtc-lexer.lex.c_shipped

在640行,在YYLTYPE yylloc;前面加上extern,即把YYLTYPE yylloc;改为extern YYLTYPE yylloc;



保存并退出。

重新编译:

yu@Yubuntu:~/kernel/linux-3.14$ make uImage

好,这次编译了大概3分钟,现在又又出错了:

"mkimage" command not found - U-Boot images will not be built
make[1]: *** [/home/yu/kernel/linux-3.14/arch/arm/boot/Makefile:80:arch/arm/boot/uImage] 错误 1
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工具:

sudo apt-get install u-boot-tools

好,继续编译:

yu@Yubuntu:~/kernel/linux-3.14$ make uImage

经过大约4分钟,编译完成~

编译好的文件在arch/arm/boot目录下:

5、编译内核模块

在使用make menuconfig配置Linux内核时,有的功能被设置为模块(M),模块不会在上一个步骤被编译进内核,我们需要单独编译,使用如下命令开始编译内核模块:

yu@Yubuntu:~/kernel/linux-3.14$ make modules

编译内核模块成功:



其中,以.ko结尾的即为内核模块(Kernel Object)文件。

我们将来在Linux中可以使用insmodmodprobe命令来加载.ko内核模块,使用rmmod 命令卸载内核模块。

6、查看编译耗时

使用如下命令可以查看编译耗时:

yu@Yubuntu:~/kernel/linux-3.14$ $(which time) -v make uImage

贰、参考资料

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

【Linux】编译用于exynos4412(ARM)的Linux-3.14内核的更多相关文章

  1. 调试exynos4412—ARM嵌入式Linux—LEDS/GPIO驱动之二

    /** ****************************************************************************** * @author    暴走的小 ...

  2. 调试exynos4412—ARM嵌入式Linux—LEDS/GPIO驱动之三

    /** ****************************************************************************** * @author    暴走的小 ...

  3. 调试exynos4412—ARM嵌入式Linux—LEDS/GPIO驱动之一

    /** ****************************************************************************** * @author    暴走的小 ...

  4. 【Linux编译环境的搭建】Linux都没有,怎么学Linux编程?

    本文准备从0开始,一步步搭建一套属于自己的多节点Linux系统环境,这将是后续学Linux.用Linux.Linux环境编程.应用和项目部署.工具实验等一系列学习和实践的基石,希望对小伙伴们有帮助. ...

  5. 浅析基于ARM的Linux下的系统调用的实现

    在Linux下系统调用是用软中断实现的,下面以一个简单的open例子简要分析一下应用层的open是如何调用到内核中的sys_open的. t8.c 1: #include <stdio.h> ...

  6. Linux时间子系统(十七) ARM generic timer驱动代码分析

    一.前言 关注ARM平台上timer driver(clocksource chip driver和clockevent chip driver)的驱动工程师应该会注意到timer硬件的演化过程.在单 ...

  7. Linux编译移植Qt4的环境_在OMAPL138平台

    Linux编译Qt4的环境_OMAPL138 手里有一块创龙OMAPL138的板子,我要在上面成功移植Qt环境和触摸屏幕,这是我第二次进行Linux的Qt环境移植,发现了很多问题,需要重新整理. 我编 ...

  8. Linux编译移植Qt5的环境_Xillinx的ZYNQ平台

    Linux编译Qt环境 2017年的十一假期,足不出户,一个人在教研室里面搞Qt的移植.我手里面有Samsung的CortexA8,Samsung的 CortexA53还有Ti的Sitara系列的AM ...

  9. arm驱动linux异步通知与异步IO【转】

    转自:http://blog.csdn.net/chinazhangzhong123/article/details/51638793 <[ arm驱动] linux异步通知与 异步IO> ...

  10. linux —— 编译linux内核

    目录:     0.测试环境 1.获得最新内核源代码  2.编译源代码 3.运行新的内核 0.测试环境: 我的系统 : ubuntu 16.04 LTS (内核版本:4.4.0-36-generic ...

随机推荐

  1. Luogu P7077 CSP-S2020 函数调用 题解 [ 蓝 ] [ 拓扑排序 ] [ 动态规划 ] [ 数学 ]

    函数调用:个人非常喜欢的一道拓扑题. 转化 这题一共有三种操作,不太好搞.而第一个函数看起来就比较可做,第三个函数显然就是让你拓扑转移,于是我们考虑第二个操作怎么处理. 当我们进行一个操作一后,假设当 ...

  2. windows配置maven

    1.下载mavenhttps://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/ 中找到相应的版本2.解压3.配置环境变量MAVEN_HOMED: ...

  3. RabbitMQ(四)——工作队列模式

    RabbitMQ系列 RabbitMQ(一)--简介 RabbitMQ(二)--模式类型 RabbitMQ(三)--简单模式 RabbitMQ(四)--工作队列模式 RabbitMQ(五)--发布订阅 ...

  4. Type-C协议(CC检测原理)-CC1和CC2接电阻-数字和模拟耳机兼容

    1 简介 USB Type-C其实是USB的一种接口形态,USB的接口形态可以分为USB Type-A.USB Type-B.USB Type-C,USB Type-A和USB Type-B还有两种不 ...

  5. EasyExcel合并行处理并优化

    业务场景 由于业务需要导出如下图中订单数据和订单项信息,而一个订单对应多个订单项,所以会涉及到自定义合并行 1.简单处理项目使用的EasyExcel,经查找发现Excel种有个AbstractMerg ...

  6. Golang 实现本地持久化缓存

    // Copyright (c) 2024 LiuShuKu // Project Name : balance // Author : liushuku@yeah.net package cache ...

  7. 【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体的替代品,可本地部署+知识库,注册即可有750w的token使用

    最近火山引擎推出了自家联网版的DeepSeekR1,并且加入了联网的功能,不用担心DeepSeek本体的服务器繁忙了,可以说直接是DeepSeek本体的替代品.现在注册即送30块体验价(相当于750w ...

  8. 开启 Typecho 的 gzip 压缩

    简介 GZip压缩,是一种网站速度优化技术,也是一把SEO优化利器,许多网站都采用了这种技术,以达到提升网页打开速度.缩短网页打开时间的目的. 网站采用Gzip压缩,还有一个好处,就是让你少了一份流量 ...

  9. SpringSecurity - [01] 概述

    Spring Security 是一个灵活且强大的工具,可以帮助你构建安全可靠的Spring应用程序.它不仅简化了认证和授权的过程,而且还提供了丰富的特性和扩展点,使得开发者可以根据项目的独特需求定制 ...

  10. Shell - [11] 开源Apache Zookeeper集群启停脚本

    一.集群角色部署 当前有Zookeeper集群如下 主机名 ctos79-01 ctos79-02 ctos79-03 Zookeeper ○ ○ ○ 二.脚本使用 三.脚本内容 #!/bin/bas ...