LINUX驱动版本的hello world
http://hi.baidu.com/ah%5F%5Ffu/blog/item/57b76201e27095de267fb5d4.html 终于下决心好好学习LINUX内核和驱动开发了,不怕千万人耻笑,勇敢将自己的学习过程写出来:1、关于目录 /lib/modules/2.6.9-42.ELsmp/build/ 这个是内核源码所在的目录 一般使用这样的命令进入这个目录:cd /lib/modules/$(uname -r)/build/ 这个目录实际上指向了:/usr/src/kernels/2.6.9-42.EL-smp-i686 2、编译驱动所使用的makefile 实际上编译驱动的时候是使用预先提供的一个makefile的,位置在: /lib/modules/$(uname -r)/build/Makefile 注意:M是大写的 3、网上抄录的Linux驱动Hello world的源码: // hello.c #include <linux/init.h> #include <linux/module.h> MODULE_LICENSE("Dual BSD/GPL"); static int hello_init(void) { printk(KERN_ALERT "hello world!\n"); return 0; } static void hello_exit(void) { printk(KERN_ALERT "goodbye!\n"); } module_init(hello_init); module_exit(hello_exit); 4、写个makefile来编译这个驱动:(版本一,最简单的) #下面这行是文件Makefile的内容,注意M是大写的 obj-m := hello.o 把hello.c和Makefile保存在同一目录,然后执行: make -C /lib/modules/`uname -r`/build SUBDIRS=$PWD modules 这样驱动就编译好了,成果是hello.ko文件。 注意:makefile一定要写成Makefile,如果写成makefile就编译不过。(折腾啊,就这一步耗了N多时间) 5、再写另一种Makefile:(版本二:最省事的) #以下是Makefile文件的内容 obj-m := hello.o KERNEL_DIR := /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) all: make -C $(KERNEL_DIR) SUBDIRS=$(PWD) modules clean: rm *.o *.ko 然后执行:make就编译成功了,命令行不再加参数,很省事。 注意:all: 和clean:下面的行,前面是一个TAB键 6、加载驱动: 执行 insmod ./hello.ko 屏幕上没反应。(因为我是在WINDOWS上用远程终端连上去的嘛) OK,先让时光倒流,回到加载驱动以前,先另开一个窗口,执行: tail -f /var/log/message 然后在原来的窗口里执行: insmod ./hello.ko 哈哈,/var/log/message文件里面看见了盼望已久的hello world! 7、查看驱动: lsmod 看见 hello这个驱动在其中 8、卸载驱动: rmmod hello 看见/var/log/message里显示了goodbye
|
附录为通过编译的helloworld程序
hello.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | #include <linux/init.h> #include <linux/module.h> static int hello_init( void ) { printk(KERN_INFO " Hello World enter\n" ); return 0; } static void hello_exit( void ) { printk(KERN_INFO " Hello World exit\n " ); } module_init(hello_init); module_exit(hello_exit); MODULE_AUTHOR( "Barry Song <21cnbao@gmail.com>" ); MODULE_LICENSE( "Dual BSD/GPL" ); MODULE_DESCRIPTION( "A simple Hello World Module" ); MODULE_ALIAS( "a simplest module" ); |
Makefile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | KVERS = $(shell uname -r) # Kernel modules obj-m += hello.o # Specify flags for the module compilation. #EXTRA_CFLAGS=-g -O0 build: kernel_modules kernel_modules: make -C /lib/modules/$(KVERS)/build M=$(CURDIR) modules clean: make -C /lib/modules/$(KVERS)/build M=$(CURDIR) clean |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· .NET 进程 stackoverflow异常后,还可以接收 TCP 连接请求吗?
· 本地部署 DeepSeek:小白也能轻松搞定!
· 如何给本地部署的DeepSeek投喂数据,让他更懂你
· 在缓慢中沉淀,在挑战中重生!2024个人总结!
· 大人,时代变了! 赶快把自有业务的本地AI“模型”训练起来!
· 从 Windows Forms 到微服务的经验教训