内核启动流程分析(二)配置详解
總體概述
配置詳解
配置的最終目的,是生成了.config文件,查看下這個文件,
# # Automatically generated make config: don't edit # Linux kernel version: 2.6.22.6 # Wed Dec 30 18:30:33 2009 # CONFIG_ARM=y CONFIG_SYS_SUPPORTS_APM_EMULATION=y CONFIG_GENERIC_GPIO=y # CONFIG_GENERIC_TIME is not set # CONFIG_GENERIC_CLOCKEVENTS is not set CONFIG_MMU=y CONFIG_NO_IOPORT=y CONFIG_GENERIC_HARDIRQS=y ..... CONFIG_DM9000=y #來分析這個配置項目其中都是一些xxx=y,yyy=m,zzz=一個數值等配置項這些,區別:若是=y的話,該項會被編譯進內核;若是=m的話,該項會被編譯為一個模塊,這個模塊以后可以動態加載。下面取其中一行?CONFIG_DM9000=y來分析,先搜索下包含CONFIG_DM9000文件內容
grep "CONFIG_DM9000" * -nwR搜索后會發現含有“CONFIG_DM9000”配置項的文件主要是:
①c源碼里有:CONFIG_DM9000
②子目錄的Makefile(drivers/net/Makefile)里有:CONFIG_DM9000
③include/config/auto.conf里有:CONFIG_DM9000
④include/linux/autoconf.h里有:CONFIG_DM9000
這些文件之間以及與.config配置文件之間的關系是怎樣的?下面逐一分析:
?
- 1、忽略掉默認配置文件(以defconfig命名的),可以看到c代碼含有CONFIG_DM9000,從c語言語法上可知CONFIG_DM9000應該是一個宏,這些宏肯定是在c文件中或者頭文件中定義,這里的宏其實是來源于下面第4點中的include/linux/autoconf.h
- 2、子目錄下的Makefile(drivers/net/Makefile)中含有CONFIG_DM9000,下面第4點中對于=Y和=M的差別體現不出來,其實這些差別是在這里的makefile(子目錄下的makefile)中體現的,這里會區分是編譯為模塊(=M)還是編譯為內核(=Y),這里子目錄下的CONFIG_DM9000是在下面第3點include/config/auto.conf中定義的。
插講:子目錄下的Makefile格式:
子目錄的Makefile格式比較簡單,一般都是obj_y += xxx.o或者obj_m += yyy.o,這表示該子目錄下的xxx.c會被編譯進內核去,yyy.c會被編譯為yyy.ko作為一個可加載的模塊。比如obj-$(CONFIG_DM9000) +=dm9dev9000c.o,若這里CONFIG_DM9000被第3點include/config/auto.conf定義為CONFIG_DM9000=y的話,則有obj-y +=dm9dev9000c.o,dm9dev9000c.c會被編譯進內核。
?
- 3、在include/config/auto.conf下含有CONFIG_DM9000,這個文件是自動生成的,內容很明顯來源于.config,上面第2點中根據這個編譯模塊還是內核.這個文件會被頂層makefile包含,里面的內容最終會被第2點中子目錄下的makefile拿來使用。
- 4、include/linux/autoconf.h里含有CONFIG_DM9000配置項,這個頭文件是在make內核時,make機制根據.config自動產生的,它里面的內容來源于.config,在.config文件中不論配置項為=Y或者為=M(模塊),在autoconf.h中這些配置項都被定義為1,autoconf.h被第1點中提到的源代碼所使用,這里體現不出=M與=Y的區別,是在子目錄下的Makefile中體現的。
轉載:https://www.cnblogs.com/zongzi10010/p/10023694.html
總結
以上是生活随笔為你收集整理的内核启动流程分析(二)配置详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 内核启动流程分析(一)编译体验
- 下一篇: 内核启动流程分析(三)makefile