【华为云技术分享】Linux内核编程环境 (1)
在上一期中,我们介绍了Linux内核的源码结构,这一期我们介绍Linux内核编程环境,首先介绍的是Linux内核的编译方法。
一、Linux内核编译方法
本期中我们以Linux 4.19.94版内核来介绍内核编译的方法和流程。
首先,运行命令:
wgethttps://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.19.94.tar.xz
下载Linux内核4.19.94版的压缩包。https://cdn.kernel.org这个网站建立了Linux内核源码的档案馆,保存了Linux内核的主线版本和长期维护版本的最新源码以及更改历史等有用信息。
然后,运行命令:
tar xflinux-4.19.94.tar.xz
解压压缩包,得到内核目录linux-4.19.94。
进入内核目录,我们可以看到如下目录结构:
关于各个文件和文件夹的主要功能在上几期中已经介绍过了。其中Kconfig这个文件主要用来配置内核,它就是各种配置界面的源文件,内核的配置工具读取各个Kconfig文件,生成配置界面供开发人员配置内核,最后生成配置文件 .config[1]。
Linux提供了不同的配置选择界面,通过使用配置选择界面可以选择是否将某一模块编译入内核以及是否将代码编译为在需要时可动态插入到内核的代码。有config、menuconfig、xconfig和oldconfig等,推荐使用menuconfig。其中make config 提供基于文本的最为传统的配置界面;make menuconfig提供基于文本菜单的配置界面,需要安装ncurse ;make xconfig 提供基于QT的图形配置界面,要求安装QT软件包;makeoldconfig 以现有的.config文件为基础来更新当前配置[2]。运行make menuconfig命令,可以得到如下图形选择界面:
在这个界面中展示了许多选项和子目录,选中子目录按回车可以进入子目录菜单。进入子目录后一般有三种选项,选项的含义为:
(1)< * >或[*]:表示将该功能编译进内核;
(2)[ ]:表示不将该功能编译进内核;
(3)[M]:表示将该功能编译成在需要时动态插入到内核的代码。用户根据需要进行配置[3]。
改完之后退出保存修改。Makefile 可以说是编译代码的文件,它根据make menuconfig生成的.config宏和编译工具及内核源码来生成zImage二进制的镜像[4]。
然后运行命令:
sudomake -j8
sudomake -j8 modules_install
sudo make -j8 install
上面三步分别完成了内核的编译、内核模块的编译安装和内核的安装,-j8表示用8个线程编译,可以加快编译速度,不同的机器可能支持不同的最佳编译线程数目。
安装完之后可以打开/boot/grub/grub.cfg搜索4.19.94,如果安装成功可以看到启动项中包含了linux-4.19.94启动项:
安装完成之后重启系统,输入uname -a,如果内核版本为4.19.94就说明成功了。
在内核代码中可以通过以下方法来打印DEBUG日志信息。
printk(KERNDEBUG "%s %s %d\n",__ FILE __ , __ FUNCTION __ , __ LINE __ )
其中KERNDEBUG为日志级别,常用的日志级别有KERNINFO(提示信息)、KERNNOTICE(正常但重要的信息)、KERNWARNING(警告信息)和KERNERR(错误信息等)[5]。双引号之间的信息为打印的信息,而_ FILE __ 、__ FUNCTION __ 、__ LINE __则用来对代码进行跟踪调试,以显示代码所在的文件名、函数名和行数。
二、结语
本期我们介绍了Linux内核的编译方法,下一期中我们将通过一个实例介绍如何向内核中增加一个新的模块。
参考文献
[1]https://blog.csdn.net/u011425939/article/details/80472324
[2]http://www.mamicode.com/info-detail-1414999.html
[3]https://blog.csdn.net/lonnox/article/details/79506142
[4]https://blog.csdn.net/tiger15605353603/article/details/81323848
[5]https://blog.csdn.net/yuan892173701/article/details/7788208
[6]https://www.cnblogs.com/lifexy/p/7993136.html
相关文章
- linux驱动开发--内核空间中内存的申请与释放
- 【华为云技术分享】Linux内核编程环境 (2)
- 【华为云技术分享】Linux内核发展史 (2)
- linux学习知识
- linux(centos8):使用tree命令查看目录结构
- 从Linux移植到FreeBSD
- Linux常用命令学习
- Qt音视频开发06-海康sdk内核linux客户端
- Linux iptables防火墙详解(三)——iptables匹配条件
- linux deepin手动升级内核命令
- 《安富莱嵌入式周报》第285期:电子技术更新换代太快,我要躺平,Linux内核6.1已经并入RUST,一夜161个网站密码遭泄,Matlab精选课件,开源电子书
- 【华为云技术分享】Linux内核发展史 (2)
- 【Linux 内核 内存管理】伙伴分配器 ② ( 伙伴分配器分配内存流程 )
- 【Linux 内核 内存管理】物理内存组织结构 ③ ( 内存管理系统三级结构 | 内存节点描述 | 内存节点 pglist_data 结构体 | pglist_data 结构体源码 )
- 【Linux 内核 内存管理】内存管理架构 ② ( 用户空间内存管理 | malloc | ptmalloc | 内核空间内存管理 | sys_brk | sys_mmap | sys_munmap)
- 【Linux 内核】进程优先级与调度策略 ① ( SCHED_FIFO 调度策略 | SCHED_RR 调度策略 | 进程优先级 )
- 【Linux 内核】进程管理 task_struct 结构体 ⑤ ( files 字段 | nsproxy 字段 | 信号处理相关字段 | 信号量和共享内存相关字段 )
- 【Linux 内核】进程管理 task_struct 结构体 ④ ( comm 字段 | 进程优先级字段 | cpus_ptr 字段 | mm、active_mm 字段 | fs 字段 )
- Linux 内核开发—内核简单介绍
- 操作系统 linux 内核的三种进程调度方法
- 52.第十二章 Linux启动和内核管理 -- CentOS的启动管理(一)
- 9.第三章 Linux文件管理和IO重定向 -- 文件操作命令(二)
- linux操作系统 策略路由 —— 筑梦之路
- Linux通过使用Sambaserver示例
- Linux 系统目录结构
- Linux内核的裁剪移植,Linux内核裁剪移植学习分享
- 【看表情包学Linux】进程创建 | 进程终止 | 分叉函数 fork | 写时拷贝 | 内核数据结构缓冲池 | slab 分派器