KERNEL_make_modules.doc

本文深入探讨了Linux内核源码目录结构、BUILD_DIR变量定义及BCM编译环境下bcmdrivers目录的相关配置。重点介绍了如何在特定驱动下获取并处理目录路径,以及模块编译过程,包括初始化、构建、合并modules.order文件和第二阶段模块编译等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//Linux内核源码目录

objtree :=$(CURDIR)


//BUILD_DIR变量在BCM编译环境的主Makefile里定义的

BUILD_DIR= $(shell pwd)


//BCM编译环境下的bcmdrivers目录

BRCMDRIVERS_DIR= $(BUILD_DIR)/bcmdrivers


//BCM驱动相关目录,这里我们只关心BRCMDRIVERS_DIR

brcmdrivers-y :=$(INC_BRCMBOARDPARMS_PATH)/$(BRCM_BOARD)/ $(BRCMDRIVERS_DIR)/$(INC_SPI_PATH)/ $(INC_FLASH_PATH)/


//这时从下面所有变量中获取仅含有目录(就是最后面是\的字符)的变量,并将最后的\

//字符去除,比如BCM驱动变量的字符串为/xxx/bcm6818/bcmdrivers/,则最终字符变换后

//字符串为/xxx/bcm6818/bcmdrivers

vmlinux-dirs :=$(patsubst %/,%,$(filter %/, $(init-y) $(init-m) \

$(core-y) $(core-m) $(drivers-y) $(drivers-m) \

$(brcmdrivers-y) $(brcmdrivers-m) \

$(net-y) $(net-m) $(libs-y) $(libs-m)))


//模块编译(因为我们没有使用M=编译宏进行单独指定模块编译,所有KBUILD_EXTMOD

//为空,走为空的编译流程)。

modules:$(vmlinux-dirs-2) $(if $(KBUILD_BUILTIN),vmlinux)

//在如下目录中查找含有modules.order文件的目录,并将所有modules.order文件

//统一合并到内核目录下的单个modules.order文件中

$(Q)$(AWK)'!x[$$0]++' $(vmlinux-dirs:%=%/modules.order) >$(objtree)/modules.order

//输出要进行第二阶段模块编译的打印

@$(kecho)' Building modules, stage 2.';

//调用Makefile.modpost进行第二阶段模块编译

$(Q)$(MAKE)-f $(srctree)/scripts/Makefile.modpos


//主要是特定驱动所需要的二进制固件进行安装,当前ENDPT没有涉及,不关心

$(Q)$(MAKE)-f $(srctree)/scripts/Makefile.fwinst obj=firmware __fw_modbuild

