最简单的内核模块编译记录

1、下载源码
参考:https://wiki.centos.org/zh/HowTos/I_need_the_Kernel_Source
yum install kernel-devel

2、编写内核模块代码

#include <linux/module.h>      /* Needed by all modules */
#include <linux/kernel.h>      /* Needed for KERN_INFO */
#include <linux/init.h>        /* Needed for the macros */
static int __init hello_start(void)
{
printk(KERN_INFO "Loading hello module...\n");
printk(KERN_INFO "Hello world\n");
return 0;
}
static void __exit hello_end(void)
{
printk(KERN_INFO "Goodbye,hello world\n");
}
module_init(hello_start);
module_exit(hello_end);

3、编写makefile

obj-m=hello.o
KVERSION=$(shell uname -r)
all:
        make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules
clean:
        make -C /lib/modules/$(KVERSION)/build M=$(PWD) clean                                                          
下载前可以先看下教程 https://pan.quark.cn/s/a426667488ae 标题“仿淘宝jquery图片左右切换带数字”揭示了这是一个关于运用jQuery技术完成的图片轮播机制,其特色在于具备淘宝在线平台普遍存在的图片切换表现,并且在整个切换环节中会展示当前图片的序列号。 此类功能一般应用于电子商务平台的产品呈现环节,使用户可以便捷地查看多张商品的照片。 说明中的“NULL”表示未提供进一步的信息,但我们可以借助标题来揣摩若干核心的技术要点。 在构建此类功能时,开发者通常会借助以下技术手段:1. **jQuery库**:jQuery是一个应用广泛的JavaScript框架,它简化了HTML文档的遍历、事件管理、动画效果以及Ajax通信。 在此项目中,jQuery将负责处理用户的点击动作(实现左右切换),并且制造流畅的过渡效果。 2. **图片轮播扩展工具**:开发者或许会采用现成的jQuery扩展,例如Slick、Bootstrap Carousel或个性化的轮播函数,以达成图片切换的功能。 这些扩展能够辅助迅速构建功能完善的轮播模块。 3. **即时数字呈现**:展示当前图片的序列号,这需要通过JavaScript或jQuery来追踪并调整。 每当图片切换时,相应的数字也会同步更新。 4. **CSS美化**:为了达成淘宝图片切换的视觉效果,可能需要设计特定的CSS样式,涵盖图片的排列方式、过渡效果、点状指示器等。 CSS3的动画和过渡特性(如`transition`和`animation`)在此过程中扮演关键角色。 5. **事件监测**:运用jQuery的`.on()`方法来监测用户的操作,比如点击左右控制按钮或自动按时间间隔切换。 根据用户的交互,触发相应的函数来执行...
在 **Linux 内核模块(Kernel Module)** 的编译中,**不能直接使用普通的 `gcc`**,而是必须使用 **内核专用的编译工具链**,主要包括以下工具和流程: --- ### **1. 为什么不能直接用 `gcc` 编译内核模块?** - **内核头文件和符号依赖**: 内核模块需要链接内核的特定头文件(如 `linux/kernel.h`)和符号表(如 `printk`),这些在用户空间的 `gcc` 默认路径中不存在。 - **特殊编译选项**: 内核模块要求特定的编译器标志(如 `-fno-pic`、`-fno-stack-protector`)和ABI约定,普通 `gcc` 无法自动处理。 - **内核版本匹配**: 模块必须与运行中的内核版本严格匹配(通过 `vermagic` 校验),直接使用 `gcc` 可能导致兼容性问题。 --- ### **2. 内核模块编译的正确工具链** #### **(1) 核心工具:`make` + 内核构建系统** 通过内核的 `Makefile` 系统调用底层工具链,包括: - **`kbuild`**:内核专用的构建系统。 - **`gcc` 的变体**: 实际仍使用 `gcc`,但通过内核的 **`$(CC)`** 变量调用,并附加内核要求的编译选项(如 `-std=gnu11 -fshort-wchar`)。 - **其他工具**: `ld`(链接器)、`objcopy`(生成 `.ko` 文件)、`depmod`(处理模块依赖)。 #### **(2) 典型编译命令** ```bash # 进入模块源码目录 cd /path/to/module # 使用内核的 Makefile 编译 make -C /lib/modules/$(uname -r)/build M=$(pwd) modules ``` - **`-C`**:指定内核源码目录(通常是 `/lib/modules/$(uname -r)/build`)。 - **`M=$(pwd)`**:告诉内核构建系统模块源码的路径。 --- ### **3. 内核模块编译流程** 1. **预处理**: 展开头文件(如 `#include <linux/module.h>`)。 2. **编译**: 将 `.c` 文件转为 `.o` 文件,使用内核定义的编译器标志。 3. **链接**: 生成 `.ko`(Kernel Object)文件,包含模块元数据(如 `__this_module`)。 4. **签名(可选)**: 对模块进行加密签名(安全启动时需要)。 --- ### **4. 示例:最简单内核模块编译** #### **(1) 模块源码 (`hello.c`)** ```c #include <linux/init.h> #include <linux/module.h> MODULE_LICENSE("GPL"); static int __init hello_init(void) { printk(KERN_INFO "Hello, kernel!\n"); return 0; } static void __exit hello_exit(void) { printk(KERN_INFO "Goodbye, kernel!\n"); } module_init(hello_init); module_exit(hello_exit); ``` #### **(2) 对应的 `Makefile`** ```makefile obj-m := hello.o KDIR := /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) default: $(MAKE) -C $(KDIR) M=$(PWD) modules ``` #### **(3) 编译并加载模块** ```bash make # 编译生成 hello.ko sudo insmod hello.ko # 加载模块 dmesg | tail # 查看内核日志输出 sudo rmmod hello # 卸载模块 ``` --- ### **5. 注意事项** - **内核源码依赖**: 必须安装与当前内核版本匹配的源码(如 `linux-headers-$(uname -r)`)。 - **交叉编译**: 嵌入式开发中需指定交叉编译器(如 `make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-`)。 - **调试**: 建议启用 `CONFIG_DEBUG_INFO` 和 `CONFIG_KASAN` 编译内核以支持调试。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值