历史上的今天
今天是:2025年08月20日(星期三)
2021年08月20日 | 1_5.3.2_内核配置裁剪及启动流程_内核启动流程分析之配置_P
2021-08-20 来源:eefocus
配置结果:生成一个.config文件。
以配置项:CONFIG_DM9000为例。
使用vim打开.config,搜索DM9000,可以看到CONFIG_DM9000=y,表示编译内核时DM9000会被链接,编入内核。

有一些参数等于m,表示编译后作为模块,不编入内核但可以动态加载这个模块。
使用grep “CONFIG_DM9000” * -nwR指令在全部文件中搜索CONFIG_DM9000。
可以看到,在以下四种地方可以搜索到CONFIG_DM9000。
C源码:CONFIG_DM9000(主要是宏,在autoconf.h文件中定义)
子目录Makefile:drivers/net/Makefile
include/config/auto.conf
include/linux/autoconf.h(从文件名可以看出,是根据一些命令和.config自动生成的)




查看autoconf.h,发现在autoconf.h中,不论是定位为y还是m,在该文件中都被定义为1。

那么y和m的差别在哪里体现呢?
答:是在子目录的Makefile中体现的。之前有说过,y是会被链接进内核,m只是生成一个模块,需要的时候再动态加载,也就是说y和m都会被编译,只是一个是会被链接而另一个只是生成模块不被链接。
查看子目录的Makefile,可以看到一个obj-$(CONFIG_DM9000) += dm9dev9000c.o

先对obj做一个说明,如果子目录的Makefile中有以下两种语句的话,那么:
obj-y += xxx.o,表示最后会被编译进内核;
obj-m += yyy.o,表示yyy.c最后会被编译为可加载的模块yyy.ko;
也就是说,当CONFIG_DM9000 = y时,dm9dev9000c.c会被编译进内核;当CONFIG_DM9000 = m时,dm9dev9000.c会被编译为可加载的模块。
那么,这个CONFIG_DM9000 从哪里来?来源于auto.conf。
查看auto.conf,搜索DM9000,发现在这个文件中CONFIG_DM9000=y,那么这个等于y从哪里来呢?答:也是来源于.config。

显然,这个auto.conf要想起作用,是要被其他文件包含的,那么是什么文件包含的呢?
答:是顶层的Makefile包含的,顶层的Makefile包含了这个文件,同时也包含了其他子目录的Makefile,这样其他子目录的Makefile和auto.conf文件就联系起来了。
所以,当make uImage时:
根据.config文件,生成了autoconf.h,这个文件是在源代码中使用的,决定是否编译;
根据.config文件,还生成了auto.conf文件,这个文件是在Makefile中使用的,决定是否链接;
史海拾趣
|
这是一个比较简单的实用型制作,本文打算从简到繁一步步深入,你若是愿意同步动手实验,不久你将能够制作适合正式场合使用的调频发射机。当然,实验还是从最简单的做起,下图是一个最简单的振荡器,它是调频发射的基础。 图中的线圈用1.0 ...… 查看全部问答> |
|
EVC的treectrl控件的成员函数setbkcolor不能用吗(分数不多了 多谢大家帮忙看看) 不知道大家在EVC下编界面程序的时候遇到这个问题没有 m_tree.SetBkColor();编译的时候说不是tree的成员函数 很奇怪? 要设置tree控件的背景颜色 HBRUSH CTreeListDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = ...… 查看全部问答> |
|
请问lpc2148的usb virtualcom 功能会占用uart资源吗? 我下了一个lpc2148 usb virtualcom的例程,跑了一下。 里面有两种方式:一种是 VirtuaCom 和 PhysicalCom之间的通讯,另一种是直接VirtualCom的下行通讯点灯和上行通讯,在pc机的串口调试助手可以看到上发的信息提示。 第一种方式,当然是肯定用了 ...… 查看全部问答> |






