linux内核编译体验篇(一)
文章目录
一. 准备环境
编译内核之前有一些基本的条件:
- 有一台可以联网的机器(或者虚拟机)
- 安装有linux系统(作者安装的查看linux内核版本号如下)

- 学习一些基本的命令操作
除此之外对linux系统还要求一些软件包的安装(可能不全,在编译过程中遇到提示可以度娘或者使用google搜索是缺了哪个包,基本上你能遇到的坑前面的人都有踩过)。
二. 获取内核源码
官网链接:https://www.kernel.org/
Linux2.6所有内核下载地址:Linux2.6所有内核下载地址
Git下载安装及设置详细教程链接:Git下载安装及设置详细教程
| 下载方式 | 链接地址 |
|---|---|
| HTTP | https://www.kernel.org/pub/ |
| GIT | https://git.kernel.org/ |
三. 交叉编译工具链的配置
1. 博友们常用安装方法链接
Ubuntu 16.04[64bit]嵌入式交叉编译环境arm-linux-gcc搭建过程图解
Ubuntu 18.04安装arm-linux-gcc交叉编译器(超简单,附安装包下载地址)
2. 公司常用的交叉工具链使用方法
一般在公司工作,一个团队都是共用一个服务器,如果每个人为了配置自己的工具链都去更改服务器的配置和系统环境变量。无疑将会影响别人的使用。一个典型的例子就是现在很多内核都是使用64位的交叉编译工具链,而用户态是使用32位的交叉编译工具链。这时开发人员通常采用的方法是 大家都把工具链放在服务器的一个指定目录下(如新建一个目录tools_chain),在顶层Makefile或者调用顶层Makefile的脚本中传入 CROSS_COMPILE 的全路径。这样也不会因为要使用不同工具链都要重新安装一遍。我的虚拟机工具链配置如下:
CROSS_COMPILE = /home/hh/tools_chain/opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-
四. 内核解压以及如何打补丁
可以参考以下网址或者百度,我在这里就不再赘述(作者使用的是较老的内核2.6.38无补丁,目前官网提供有比较新的内核,都有对应的补丁)
内核源码解压.打补丁以及配置.编译方法
五. 内核基本配置
和大部分开源软件类似,linux kernel也是要配置之后才能够编译的。主要提到常用的两种配置方法,如下:
#make config(基于文本的最为传统的配置界面,不推荐使用)
#make menuconfig(基于文本选单的配置界面,字符终端下推荐使用)
目的都是生成一个.config文件,推荐使用make menuconfig方式,毕竟是界面交互比文字交互好用很多。
选择相应的配置时,有三种选择,它们分别代表的含义如下:
Y--将该功能编译进内核
N--不将该功能编译进内核
M--将该功能编译成可以在需要时动态插入到内核中的模块
1. 编译前的配置
编译之前,在linux-2.6.38\arch\arm\configs目录下找到对应开发板的(或者与之相似的配置文件,或者厂商提供好的配置文件)。作者使用的是tiny-mini6410,因此找最相似的s3c6400_defconfig或者厂商提供的config_linux_mini6410文件,放到linux-2.6.38源码最外层目录,并更名为.config
cd linux-2.6.38
make menuconfig
执行完,你可以看到如下的配置界面。

知道我喜欢用这个了的原因了吧,因为好用啊。
温馨提示:
在执行make menuconfig的时候,可能会遇到一些提示说某些包没有安装导致执行失败。大家不要慌,究其原因是因为配置的过程实际上是内核先编译了一个用户态的配置工具,这个过程就需要依赖的软件包有: make, gcc, ld 和图形库libncurse-dev。不用紧张,按照提示或者自习度娘,缺什么软件就安装什么软件就好了。
比如:作者在编译这个内核的时候出现了如下编译错误:

度娘得到的解决方式:
sudo apt-get install ncurses-dev

