这一切都离不开 Linux 的 "模块化魔法"—— 内核模块(Kernel Module)。...作为 Linux 内核最灵活的特性之一,内核模块让开发者可以动态扩展内核功能,今天就来揭开这个神秘组件的面纱。 一、什么是内核模块?...1.1 先打个比方:给内核装 "插件" 如果把 Linux 内核比作一台电脑主机,那么内核模块就是可以随时插拔的外设: 整个内核:像预装了主板、CPU、基础外设的主机,提供最核心的运行环境 内核模块...:模块的卸载必须等待所有依赖它的模块先卸载 四、手把手教你写第一个内核模块:Hello World 实战 4.1 准备工作 系统要求:Linux 内核开发环境(需安装 kernel-devel 包...:从简单到复杂的关键特性 5.1 模块参数传递:让模块更灵活 通过module_param宏可以在加载模块时传递参数: #include linux/moduleparam.h> static
其实 Linux 内核模块也有类似的调节旋钮,今天要聊的模块参数。它能让你在加载模块时动态配置参数,不用改代码就能实现功能切换,堪称模块开发的效率神器。 一、什么是模块参数?...2.1 第一步:包含头文件 模块参数的所有宏定义都在linux/moduleparam.h中,所以必须先包含这个头文件: #include linux/moduleparam.h> 少了它,编译器会报...2.4 完整示例:定义和声明参数 #include linux/module.h> #include linux/init.h> #include linux/moduleparam.h> /...代码实现(param_demo.c) #include linux/module.h> #include linux/init.h> #include linux/moduleparam.h>...,却体现了 Linux 内核灵活配置的设计哲学。
一、内核模块的 "骨架":最简化结构解析 先看一个能正常编译运行的最小内核模块代码,就像盖房子先搭框架,内核模块也有它的基础骨架: // 必要的头文件 #include linux/init.h>...// 包含模块初始化相关函数 #include linux/module.h> // 包含模块基本定义 // 模块加载时执行的函数 static int __init mymodule_init(...2.2 按需添加的其他头文件 根据模块功能不同,还需要包含特定的头文件: 操作字符设备:linux/fs.h(文件系统相关定义) 内存分配:linux/slab.h(kmalloc函数所在) 网络操作...:linux/net.h 硬件中断:linux/interrupt.h 举个例子:如果你的模块需要分配内核内存,就必须包含linux/slab.h,否则编译器会报kmalloc未定义的错误。...头文件包含 #include linux/module.h> #include linux/init.h> #include linux/kernel.h> #include linux/moduleparam.h
今天咱们就彻底搞懂模块卸载函数,学会让模块 "优雅退场"。 一、卸载函数的角色:模块的 "善后专员" 模块卸载函数是当你执行rmmod命令时,内核自动调用的 "收尾函数"。...__exit:内核会把带这个标记的函数存放在.exit.text段,只有模块支持卸载时才保留 module_exit:注册卸载函数,让内核知道模块卸载时该调用谁 2.2 __exit宏的特殊作用 __...(比如有进程打开了模块创建的设备文件)。...模块卸载函数看似简单,实则是模块稳定性的 "最后一道防线"。...下次写模块时,不妨多花点时间打磨卸载逻辑 —— 毕竟,能优雅退场的模块才是真正可靠的模块。
它们不仅能让内核识别模块的身份,还影响模块的功能权限。 一、为什么需要模块声明?...内核模块加载时也一样,内核需要知道: 这个模块遵循什么许可证(是否允许使用内核的 GPL 符号) 谁开发的(出问题时找谁) 模块的功能是什么(是否与其他模块冲突) 这些信息都通过模块声明来传递,...比如模块 A 使用了模块 B 导出的符号,depends就会显示模块 B 的名称。 六、实战示例:带完整声明的模块代码 下面通过一个完整的模块示例,展示如何正确使用各种声明: 1....模块代码(serial_driver.c) #include linux/module.h> #include linux/init.h> #include linux/usb.h> // 驱动支持的...修订号) 模块声明看似简单,实则是模块开发的基础礼仪—— 清晰的声明能让内核正确识别模块,让管理员轻松管理模块,让其他开发者快速理解模块。
在 Linux 内核模块开发中,GPL 许可证就像一道绕不开的红线。不少开发者好奇:有没有办法让模块不遵循 GPL?如何绕开许可证限制?...具体到 Linux 内核(采用 GPLv2),如果你的模块满足以下任一条件,就必须遵循 GPLv2: 直接链接了内核中用EXPORT_SYMBOL_GPL导出的符号(函数 / 变量) 模块功能被认定为内核的衍生作品...(法律上的判断) 模块与内核结合紧密,形成一个不可分割的整体 1.2 内核符号的双重出口机制 Linux 内核通过两种方式导出符号,直接影响模块的许可证选择: EXPORT_SYMBOL:无许可证限制...风险远大于收益 3.1 法律风险:可能面临诉讼 历史案例:2003 年 SCO 起诉 IBM,声称 Linux 内核包含 SCO 专利(虽然后来 SCO 败诉,但耗时数年) 社区态度:内核社区有专门团队...Linux 内核能成为全球最成功的开源项目之一,GPL 许可证功不可没 —— 它确保了内核的开放性和兼容性,让无数开发者能自由贡献代码。
1. Serial 2. Input 3. I2C 4. USB 5. Video 6. Audio 7. Block 8. MTD
1.1 图书馆的借阅计数器 想象一个图书馆有一本《Linux 内核开发秘籍》: 当第一个读者借阅时,计数器加 1,表示有 1 人正在使用 第二个读者借阅时,计数器变为 2 当一个读者归还时,计数器减...模块结构体中的计数器 在include/linux/module.h中定义: struct module { // ......模块代码(count_demo.c) #include linux/module.h> #include linux/init.h> #include linux/kernel.h> #include...linux/fs.h> #include linux/uaccess.h> #define DEMO_MAJOR 240 #define DEMO_NAME "count_demo" // 设备打开函数...8.2 兼容性处理建议 #if LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0) MOD_INC_USE_COUNT; #else try_module_get
内核模块 实验目的 内核模块是Linux操作系统中一个比较独特的机制。...通过这一章学习,希望能够理解Linux提出内核模块这个机制的意义;理解并掌握Linux实现内核模块机制的基本技术路线;运用Linux提供的工具和命令,掌握操作内核模块的方法。...上述实验过程中,将会遇到Linux为此开发的内核模块操作工具lsmod、insmod、rmmod等。...由于引入了模块机制,Linux的内核可以达到最小,即内核中实现一些基本功能,如从模块到内核的接口,内核管理所有模块的方式等等,而系统的可扩展性就留给模块来完成。...3.3 模块实用程序modutils Linux内核模块机制提供的系统调用大多数都是为modutils程序使用的。可以说,是Linux的内核模块机制和modutils两者的结合提供了模块的编程接口。
Linux内核的作用 ? 管理内存 提高效率,管理可用内存的方式,以及物理和虚拟映射所使用的硬件机制。 调度任务 某些机制执行从用户空间到内核的函数调用。...内核模块 ?...arch 表示各种各样的平台 crypto 安全加密 drivers 驱动各种各样的硬件 fs 文件系统 lib 各种各样的库 net 网络功能 sound 声卡 查看所有模块 lsmod...查看指定模块的详细信息 modinfo 模块名 动态加载模块 modprobe 模块名 动态卸载模块 modprobe -r 模块名 ?...详细学习可参考官网: http://www.tldp.org/LDP/tlk/tlk.html https://mirrors.edge.kernel.org/pub/linux/ ?
背景| Linux 内核模块 Linux 内核模块在概念和原理层面与动态链接模块(DLL或so)类似。...正是因为内核模块这种机制,方便了Linux 贡献者选择设备驱动成为进入 Linux 复杂系统的一个入口点,而不会被 Linux 代码的复杂性而压倒。...也正是因为内核模块这个特点,Rust for Linux 项目的目标就是让 Rust 成为Linux内核模块开发的第二语言。...现在这篇文章就是带你了解如何通过 Rust 为 Linux 编写内核模块。...以上就是模块的整个生命周期,也可作为我们编写内核模块的一个宏观的心智模型。 从零编写一个字符驱动 Linux 中设备通常被分为三类,每个驱动模块通常实现为这三类中的其中一种: 字符设备。
安装pip工具 1、首先检查linux有没有安装python-pip包,直接执行 yum install python-pip ?...模块安装 模块安装(三种方式) 1、 pip install 模块名 easy_install 模块名 如果pip安装慢的话,用阿里云的源吧 pip install 模块名 -i http
模块在加载时,内核会调用module_alloc()来申请足够的内存来存放模块内容。...新的内核引入module PLT(Procedure Link Table)机制,让模块加载使用vmalloc空间的方法,解决模块空间不够用的问题。...变更履历 内核版本4.5.0支持arm64undefinedhttps://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit.../linux.git/commit/?.../linux.git/commit/?
一、何为模块? 文件系统、设备驱动程序、网络协议都可以理解为模块。模块本质也是普通的软件系统。 二、热插拔 硬件层面:只在不断电、不关闭系统的情况下增加或者删除对应部件,比如电源、硬盘。...这次说到的是Linux模块相对于内核的热插拔,可以将模块看做某一硬件设备,内核看做整台物理计算机。
下优秀的启动管理程序(boot loader),而在系统运行期间,你也得要学会管理内核模块,下面进入正题开始学习吧.关于Linux系统的启动流程一览操作系统的启动过程是一个很复杂的过程,在启动过程中,...)的工作情况,才能了解怎样进行多重引导的设置.这里以个人计算机搭建的Linux主机为例子,当你按下电源时计算机硬件会主动读取BIOS来加载硬件的一些信息,和自我检测,之后系统会读取第一个可启动的设备(由...由于具有菜单功能,因此我们可以选择不同的内核来启动,这里需要强调的是,如果要装双系统应该先装windows再装linux.加载内核自检与systemd的功能接下来就是加载内核的时候啦,由于我们的Linux...驱动都是以模块的形式存在的,比如键盘鼠标驱动,网络驱动等,包括我们的硬盘驱动,常用的一些驱动文件就是放在/lib/modules目录内的,那么这里就出现了一个问题,想一下,我们的硬盘驱动是在Linux模块里的...系统,它的作用只是加载系统的必要驱动而已,通过该程序来加载启动过程中所最需要的内核模块,通常这些模块就是 U盘,RAID,LVM,SCSI等文件系统与磁盘驱动程序,等加载完成后会自动调用 /sbin/init
: /lib/modules/3.10.0-957.el7.x86_64/kernel/net/bridge/br_netfilter.ko.xz description: Linux...Y vermagic: 3.10.0-957.el7.x86_64 SMP mod_unload modversions signer: CentOS Linux...,有几个参数我们注意一下就行了,目前的的Linux 发行版所用的内核是2.6x版本,是自动解决依赖关系,所以这个命令知道就行了;模块之前也有依赖关系,比如我们想驱动USB 移动硬盘,目前有两种驱动,一种是...; 再举个例子:sata的硬盘,在 Linux中的设备表示的是/dev/sd* ,比如 /dev/sda,/dev/sdb 等… 系统要驱动 sata硬盘,则需要把sata在内核中选中,或编译成模块,或内置于内核之中...,不能把文件名的后缀省略; 二,与内核模块加载相关的配置文件; 1、模块的配置文件 modules.conf 或 modprobe.conf 内核模块的开机自动挂载模块一般是位于一个配置文件,一般的Linux
调试的三不原则 不要在生产环境调试新模块 不要加载来源不明的模块 调试时不要运行重要程序 二、最基础也最常用:printk 打印日志 如果只能选一个调试工具,那一定是printk。...除了内核态工具,还有一些用户态工具可以帮助观察模块的行为。...1. lsmod 和 modinfo:查看模块信息 lsmod # 查看所有加载的模块及使用计数 lsmod | grep my_module # 查看特定模块 modinfo my_module.ko...# 查看模块详细信息(版本、作者、依赖等) 2. proc 和 sys 文件系统:模块状态接口 在模块中创建 proc 或 sys 接口,暴露内部状态: 创建 proc 文件示例: #include...linux/proc_fs.h> #include linux/seq_file.h> static int my_proc_show(struct seq_file *m, void *v)
我们的Linux进阶部分,到目前为止,已经讲过:硬件,日常运维,基础软件,日志,进阶命令,防火墙,Shell编程,以及本章将要讲解的内核相关内容,和最后一章Linux系统。...让我们了解和熟悉基本的Linux内核相关的信息,Linux内核我们主要从以下几个方面来讲解: Linux内核-什么是内核 Linux内核-内核模块&参数(本章节) Linux内核-proc文件系统 Linux...内核-sys文件系统 Linux内核-tmpfs文件系统 Linux内核升级,在运维生涯中,其实并不常见。...二、常用命令 1.查看内核模块 #查看当前系统加载的内核模块 lsmod #这个目录下就是Linux服务器有的内核模块 /lib/modules/内核版本/kernel 2.添加新的内核模块 [root...这里把内核模块列出来介绍,就是让我们了解和认识内核模块。
在Linux中进行身份或是状态的验证程序是由PAM来进行的,PAM(Pluggable Authentication Modules)可动态加载验证模块,因为可以按需要动态的对验证的内容进行变更,所以可以大大提高验证的灵活性...一、PAM模块介绍 Linux-PAM(即linux可插入认证模块)是一套共享库,使本地系统管理员可以随意选择程序的认证方式。...,可以将pam配置文件分为四列, 第一列代表模块类型 第二列代表控制标记 第三列代表模块路径 第四列代表模块参数 1)第一列:PAM的模块类型 Linux-PAM有四种模块类型,分别代表四种不同的任务,...温馨提示: 如果发生错误,Linux-PAM 可能会改变系统的安全性。这取决于你自己的选择,你可以选择不安全(开放系统)和绝对安全(拒绝任何访问)。通常,Linux-PAM 在发生错误时,倾向于后者。...配置 Linux-PAM 时,可能遇到最大的问题可能就是 Linux-PAM 的配置文件/etc/pam.d/*被删除了。如果发生这种事情,你的系统就会被锁住。