提取已有的内核配置文件

由于有时候所做的内核配置文件需要移植到其他的内核源码中,此时又忘了保存,这时以下方法就可以满足你了。

1.首先这两个配置的位于(init/Kconfig):

2. 如果要内核保存内核的配置,必须先选择 <*> Kernel .config support,这个选项作用是让内核在编译的时候将.config文件做gz压缩后将其转换为一个放置于只读数据段的大字符数组“static const char kernel_config_data”中最后通过config.o连接进内核。

如果在这个基础上选择了“[*] Enable access to .config through /proc/config.gz”就在保持内核配置到数组的基础上,提供一个用户空间读取这个数组的procfs文件接口。实现这个功能的是由内核的kernel/Makefile和kernel/configs.c共同完成的。下面详细解析一下

(1)如果配置了CONFIG_IKCONFIG就要生产 configs.o 文件

(2) configs.o 文件依赖 $(obj)/config_data.h文件,隐含的生成条件是通过configs.c文件编译生成。而在configs.c文件中包含了$(obj)/config_data.h文件。

(3) $(obj)/config_data.h文件的生成依赖$(obj)/config_data.gz,并强制每次编译都重新生成$(obj)/config_data.h文件(FORCE)。这个文件的生成规则是(5)

(4)$(obj)/config_data.gz文件的生成依赖$(KCONFIG_CONFIG)(也就是内核配置文件.config),并强制每次编译都重新生成$(obj)/config_data.gz(FORCE)。这个文件的生成是通过将.config执行gzip压缩生成的。

(5)这里其实就是执行一个shell指令,将$(obj)/config_data.gz文件中的数据通过内核工具程序scripts/bin2c放入一个名为“kernel_config_data”的字符数组中,并以MAGIC_START(宏:"IKCFG_ST")开头,MAGIC_END(宏: "IKCFG_ED")结尾。

最后这个configs.o文件会被连接进内核,如果你的内核中配置了CONFIG_KALLSYMS,那么你就可以在/proc/kallsyms中看到“kernel_config_data”这个符号。

如果你配置了CONFIG_IKCONFIG_PROC,那么configs.c中的procfs文件系统接口模块就会被编译进去,其实就是实现了对这个字符数组的读取和定位的功能。

上面的生产过程介绍完了,现在用一个图来总结一下过程 :

上面介绍了内核映像中内核配合信息的生成,接下来就看要如何获取了。从上面的介绍中其实不能看出获取的方法有两种:

1、在运行时通过/proc/config.gz获取:

在控制台输入命令:cat /proc/config.gz | gzip -d > (你要保存配置的文件名)

这个方法简单,但是也有他的局限性,首先必须配置CONFIG_IKCONFIG_PROC,其次必须在系统运行时进行获取。

2、可以直接通过编译好的内核映像:vmlinux、zImage、uImage等直接获取

这个方法其实也非常简单,内核黑客们已经帮我们做好了提取工具了:scripts/extract-ikconfig。使用起来超简单:

(如果是交叉编译,那就在宿主机)输入如下命令:(内核源码路径)scripts/extract-ikconfig (内核映像路径) > (你要保存配置的文件名)

这个工具对于gz压缩方式是支持一贯不错,从2.6.37开始支持bzip2、 lzma 和 lzo压缩方式,从2.6.39开始支持 xz压缩方式。这些从内核的git log中可以看出。

3、从内核逻辑地址空间提取:

从上面的的生成介绍中我们可以知道,配置文件的压缩文件其实就在内核映像的只读数据段中。如果内核在运行的时候,其实数据在内核逻辑地址空间中可以找到。方法概况如下:

(1)通过/proc/kallsyms找到“kernel_config_data”这个符号对应的内核逻辑地址

(2)通过/dev/kmem和上面得到的逻辑地址获取数据。压缩文件数据就在:"IKCFG_ST"与"IKCFG_ED"之间。