再次执行make menuconfig命令,执行完,你可以看到上述的配置界面。
2. uImage的编译命令
编译命令如下:
hh@ubuntu:~/linux-2.6.38$ sudo make uImage
附注:
基于ARMV8架构的cortex-A53开发板在选型中,等到手后,会继续更新 较新版本内核的编译方式。
linux内核编译体验篇(一)的更多相关文章
- Lab1:Linux内核编译及添加系统调用(详细版)
实验一:Linux内核编译及添加系统调用(HDU) 花了一上午的时间来写这个,良心制作,发现自己刚学的时候没有找到很详细的,就是泛泛的说了下细节地方也没有,于是自己写了这个,有点长,如果你认真的看完了 ...
- 运行在TQ2440开发板上以及X86平台上的linux内核编译
一.运行在TQ2440开发板上的linux内核编译 1.获取源码并解压 直接使用天嵌移植好的“linux-2.6.30.4_20100531.tar.bz2”源码包. 解压(天嵌默认解压到/opt/E ...
- linux内核编译环境配置
linux内核编译环境配置 如果不是编译内核,只需要安装与内核相匹配的kernel-devel开发包即可.即是/lib/modules/`uname -r`/build -> /usr/src/ ...
- Linux内核编译与安装
2013-04-16 Linux内核介绍 Linux内核是一个用C语言写成的,符合POSIX标准的类Unix操作系统.内核是操作系统中最基本的一部分,提供了众多应用程序访问计算机硬件的机制.L ...
- Linux内核编译、安装流程
原文链接:https://blog.csdn.net/qq_28437139/article/details/83692907 此处只讲linux内核编译步骤至于安装虚拟机,安装ubuntu操作系统请 ...
- Linux内核编译完整过程
Linux内核编译完整过程 通过网上的资料我自己的实际内核编译,我把对Linux内核编译的过程写在这里,也许对其他的Linux爱好者的编译学习有些帮助,其中很大部分是网上的资料,另外就是我在实际编译过 ...
- Linux 内核 编译模块
背景: 由于调试内核或者由于分区大小限制,有时候内核组件不一定完全需要编进内核中. 所以,在开发中经常将内核组件编译成为模块,等到在恰当的时机加载. 概览: Linux内核模块的编译方法有两种: 1. ...
- Linux内核编译配置脚本
环境 宿主机平台:Ubuntu 16.04.6 目标机:iMX6ULL Linux内核编译配置脚本 在linux开发过程中熟练使用脚本可以大大简化命令行操作,同时对于需要经常重复操作的指令也是一种备忘 ...
- linux内核编译步骤
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- 最全最详细:ubuntu16.04下linux内核编译以及设备驱动程序的编写(针对新手而写)
写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...
随机推荐
- 简单的了解下 Fetch API 的工作原理
一.简介 Fetch API是一种现代的Web API,提供了一种异步获取网络资源的方法.由于其简单性.灵活性和一致性,它已经成为Web应用程序中获取数据和资源的流行选择.在本文中,我们将深入探讨Fe ...
- Redis的缓存穿透+解决方案
1.缓存穿透现象介绍 缓存穿透 :缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库. 常见的解决方案有两种: 缓存空对象 优点:实现简单,维护方便 ...
- C# List转SqlServer、MySql中in字符串
var oneList = new List<string> { "1", "2", "3" }; var oneString ...
- Java 网络编程 —— Socket 详解
构造 Socket 在[客户端/服务端]的通信模式中,客户端需要主动构造与服务器连接的 Socket,构造方法有以下几种重载形式: Socket() Socket(InetAddress addres ...
- 【H5】Emmet 指令 HTML
Emmet操作指南 HTML篇 生成带有内容的标签 标签名{内容}可以生成带有内容的标签 div{abc} <div>abc</div> 生成带有属性的标签 生成带有class ...
- selenium 多窗口处理与网页frame
多窗口处理 点击某些链接,会重新打开一个窗口,对于这种情况.想在薪页面操作,就得先切换窗口了. 获取窗口得唯一标识用句柄表示,所以只需要切换句柄,就可以在多个页面进行操作了 1. 先获取到当前得窗口句 ...
- 自建CA和公共CA有什么不同?
据统计,全球有数百个公共CA,通常它们是按国家地区进行划分的.这类CA受大众的广泛认可和使用,也被称为公共信任的证书颁发机构.但是由于一些大型企业拥有许多站点,为了更轻松高效的管理以及考虑到维护成本, ...
- 2021-11-27:给定一个数组arr,长度为N,做出一个结构,可以高效的做如下的查询: 1) int querySum(L,R) : 查询arr[L...R]上的累加和; 2) int query
2021-11-27:给定一个数组arr,长度为N,做出一个结构,可以高效的做如下的查询: int querySum(L,R) : 查询arr[L-R]上的累加和; int queryAim(L,R) ...
- SQL Server临时表删除
SQL Server临时表删除 IF (SELECT object_id('tempdb..#tmpacqichu')) is not null DROP TABLE #tmpacqichu
- vue 版本查看
如何查看vue版本号? 方法1.全局查看vue版本号 npm info vue方法2.局部(当前项目)查vue版本号 npm list vue version方法3.此外还可以通过 package.j ...