如何编译Linux内核源码?
前言
学习Linux内核是一件振奋人心的事情,而在学习伊始对Linux内核的成功编译并运行一个mini版的文件系统也更会燃起更足的动力去钻研。本文从下载并编译Linux内核、编译busybox、制作一个最小的根文件系统,最后用qemu启动你编译好的内核和根文件系统 ,初步感受Linux内核的魅力所在。
Linux用途广泛,包含的内容也琳琅满目。Linux系统的基础是内核、C库、工具集合系统的基本工具(如登录程序和Shell)。应用程序通过system call陷入内核,内核又通过驱动程序来与硬件交互。
应用程序、内核和硬件的关系
首先明确两点:
- 配置内核就是你来决定编码哪些代码;
- 编译内核就是生成可执行文件的一个过程。
再明确内核文件的产物名称:
- vmlinux:原始的,未经压缩的内核可执行文件
- zImage:压缩过的可执行文件——压缩vmlinux后,加上一个head part(用来解压)
- uImage:用于给uboot引导的zImage
- bzImage:即bigzImage ,通过gzip压缩的
好了,明确了上述几点,就可以开始实验了。本文的实验环境如下:
- Linux系统:ubuntu 14.04
- linux源码版本:linux-4.9.229
- busybox源码版本:busybox-1.30.0
- qemu-system-x86_64版本:2.0.0
1.下载并编译Linux内核
https://www.kernel.org/
下载并解压后,进入目录。
1.指定硬件体系架构
为了演示方便,选用了x86架构,如果编译arm则需要再下载对应的toolchain。
$ export ARCH=x86
2.配置board config
$ make x86_64_defconfig
3.配置内核
这一步其实是对第2步的进行微调,这里我们使用基于ncurse库编制的图形界面工具:
$ make menuconfig
如果执行该命令时出现:
原因:缺少ncurses dev工具
sudo apt-get install libncurses5-dev
如果需要内核支持ramdisk驱动,需要选中如下配置:
General setup --->----> [*] Initial RAM filesystem and RAM disk (initramfs/initrd) supportDevice Drivers --->[*] Block devices ---><*> RAM block device support(65536) Default RAM disk size (kbytes)
4.编译内核
$ make -j8
编译成功后的内核位于:arch/x86_64/boot/bzImage
至此,内核编译完成。
2.编译busybox
什么是busybox?
busybox号称“嵌入式Linux的瑞士军刀”。BusyBox工具小巧高效,可以替代一大批常用的标准Linux命令行工具,功能有所简化,非常适合资源有限的嵌入式平台。BusyBox是模块化且高度可配置的,可以对其进行裁剪以满足特定需求。
在如下链接下载busybox:
https://busybox.net/downloads/busybox.net/downloads/
我们以busybox-1.30.0作为实验对象。
下载之后解压并进入该busybox目录开始配置并编译。这里把busybox配置为静态编译,这样不依赖其他动态库比较容易操作和演示。编译则似曾相识,与编译内核的指令是一样的!
$ make menuconfigBusybox Settings --->Build Options --->[*] Build BusyBox as a static binary (no shared libs)
配置完之后进行编译和安装
$ make && make install
make是编译busybox,make install是为了在对应目录中编译安装一系列的工具。
编译完成后的busybox就安装在源码根目录下的_install目录了。
总结
至此,我们对Linux内核和busybox进行了配置和编译。光编译肯定不过瘾,下一讲来演示如果基于busybox制作一个简单的文件系统,并通过qemu模拟器运行Linux,真正的让内核工作起来!
如何编译Linux内核源码?相关推荐
- Redhat7.2上编译Linux内核源码
下载linux源码包:https://git.kernel.org/pub/scm/virt/kvm/kvm.git/snapshot/kvm-4.17-1.tar.gz (这是包含kvm开发版本的l ...
- debian 编译linux内核源码,Debian下为本机编译内核模块的方法
改用Debian之后发现用之前在Red Hat下编译内核模块的Makefile不好使了,原因是在/lib/modules/`uname -r`/下没有了build目录,也没有内核的源代码.上网查了一些 ...
- debian 编译linux内核源码,安装debian总结以及编译linux内核
1. 安装debian 使用unetbootin(http://unetbootin.sourceforge.net/)来创建启动盘,并且下载debian的基本包. 将磁盘进行压缩操作,并且保留出一个 ...
- 最小的linux内核代码,带你阅读linux内核源码:下载源码、编译内核并运行一个最小系统...
要学习linux内核,先要能够编译内核,还需要了解内核如何启动根文件系统.这样你才能在修改linux内核代码之后,完成验证的过程. 本文教你完成下列过程: 1.下载linux并编译linux内核源码 ...
- linux内核开发基础(linux内核源码、树莓派源码编译、SD卡挂载)
首先下载树莓派linux内核源码: 下载网址:https://github.com/raspberrypi/linux 在树莓派使用指令:uname -r查看当前树莓派的版本号,然后选择对应的linu ...
- 【linux内核-源码编译之centos7】
linux内核-源码编译之centos7 一. 为什么要编译内核 二.疑难杂症 三.演示环境 四.下载源码 4.1.两者源码区别 4.2.将获取到的源码放在/usr/src/kernels/ 下 五. ...
- ARM树莓派高级开发——linux内核源码、树莓派源码编译、SD卡挂载
文章目录 linux内核开发基础(linux内核源码.树莓派源码编译.SD卡挂载) 树莓派等芯片带操作系统的启动过程 linux内核源码树 Linux内核源代码目录树结构: 树莓派Linux源码配置 ...
- 编译linux源码报错,记录一次Linux内核源码编译实验
记录一次Linux内核源码编译实验 文章目录 记录一次Linux内核源码编译实验 0. 实验环境 1. 选择.下载内核源码 2. 安装必要的依赖软件以及性能要求 3. 解压.配置和编译内核源码 3.1 ...
- xilinx linux内核,Xilinx-Zynq Linux内核源码编译过程
本文内容依据http://www.wiki.xilinx.com网址编写,编译所用操作系统为ubuntu 14 1.交叉编译环境的安装配置 2.uboot的编译 1)下载uboot源代码 下载uboo ...
- 【Linux 内核】编译 Linux 内核 ② ( 解压内核源码 | 查询当前 Linux 内核版本号 | 进入并查看 linux 内核源码目录 )
文章目录 一.解压内核源码 二.查询当前 Linux 内核版本号 三.进入并查看 linux 内核源码目录 一.解压内核源码 将 下载的 Linux 内核源码 linux-5.6.14.tar.gz ...
最新文章
- spring mvc DispatcherServlet详解之interceptor和filter的区别
- 初等数论--同余方程--同余方程运算:模逆运算,模指数运算
- python设置函数执行时间
- Effective C++ 条款11:在operator=中处理自我赋值
- 【转载】不带www跳转www.设定网站唯一入口,提升权重!
- 刷抖音看到 Python 工程师的工资条后,我沉默了...
- python找数字程序_程序以查找Python中从1到N的所有缺失数字
- AES SBox的构造(python)
- 线性表的基本操作Basic operation of SequenceList
- 一般处理程序里使用session对象为null,未将对象引用到实例化
- 松下PLC连接海创-IIoT平台案例
- vbs返回结果给java_返回vbs脚本
- vs2015 使用Qt语言家及其使用过程中遇到的问题
- win10微信卡顿_终于找到Win10卡顿病根了!看完秒懂
- C语言刷题训练营-第一讲
- Android大举进入智能电视领域
- golang操作chromedp模拟浏览器基础入门
- 10首现代诗歌欣赏:什么是孤独
- 【前瞻】Nature:2022年7大“颠覆性”技术
- php关于页面卡顿问题