这个步骤需要自己写一小段的C代码,可以参考devkmem的代码(《对于驱动调试有用的两个小工具(devmem2、devkmem)》

时间: 2024-12-29 08:00:30

提取已有的内核配置文件的相关文章

Linux编译模块小技巧-内核配置文件快速查询模块

# Linux编译模块小技巧-内核配置文件快速查询模块# 参考: https://www.linuxidc.com/Linux/2016-10/136157.htmFeb 09 00:49:17 ArchLinux mount[336]: modprobe: FATAL: Module fuse not found in directory /lib/modules/5.5.2Feb 09 00:49:17 ArchLinux mount[289]: fuse: device not found

WIN7提示“您已使用临时配置文件登陆”的解决方案

问题出现的很恶心.浪费时间不说,还是会让人弄的很烦躁. 首先,我可能是在个人的文件夹下,使用360强制删除了系统占用的文件, 具体是什么不知道了. 现在只想知道如何恢复,很反感,大半夜的了,弄了个这,浪费了几个小时.:< 方案1 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList下找到有问题的帐号并删除 实测结果:没有用,不可行. 未完待续. 2018.10.30 原文地址:https://www

CentOS6.5升级内核到3.10.28 --已验证

本文适用于CentOS 6.4, CentOS 6.5,估计也适用于其他Linux发行版. 1. 准备工作 确认内核及版本信息 [root@hostname ~]# uname -r 2.6.32-220.el6.x86_64 [root@hostname ~]# cat /etc/centos-release CentOS release 6.5 (Final) 安装软件 编译安装新内核,依赖于开发环境和开发库 # yum grouplist //查看已经安装的和未安装的软件包组,来判断我们是

Python提取Linux内核源代码的目录结构

今天用Python提取了Linux内核源代码的目录树结构,没有怎么写过脚本程序,我居然折腾了2个小时,先是如何枚举出给定目录下的所有文件和文件夹,os.walk可以实现列举,但是os.walk是只给出目录名和文件名,而没有绝对路径.使用os.path.listdir可以达到这个目的,然后是创建目录,由于当目录存在是会提示创建失败的错误,所以我先想删除所有目录,然后再创建,但是发现还是有问题,最好还是使用判断如果不存在才创建目录,存在时就不创建,贴下代码: # @This script can b

linux内核空间与用户空间信息交互方法

linux内核空间与用户空间信息交互方法 本文作者: 康华:计算机硕士,主要从事Linux操作系统内核.Linux技术标准.计算机安全.软件测试等领域的研究与开发工作,现就职于信息产业部软件与集成电路促进中心所属的MII-HP Linux软件实验室.如果需要可以联系通过[email protected]联系他. 摘要:在进行设备驱动程序,内核功能模块等系统级开发时,通常需要在内核和用户程序之间交换信息.Linux提供了多种方法可以用来完成这些任务.本文总结了各种常用的信息交换方法,并用简单的例子

ubuntu 下面编译内核

1. 安装编译内核环境工具 <pre name="code" class="html">sudo apt-get install build-essential kernel-package libncurses5-dev libqt3-headers build-essential (基本的编程库(gcc, make 等) kernel-package (Debian 系统里生成 kernel-image 的一些配置文件和工具) libncurses5

CentOS 6.x 内核升级(2.6.32 -&gt; 3.10.58)过程记录

1. 准备工作 确认内核及版本信息 [[email protected] ~]# uname -r2.6.32-220.el6.x86_64 [[email protected] ~]# cat /etc/centos-release CentOS release 6.2 (Final) 安装软件 编译安装新内核,依赖于开发环境和开发库 # yum grouplist  //查看已经安装的和未安装的软件包组,来判断我们是否安装了相应的开发环境和开发库: # yum groupinstall "D

redhat6 内核编译

下载内核  www.kernel.org 2.安装开发工具库 Development Tools,Development Libraries 2.1配置yum # cd /etc/yum.repos.d/ # vim local.repo [base] name=Server baseurl=file:///media/cdrom/ enable=1 gpgcheck=0 2.2安装 #  yum -y groupinstall "Development Tools" "De

解析 Linux 内核可装载模块的版本检查机制

转自:http://www.ibm.com/developerworks/cn/linux/l-cn-kernelmodules/ 为保持 Linux 内核的稳定与可持续发展,内核在发展过程中引进了可装载模块这一特性.内核可装载模块就是可在内核运行时加载到内核的一组代码.通常 , 我们会在两个版本不同的内核上装载同一模块失败,即使是在两个相邻的补丁级(Patch Level)版本上.这是因为内核在引入可装载模块的同时,对模块采取了版本信息校验.这是一个与模块代码无关,却与内核相连的机制.该校验机