1. 前言

对刚接触Linux kernel的同学来说,遇到的第一个问题就是:我该从哪里入手?、

话说Linux kernel的打开方式是多种多样的:从简单的设备驱动入手;从源代码的目录结构入手;从kernel的启动过程入手;从大的功能模块入手;等等。不管怎样,每条都是正途(条条大路通罗马嘛)。

而本文(以及随后的系列文章),将从Linux kernel的配置项入手,从整体上认识Linux kernel。之所以这么做,原因有二:

1)Linux kernel的配置项数目繁多,以至于进行kernel移植的时候,看到menuconfig界面后,会有深深的恐惧感(可参考下面图片1)。

2)配置项的目的,是功能配置和功能开关,从一定程度上可以看出一个软件的功能模块划分。以Linux kernel为例,Kconfig所呈现出来的树状结构,从功能划分的角度看,比source code的目录结构还清晰。

注1:本系列文章使用的Linux kernel版本是“X Project”所用的“Linux 4.6-rc5”,具体可参考“https://github.com/wowotechX/linux.git”。

2. Kernel配置项初识

Linux kernel的配置项,是以架构(ARCH)为单位,通过Kconfig语言组织在一起的。以ARM64为例,其Kconfig的入口位于:

arch/arm64/Kconfig

在Kernel根目录下以“ARCH=arm64”为参数,执行make menuconfig,可以得到如下的配置界面:

make ARCH=arm64 menuconfig

图片1 Kernel_menuconfig

第一个画面,还可以接受,毕竟画风清爽。但点进到二级菜单,脑袋就大了。不过不着急,我们一层一层的分析。

开始之前,先交代一下分析的手段,很简单,要点有四:

结合Kconfig文件;

跟随menuconfig的菜单项;

加上强大的Google;

必要时阅读source code。

另外,鉴于篇幅问题,本文只介绍Kconfig的一级菜单(就是图片1所能看到的部分),相当于一个索引,后续文章会一个一个展开描述。

3. 一级菜单

本章我们将根据arch/arm64/Kconfig文件,对menuconfig的一级菜单进行简要的分析,目的是从实际的例子出发,理解Kconfig语言的语法,一级Linux kernel配置项的整体结构。具体请参考如下表格:

置项 Kconfig文件位置 功能说明
ARM64架构的默认配置项 arch/arm64/Kconfig 指定ARCH为ARM64之后,ARM64的Kconfig会默认帮我们确定众多的配置项,例如CONFIG_64BIT、CONFIG_MMU、CONFIG_OF等等。这些配置项不会体现在menuconfig的菜单中,但可以在最终生成的config文件中看到。
General setup init/Kconfig
位于menu "General setup"和对应的endmenu之间
该配置项由“menu … endmenu”定义,是一个配置菜单,表示一类配置的集合(参考上面图片1,“--->”结尾的配置项都是菜单项,按Enter直接进入对应的菜单界面);
主要用于配置和功能无关的的通用选项,例如kernel的版本号、压缩方式、等等。
loadable module init/Kconfig
由“menuconfig MODULES”定义
menuconfig和menu不同,是一个可以选择是否开启的菜单(参考图片1中的“[*]”);
用于配置内核“模块”有关的特性。
block device block/Kconfig
由“menuconfig BLOCK”定义
内核块设备有关的特性。
Platform selection arch/arm64/Kconfig.platforms
位于menu "Platform selection"和endmenu之间
用于配置和具体平台有关的配置项,如SUNIX、HISI等;
自从ARM64把“mach-xxx”目录抛弃之后,这里可能是各个平台可自行发挥的最后一个空间了。
PCI Bus support arch/arm64/Kconfig
    drivers/pci/Kconfi
PCI总线有关的特性。
ACPI support drivers/acpi/Kconfig ACPI总线有关的特性。
Kernel Features arch/arm64/Kconfig
    kernel/Kconfig.preempt
    kernel/Kconfig.hz
    mm/Kconfig
位于menu "Kernel Features"和对应的endmenu之间
Linux kernel的核心功能的配置,如进程管理、内存管理、等等。是Linux kernel配置项中最复杂的一类。
Boot options arch/arm64/Kconfig
位于menu "Boot options"和对应的endmenu之间
用于配置和内核启动有关的功能,如默认的Command line、UEFI支持等。
Userspace binary formats arch/arm64/Kconfig
    fs/Kconfig.binfmt
位于menu "Userspace binary formats"和对应的endmenu之间
用于配置用户空间二进制的格式。
Power management arch/arm64/Kconfig
    kernel/power/Kconfig
位于menu "Power management options"和对应的endmenu之间
Linux kernel电源管理有关的特性。
CPU Power Management arch/arm64/Kconfig
    drivers/cpuidle/Kconfig
    drivers/cpufreq/Kconfig
位于menu "CPU Power Management"和对应的endmenu之间
CPU有关的电源管理特性,如cpuidle、cpufreq等;
这是新版kernel的一大改进,将CPU有关的电源管理功能,抽象成一个顶层功能,和系统的电源管理并列。
Networking support net/Kconfig 网络有关的特性。
Device Drivers drivers/Kconfig 设备驱动有关的配置项。
Firmware Drivers drivers/firmware/Kconfig 
    …
