kernel的配置最终都会集中在一个.config文件中,然后会根据这个.config文件来配合Makefile来选择性的build内核镜像
.cnfig文件的生成分为如下几个步骤
首先每个子目录中的Kconfig
Kconfig中会添加配置的描述,用menuconfig会显示这些信息
例如:config xxxx_xx
Makefile中需要将相应的模块的目标,为后面makefile编译看到.config中有这条CONFIG就会编译这条
例如:obj-$(CONFIG_XXXX_XX) += mmmmm.o
另外再加上dts就可以把新的模块加到内核中
kconfig中的描述常用的有depend on 与 select
依赖 depends on
这个关键字表示了在某些配置选中后,本配置项才会显示。
在 driver/pci/Kconfig文件中有,
config PCI_MSI
bool "Message Signaled Interrupts (MSI and MSI-X)"
depends on PCI
depends on ARCH_SUPPORTS_MSI
可以发现,要配置MSI必须要先支持PCI。 恩这个道理咱都懂, 连PCI都没有,哪里来的MSI啊。
反向依赖 select
这个关键字表示了当本配置项选中后,其他的配置项也需要选中。
在 arch/x86/Kconfig文件中有:
config HIGHMEM64G
bool "64GB"
depends on !M386 && !M486
select X86_PAE
---help---
Select this if you have a 32-bit processor and more than 4
gigabytes of physical RAM.
看上去就是说要支持更多的物理内存,那么在x86的平台上,就要选中X86_PAE。
另外再insmod的时候出现error 找不到内核符号
查找.config或者System.map确实没找到这个符号,查找原因obj-m的模块的内核模块不会将其模块符号编译到内核中去
error moduleA: cant request region for resource[mem 0xaaaaaaaa 0xbbbbbbbbbbbb]
怀疑是在使用devm_ioremap_resource的时候因为dts中的模块之间的地址冲突造成的
与 request_mem_region()函数有关
可以通过查看/proc/mem看这段mem是否已经被映射过了