linux 2.6 驱动笔记(一)
本文作为linux 2.6 驱动笔记,记录环境搭建及linux基本内核模块编译加载。
环境搭建:
硬件:OK6410开发板
目标板操作系统:linux 2.6
交叉编译环境:windows 7 + vmware work station + redhat 9 + arm-gcc-linux
步骤:
编写简单内核模块,如下
#include<linux/init.h> #include<linux/module.h> static int hello_init(void){ printk("hello_init"); return 0; } static void hello_exit(void){ printk("hello_exit"); } module_init(hello_init); //加载时调用 modeule_exit(hello_exit);//卸载时调用
编写makefile(网上现成的模板):
KERNELDIR = /home/linux-2.6.36/linux-2.6.36.2-v1.05 //交叉编译环境中的内核源码路径 PWD := $(shell pwd) CC = arm-linux-gcc obj-m := driver01.o //与编译的.c文件同名 modules: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules //前面要有tag clean: rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions .PHONY: modules clean
编译产生driver01.ko,拷贝至目标板(采用SD卡),执行:insmod driver01.ko,控制台打印“hello_init”。执行lsmod后显示:
备注:
1. “ error: generated/bounds.h: No such file or directory” 编译错误,makefile中的kerneldir是内核源码的地址,在编译时用于头文件的引用。bounds.h是需要linux编译后生成,因此出现该问题需要make一下linux源码;
2. "module license 'unspecified' taints kernel" 告警,原因是内核模块源码中未增加“MODULE_LICENSE("GPL");”
3. arm-linux-gcc安装完后,在redhat linux中通过修改etc/profile增加环境变量,如下:
# Path manipulation if [ `id -u` = 0 ]; then pathmunge /sbin pathmunge /usr/sbin pathmunge /usr/local/sbin pathmunge /home/arm/usr/local/arm/4.3.2/bin fi
4. 在windows 7下通过ssh客户端连接vmware上的redhat时,IP用的是vmawre的虚拟网卡,而非xp时真实的网口ip。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)