模块一般用来支持那些不经常使用的功能。例如,通常情况下你仅使用拨号网络,因此网络功能并不是任何时候都需要的,那么就应该使用可装入的模块来提供这个功能。仅在你进行拨号联接的时候,该模块才被装入。而在你断掉连接的时候它会被自动卸下。这样会使内核使用内存的量最小,减小系统的负荷。 当然,那些象硬盘访问这样时时刻刻都需要的功能,则必须作在内核里。如果你搭一台网络工作站或 web服务器,那么网络功能是时刻都需要的,你就应该考虑把网络功能编译到内核里。另外一个方法是在启动的时候就装入网络模块。这种方法的优点是你不需要重新编译内核。而缺点是网络功能不能特别高效。 按照以上的原则,我们首先列出一张清单,看看 kernel 中哪些选项是非有不可的,也就是说,这些东西是必须被编译到内核中的。将那些非必需的模块剔除到内核以外。 第一个是root所在的硬盘配置。 哪果您的硬盘是IDE接口,就把 ide 的选项标记下来。如果是SCSI接口,请把您的接口参数及 SCSI id 记标下来。 第二个是选择使用哪一个文件系统。 Linux的默认文件系统是是 ext2 ,那么就一定要把它标记下来。如果机器中还其它的操作系统,如win98或windows NT,您还会可能选择FAT32或NTFS的支持,不过后面你可以通过手工加载的方式来加入新的模块支持。 第三个是选择Linux所支持的可执行文件格式。这里有两种格式可供选择: elf:这是当前Linux普遍支持的可执行文件格式,必须编译到内核中 。 a.out: 这是旧版的Linux的可执行文件各函数库的格式,如果你确认肯定用不到这种格式的可执行文件,那么就可以不把它编译到内核当中。 以上这些内容,是必须要编译到内核中的。其它的内容凡是所有选项中m提示的,都选择m,这样可以通过手工的方式添加该模块。 ** Loadable module support*Enable loadable module support (CONFIG_MODULES) [Y/n/?]Set version information on all symbols for modules (CONFIG_MODVERSIONS) [N/y/?]Kernel daemon support (e.g. autoload of modules) (CONFIG_KERNELD) [Y/n/?] 分别回答 Y,N,Y 。其中 CONFIG_KERNELD 的 default 值是 N, 所以要注意选择Y。 make config 完后,仍旧是 make dep; make clean。 接下来要 make zlilo 或 make zImage。 然后 make modules ; make modules_install 。完成之后,就编译出一个没有调入多余模块的一个“干净的”内核映像文件了。
啥意思 gxy@gxy:~$ sudo apt install git 正在读取软件包列表... 完成 正在分析软件包的依赖关系树 正在读取状态信息... 完成 将会同时安装下列软件: git-man liberror-perl 建议安装: git-daemon-run | git-daemon-sysvinit git-doc git-el git-email git-gui gitk gitweb git-cvs git-mediawiki git-svn 下列【新】软件包将被安装: git git-man liberror-perl 升级了 0 个软件包,新安装了 3 个软件包,要卸载 0 个软件包,有 0 个软件包未被升级。 需要下载 5,526 kB 的归档。 解压缩后会消耗 38.8 MB 的额外空间。 您希望继续执行吗? [Y/n] y 获取:1 http://mirrors.ubuntu.com/mirrors.txt Mirrorlist [34 B] 获取:2 http://archive.ubuntu.com/ubuntu focal/main amd64 liberror-perl all 0.17029-1 [26.5 kB] 获取:3 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 git-man all 1:2.25.1-1ubuntu3.14 [887 kB] 获取:4 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 git amd64 1:2.25.1-1ubuntu3.14 [4,613 kB] 已下载 5,526 kB,耗时 6秒 (999 kB/s) 正在选中未选择的软件包 liberror-perl。 (正在读取数据库 ... 系统当前共安装有 250868 个文件和目录。) 准备解压 .../liberror-perl_0.17029-1_all.deb ... 正在解压 liberror-perl (0.17029-1) ... 正在选中未选择的软件包 git-man。 准备解压 .../git-man_1%3a2.25.1-1ubuntu3.14_all.deb ... 正在解压 git-man (1:2.25.1-1ubuntu3.14) ... 正在选中未选择的软件包 git。 准备解压 .../git_1%3a2.25.1-1ubuntu3.14_amd64.deb ... 正在解压 git (1:2.25.1-1ubuntu3.14) ... 正在设置 liberror-perl (0.17029-1) ... 正在设置 git-man (1:2.25.1-1ubuntu3.14) ... 正在设置 git (1:2.25.1-1ubuntu3.14) ... 正在处理用于 man-db (2.9.1-1) 的触发器 ... gxy@gxy:~$ git clone https://github.com/HRex39/rtl8852be.git 正克隆到 'rtl8852be'... remote: Enumerating objects: 1070, done. remote: Counting objects: 100% (157/157), done. remote: Compressing objects: 100% (91/91), done. remote: Total 1070 (delta 73), reused 137 (delta 57), pack-reused 913 (from 1) 接收对象中: 100% (1070/1070), 4.56 MiB | 2.46 MiB/s, 完成. 处理 delta 中: 100% (250/250), 完成. gxy@gxy:~$ cd rtl8852be gxy@gxy:~/rtl8852be$ make -j8 #rm -f .symvers.8852be make ARCH=x86_64 CROSS_COMPILE= -C /lib/modules/6.15.4-061504-generic/build M=/home/gxy/rtl8852be modules make[1]: *** /lib/modules/6.15.4-061504-generic/build: 没有那个文件或目录。 停止。 make: *** [Makefile:637:modules] 错误 2 gxy@gxy:~/rtl8852be$
最新发布
07-05
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值