Firmware有关的配置项。
File systems fs/Kconfig 文件系统有关的配置项。
Virtualization arch/arm64/kvm/Kconfig 虚拟化有关的配置项。
Kernel hacking arch/arm64/Kconfig.debug Kernel调试有关的配置项。
Security options security/Kconfig 安全特性有关的配置项。
Cryptographic API crypto/Kconfig
arch/arm64/crypto/Kconfig
加密算法有关的配置项。
Library routines lib/Kconfig 用于配置常用的library,如CRC16等。

Linux内核配置解析 - 概述(基于ARM64架构)的更多相关文章

  1. Linux内核配置解析 - Boot options

    1. 前言 本文将介绍ARM64架构下,Linux kernel和启动有关的配置项. 注1:本系列文章使用的Linux kernel版本是“X Project”所用的“Linux 4.6-rc5”,具 ...

  2. Linux内核配置机制(make menuconfig 、Kconfig、Makefile)讲解【转】

    本文转载自:http://www.codexiu.cn/linux/blog/34801/ 前面我们介绍模块编程的时候介绍了驱动进入内核有两种方式:模块和直接编译进内核,并介绍了模块的一种编译方式—— ...

  3. Linux内核配置浅析

    1.Linux Kernel Kconfig系统的基本结构 Linux内核的配置系统由三个部分组成,分别是: 1>.Makefile:分布在 Linux 内核源代码根目录及各层目录中,定义 Li ...

  4. Linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解

    前面我们介绍模块编程的时候介绍了驱动进入内核有两种方式:模块和直接编译进内核,并介绍了模块的一种编译方式--在一个独立的文件夹通过makefile配合内核源码路径完成 那么如何将驱动直接编译进内核呢? ...

  5. Linux内核配置编译及基本调试方法

    一.Linux内核配置编译 1. 交叉编译设置:make ARCH=arm CROSS_COMPILE=arm-linux- 注:也可以直接修改顶层Makefile ARCH ?= arm CROSS ...

  6. Linux 内核配置和编译

    Linux 内核配置和编译 一.配置内核 (1). 为什么要配置内核 1. 硬件需求 2. 软件需求 选出需要的,去掉不要的 (2). 如何配置内核 1. make  config 基于文本模式的交互 ...

  7. [转帖]Linux内核系统体系概述

    Linux内核系统体系概述 https://www.cnblogs.com/alantu2018/p/8447369.html Linux 内核主要由 5 个模块构成,它们分别是: 进程调度模块 用来 ...

  8. Linux内核启动过程概述

    版权声明:本文原创,转载需声明作者ID和原文链接地址. Hi!大家好,我是CrazyCatJack.今天给大家带来的是Linux内核启动过程概述.希望能够帮助大家更好的理解Linux内核的启动,并且创 ...

  9. linux内核配置 kbuild

    Linux 内核配置机制 http://blog.csdn.net/dianhuiren/article/details/6917132 linux kbuild文档 http://blog.chin ...

随机推荐

  1. 如何解决 SQL Server 中的锁升级所致的阻塞问题

    概要 锁升级为表锁插入转换很多细粒度的锁 (如行或页锁) 的过程.Microsoft SQL Server 动态确定何时执行锁升级.作出决定之前,SQL Server 将特定的扫描,整个事务,并且用于 ...

  2. 老三星手机i9001刷机记录

    家里的老的三星i9001,准备给我妈用,打算刷机,但又实在头疼那些复杂的刷机技术,昨天研究了一下,用比较简单的方法完成刷机,记录如下: 用卡刷比较简单,线刷不考虑 进入恢复模式的方法:1.电源+音量加 ...

  3. Mac下Sublime Text 总是以新窗口打开文件的解决办法

    Mac下的Sublime有个毛病,经常打开后,之前打开的窗口都没了,太难受了. Windows/Linux下的sublime总是默认的以标签页的形式打开关联的文件,但是在Mac下使用Sublime打开 ...

  4. Solr打分出错

    solr支持给某Field打分,在验证的过程的过程中出现错误:ERROR: [doc=likehua] cannot set an index-time boost, unindexed or nor ...

  5. 解决Windows Git Bash中文乱码问题

    在git 安装目录 etc 下面 添加以下配置信息 1,/etc/gitconfig: [gui] encoding = utf-8 #代码库统一用urf-8,在git gui中可以正常显示中文 [i ...

  6. 织梦DeDeCms会员登录或退出跳转到首页的修改方法

    会员在主页登陆后,默认会跳转到会员中心,如果我们想登陆后,跳转到网站主页,那么就请参考下面的方法实现织梦DeDeCms会员登录或退出跳转到首页. 1.在根目录的member目录中找到index_do. ...

  7. 微信小程序 - 更改radio和checkbox选中样式

    点击下载源码:示例-更改radio或checkbox选中样式

  8. PHP Mysql-连接

    PHP 连接 MySQL PHP 5 及以上版本建议使用以下方式连接 MySQL : MySQLi extension ("i" 意为 improved) PDO (PHP Dat ...

  9. hdu 4865 Peter's Hobby(概率dp)

    http://acm.hdu.edu.cn/showproblem.php? pid=4865 大致题意:有三种天气和四种叶子状态.给出两个表,各自是每种天气下叶子呈现状态的概率和今天天气对明天天气的 ...

  10. VB调用VC dll的返回方式

    第一种类型:数值传递 注意:在VB中,默认变量传递方式为ByRef为地址,而传递值就是用ByVal,还要注意在C++中,int类型的变量是32位的,在VB中要用long型变量来配合.VC++部分: e ...