2022年Linux系统的Makefile和Kconfig及模块简介 .pdf

上传人:Che****ry 文档编号:35292719 上传时间:2022-08-21 格式:PDF 页数:7 大小:64.25KB
返回 下载 相关 举报
2022年Linux系统的Makefile和Kconfig及模块简介 .pdf_第1页
第1页 / 共7页
2022年Linux系统的Makefile和Kconfig及模块简介 .pdf_第2页
第2页 / 共7页
点击查看更多>>
资源描述

《2022年Linux系统的Makefile和Kconfig及模块简介 .pdf》由会员分享,可在线阅读,更多相关《2022年Linux系统的Makefile和Kconfig及模块简介 .pdf(7页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、1 Linux 系统的 Makefile 、Kconfig和模块1Makefile 1.1 Makefile组织层次Linux 的 Make 体系由如下几部分组成:?顶层 Makefile 顶层 Makefile 通过读取配置文件,递归编译内核代码树的相关目录,从而产生两个重要的目标文件:vmlinux 和模块。?内核相关Makefile 位于 arch/$(ARCH) 目录下,为顶层Makefile 提供与具体硬件体系结构相关的信息。?公共编译规则定义文件。包括 Makefile.build 、Makefile.clean 、Makefile.lib 、Makefile.host等文件组成。

2、这些文件位于 scripts 目录中,定义了编译需要的公共的规则和定义。?内核配置文件 .config 通过调用 make menuconfig或者 make xconfig命令,用户可以选择需要的配置来生成期望的目标文件。?其他 Makefile 主要为整个Makefile 体系提供各自模块的目标文件定义,上层 Makefile 根据它所 定义的目标来 完成各自模块的编译。1.2 Makefile的使用在编译内核 之前 ,用户 必须首先完 成必要的配置。 Linux 内核提供了 数不胜数 的功能 ,支持众多 的硬件体系结构, 这就需要用户 对将 要生成的内核进行裁减 。内核提供了 多种不同的

3、工 具来 简化 内核的配置。make config,字符界面 下命令 行工 具,这个 工具会依次遍历 内核 所有 的配置 项,要求用户 进行逐项 的选择配置。 这个 工具 会耗费 用户 太多时间 ,除非万不得 以(你 的编译主 机不支持 其他配置 工 具)一般不建议使用。make menuconfig,基于 ncurse 库编 制的图形界面工 具, 一般台式机使 用该工 具。make xconfig,基 于 X11 的图形 配置 工具, 一般 用于 工作站环境 。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 -

4、- - - - - - 第 1 页,共 7 页 - - - - - - - - - 2 当用户 完成配置 后,配置 工具 会自动生成.config文件, 它被保存在 内核代码树的根目录下。 当一切工作完 成以 后,用户 只需要 简单键入make或 make zImage,剩下所有的工作 makefile 就会 自动替你完 成了。1.3 Makefile编译流程当用户 使用 Linux 的 Makefile 编译内核 版本时 ,Makefile 的编译 流程 如下:?使用命令 行或者 图形界面 配置 工具, 对内核 进行裁减 ,生成 .config 配置文件?保存 内核 版本 信息 到 incl

5、ude/linux/version.h ?产生 符号 链接 include/asm ,指向实际 目录include/asm-$(ARCH) ?为最终 目标文件的生成进行必 要的 准备 工作?递归 进入/init 、/kernel 、 /drivers 、 /net 、 /lib 等目录和其中的子目录来编译生成所有的目标文件?链接 上述过程 产生的目标文件生成vmlinux ,vmlinux 存 放在内核代码树的 根目录下?最后根据arch/$(ARCH)/Makefile文件定义的 后 期编译的 处理 规则 建立最终 的 映象bootimage ,包括 创建引导记 录、 准备 initrd 映

6、象 和相关 处理1.4 Makefile关键规则和定义描述1.4.1 目标定义目标定义 是 Makefile 文件的核 心部分, 目标定义通 知 Makefile 需要生成 哪些目标文件、如何 根据 特殊 的编译选 项链接 目标文件, 同时 控制哪些子目录要递归 进入进行 编译。这个 例子 Makefile 文件位于 /fs/ext2目录: # # Makefile for the linux ext2-filesystem routines. # obj-$(CONFIG_EXT2_FS) += ext2.o ext2-y := balloc.o bitmap.o dir.o file.o

7、fsync.o ialloc.o inode.o ioctl.o namei.o super.o symlink.o ext2-$(CONFIG_EXT2_FS_XATTR) += xattr.o xattr_user.o xattr_trusted.o ext2-$(CONFIG_EXT2_FS_POSIX_ACL) += acl.o 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 7 页 - - - - - - - - - 3 ext2-$(CONFIG_EXT2_F

8、S_SECURITY) += xattr_security.o ext2-$(CONFIG_EXT2_FS_XIP) += xip.o 这表示 与 ext2 相关的目标文件由ext2-y 定义的文件 列表 组成,其中ext2-$(*)是由内核配置文件 .config 中的配置 项决定, 最终 Makefile 会在 这个目录下 统一生成 一个目标文件ext2.o ( 由 obj-$(CONFIG_EXT2_FS) 决定)。其中 obj-y 表示 为生成 vmlinux 文件 所需要的目标文件 集合 ,具体的文件依赖于内核配置。Makefile 会编译 所有 的$(obj-y) 中定义的文件,然

9、后调用 链接器 将这些文件 链接 到built-in.o文件中。 最终 built-in.o文件通过顶层Makefile 链接 到 vmlinux中。 值得注意 的 是$(obj-y) 的文件 顺序很 重要。列表 文件可以重 复, 文件 第一次 出现 时将会 链接 到 built-in.o中,后来 出现 的同名文件 将会被 忽略 。文件 顺序直接决 定了他 们被调用的 顺序 ,这一点读者需要特别注意 。读者可 能会在 某些 Makefile 中 发现 lib-y 定义,所有 包含在 lib-y 定义中的目标文件都 将会被 编译 到该 目录下 一个统一的库 文件中。 值得注意 的是 lib-y

10、定义 一般被 限制在lib 和arch/$(ARCH)/lib 目录中。体系 makefile文件和顶层makefile 文件共 同定义了如 何 建立 vmlinux 文件的规则。$(head-y) 列举 首先 链接 到 vmlinux 的对 象文件。$(libs-y) 列举 了能 够找 到 lib.a 文件的目录。其余 的变量列举 了 能够找 到内嵌对 象文件的目录。$(init-y) 列举 的对 象位于 $(head-y) 对象之后 。然后 是如下位置 顺序 :$(core-y), $(libs-y), $(drivers-y) 和 $(net-y) 。顶层 makefile 定义了 所有

11、 通用目录,arch/$(ARCH)/Makefile文件 只 需增加 体系相关的目录。例如 : #arch/i386/Makefile libs-y += arch/i386/lib/ core-y += arch/i386/kernel/ arch/i386/mm/ arch/i386/$(mcore-y)/ arch/i386/crypto/ drivers-$(CONFIG_MATH_EMULATION) += arch/i386/math-emu/ drivers-$(CONFIG_PCI) += arch/i386/pci/ 名师资料总结 - - -精品资料欢迎下载 - - - -

12、 - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 7 页 - - - - - - - - - 4 1.4.2 目录递归Makefile 文件 只负责 当前 目录下的目标文件,子 目录中的文件由子目录中的makefile负责 编译,编译系统使用 obj-y 和 obj-m 来自 动递归编译各个子目录中的文件。对于fs/Makefile: obj-$(CONFIG_EXT2_FS) += ext2/ 如果 在内核配置文件 .config 中,CONFIG_EXT2_FS 被设置为 y 或者 m,则内核 makefile 会自动进入

13、ext2 目录来 进行 编译。内核Makefile 只使 用这些信息来决定是否 需要编译这个目录, 子目录中的makefile 规定 哪 些文件编译为模块,哪些文件编译 进内核。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 7 页 - - - - - - - - - 5 2Kconfig 内核 源码树的目录下都有两个文 档 Kconfig 和 Makefile ,分 布到各级子 目录的 Kconfig构成了 一个分 布式 的内核配置 数据库 ,每个 Kconfig 分别

14、描述 了所属目录下相关的内核配置菜单 选项。 在 内核配置 make menuconfig 时, 从 Kconfig 中读 出菜 单, 用户选择 后保存到 .config的内核配置文档中。 在内核编译 时 ,顶层 Makefile 调用这个 .config, 就知道 了用户的选择。假如要 想添加新 的驱动到 内核的 源码中,需要 修改 Kconfig ,这 样就能 够从配置 菜单 中选择这个 驱动。假 如想使这个 驱动被 编译,需要 修改 Makefile 。一个典型 的内核配置 菜单如下:menu Network device support config NETDEVICES bool E

15、nable Net Devices depends on NET default y help This is help desciption 。. endmenu 包含在 menu/endmenu 中的内 容会成为 Network device support 的子菜 单。每一个子菜 单项都是 由 config 来定义的。 congfig 下方的那些 bool、depends on、default、help 等为 config的属 性,用于定义 该菜单项 的类型 、依赖项、默认 值、帮助 信息等。每个 config 菜单项 都要有类型 定义:bool 布尔类 型 、 tristate 三态(

16、内 建、 模块、移除) 、string 字符 串 、 hex 十六 进制 、 integer 整型。例如:config HELLO_MODULE bool hello test module bool 类型的 只能 选中或 不 选中, 显示为 ,tristate 类 型的菜单项多 了编译成内核模块的 选 项 , 显 示 为 。 假 如 选 择 编 译 成 内 核 模 块 , 则 会 在 .config中 生 成 一 个CONFIG_HELLO_MODULE=m的配置 ;假如选择 静态 编译, 就是直接 编译成内核 映像,就会在 .config 中生成 一个 CONFIG_HELLO_MODUL

17、E=y的配置。hex 十六 进制 类型显示 为( ) 。在 Kconfig 中有类似语句 : source drivers/usb/Kconfig , 用来包 含 (或嵌套) 新的 Kconfig文件,这 样便可以 使各个目录 管理 各自的配置内 容 ,不必 把那 些配置 都写在同一 个文件 里,方便 修改 和管理。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 7 页 - - - - - - - - - 6 3模块( module )模块(module)是 在内核 空间

18、运行 的程序,实际 上是 一种 目标 对象 文件, 没有链接 ,不能独 立运行, 但是可以 装载 到系统中作为内核的 一部分 运行 , 从而可以 动态扩充 内核的 功能 。模块 最主要的用 处 就是用来 实现设备驱 动程 序。使用模块的 优点:l将来修改 内核 时,不必 全 部重 新编译整个内核,可节省 不 少时间l系统中如 果需要 使用新模块, 不必 重新编译内核, 只要插 入相应的模块 即 可通常,一个 Linux 内核模块主要由以下几部分组成:(1)module_init()- 模块 加载函 数(必须)当通过 insmod 或 modprobe 命令 加载内核模块 时,模块的 加载函 数

19、会 自动被 内核 执行,完成模块的相关初始 化工作 。(2)module_exit()- 模块 卸载函 数(必须)当通过 rmmod 命令 卸载 某模块 时,模块的 卸载函 数会 自动被 内核 执行, 完成与模块 装载函 数相反的功能 。(3)MODULE_LICENSE()-模块 许可证声明 (必须)模块 许可证( LICENSE )声明 描述 内核模块的 许可权限,如 果不声明 LICENSE ,模块被加 载时, 将收到内核 被污染 (kernel tainted) 的警告 。 在 Linux2.6 内核中,可接受的 LICENSE包括 GPL(适 用 GNU 通用公共 许可的 任何版本)

20、, GPL v2( 只 适用 GPL 版本 2 ), GPL and additional rights, Dual BSD/GPL, Dual MPL/GPL,和Proprietary 。大多数 情况 下,内核模块应遵循 GPL 兼容许 可权。 Linux2.6 内核模块 最常见 的是以 MODULE_LICENSE(“Dual BSD/GPL ”)语句声明 模块 采 用 BSD/GPL 双 LICENSE 。(4)module_param()- 模块 参数( 可选 )模块 参数是模块 被加载的时候 可以 被传递给它的值,它本 身对 应模块内部的 全局 变量 。(5)EXPORT_SYMBO

21、L()-模块 导出 符号( 可选 )内核模块可以导出 符号( symbol,对 应于函数或变量 ),这样其他模块可以使用本模块中的 变量 或函数。模块 即可以 放 在内核 源代码树中, 也可以 放在自己 的工作 目录中。 模块 被编译 后生成的目标文件的 后缀是 .ko。l模块 放在 代码树中,用make modules 命令来编译。l模块相关文件目录放在代码树以 外的位置,用如下命令来编译:make -C SUBDIRS=$PWD modules 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - -

22、 - - 第 6 页,共 7 页 - - - - - - - - - 7 “-C”指定代码树的位置,$PWD 告诉 kbuild 回到当前 目录来 执行 build 操作。一个简单 的例子#include #include #include MODULE_LICENSE (GPL); MODULE_AUTHOR (Farsight); /* * 模块 被装载 时调用*/ static int _init hello_init (void) printk(KERN_ALERT I bear a charmed life.n); return 0; /* * 模块 卸载 时被 调用*/ static void _exit hello_exit (void) printk(KERN_ALERT Out, out, brief candle!n); module_init (hello_init); module_exit (hello_exit); 假设 模块 名是 xxx.ko 加载模块: insmod xxx.ko 卸载 模块: rmmod xxx.ko 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 7 页 - - - - - - - - -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