转自:提取已有的内核配置文件

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

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 > (你要保存配置的文件名) 或  zgrep CONFIG_PPPOE /proc/config.gz
     这个方法简单,但是也有他的局限性,首先必须配置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)》

获取linux内核的配置项(包含模块module)_转的更多相关文章

  1. 解析Linux内核的基本的模块管理与时间管理操作---超时处理【转】

    转自:http://www.jb51.net/article/79960.htm 这篇文章主要介绍了Linux内核的基本的模块管理与时间管理操作,包括模块加载卸载函数的使用和定时器的用法等知识,需要的 ...

  2. 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #1 如何获取Linux内核

    HACK #1 如何获取Linux内核 本节介绍获取Linux内核源代码的各种方法.“获取内核”这个说法看似简单,其实Linux内核有很多种衍生版本.要找出自己想要的源代码到底是哪一个,必须首先理解各 ...

  3. Linux内核监控模块-1-驱动模块(LKM)开发(以一个简单的hello world程序为例)

    在上面一篇中介绍到,监控模块要做成一个驱动模块(或者说是可加载模块,LKM),动态的加载到Linux内核中.那么这篇就简单的介绍一下怎样做一个这样的驱动模块.   以简单的hello world程序为 ...

  4. Linux内核入门到放弃-模块-《深入Linux内核架构》笔记

    使用模块 依赖关系 modutils标准工具集中的depmod工具可用于计算系统的各个模块之间的依赖关系.每次系统启动时或新模块安装后,通常都会运行该程序.找到的依赖关系保存在一个列表中.默认情况下, ...

  5. [driver]linux内核动态加载模块

    问题: 1. 把编译好的模块放到板子/lib/modules对应文件夹下,并且执行了depmod -a, 比如pl2303.ko, 那么下一次插入pl2303的串口线,是否可以识别,也就是自动加载pl ...

  6. 获取Linux内核未导出符号的几种方式

    从Linux内核的2.6某个版本开始,内核引入了导出符号的机制.只有在内核中使用EXPORT_SYMBOL或EXPORT_SYMBOL_GPL导出的符号才能在内核模块中直接使用.然而,内核并没有导出所 ...

  7. Linux内核启动流程与模块机制

    本文旨在简单的介绍一下Linux的启动流程与模块机制: Linux启动的C入口位于/Linux.2.6.22.6/init/main.c::start_kernel() 下图简要的描述了一下内核初始化 ...

  8. Linux内核调用SPI平台级驱动_实现OLED的显示功能

    Linux内核调用SPI驱动_实现OLED显示功能 0. 导语 进入Linux的世界,发现真的是无比的有趣,也发现搞Linux驱动从底层嵌入式搞起真的是很有益处.我们在单片机.DSP这些无操作系统的裸 ...

  9. 如何获取linux内核的某个子系统的维护者邮箱?

    答: 如获取pwm子系统的维护者邮箱: ./scripts/get_maintainer.pl drivers/pwm

随机推荐

  1. JSP相关知识

    1.JSP的3个编译指令 pag include taglib 2.JSP的7个动作指令 forward include useBean setProperty getProperty plugin ...

  2. elasticsearch 小试牛刀

  3. CentOS7.2安装pure-ftpd 及其配置项

    CentOS7.2安装FTP(pure-ftpd-1.0.43) 原文链接: https://www.linuxidc.com/Linux/2016-10/135971.htm [日期:2016-10 ...

  4. Four Node.js Gotchas that Operations Teams Should Know about

    There is no doubt that Node.js is one of the fastest growing platforms today. It can be found at sta ...

  5. haproxy 关闭ssl3

    在使用的过程中,我们发现在用IE浏览器的时候 我们设置成 然后我们的网站会出现部分页面不出来 然后我们也发现在扫面网站链接的时候 所以当务之急是关闭ssl3 我这里的反向代理使用的是haproxy 版 ...

  6. iOS 画平滑曲线的方法及取音频数据的方法

    源码:http://files.cnblogs.com/ios8/iOS%E5%BF%83%E7%94%B5%E5%9B%BEDemo.zip 取音频数据和画波形图的方法 ViewController ...

  7. 简单修改文件名python脚本

    import os import sys path = "D:\emojis" for (path,dirs,files) in os.walk(path): for filena ...

  8. 在IIS服务器上屏蔽IP的访问

    今天就跟大家分享一下在IIS服务器上如何屏蔽特定IP的访问,希望对大家有所帮助. 第一种方法:通过iis中的ip地址和域名限制. 此方法简单有效,建议使用 点击网站--右键属性--目录安全性--IP地 ...

  9. kafka消费者如何才能从头开始消费某个topic的全量数据

    消费者要从头开始消费某个topic的全量数据,需要满足2个条件(spring-kafka): (1)使用一个全新的"group.id"(就是之前没有被任何消费者使用过); (2)指 ...

  10. Vue项目页面跳转时候的,浏览器窗口上方的进度条显示

    1.安装: cnpm install --save nprogress 2.在main.js中引入: import NProgress from 'nprogress' import 'nprogre ...