Linux下的第一个驱动


前段时间忙着学python语言,其实,学得不咋滴~~从习惯的底层编程换到上层编程,不用考虑内存的东西,还不用申请变量,总感觉不太习惯,相信久了就会好了,不过已经基本可以看懂程序了,语言确实简单。留着以后慢慢琢磨吧。

现在需要学习linux下的驱动了,一直都想学,上学期学习迷茫期中,有个机会去广州参加尚观的一个七天免费培训,学了一下,可惜回来后没有继续搞驱动,而是自己找了一个项目自己从上层开始折腾了——就是那个远程监控的东东。

因为给自己定的方针是先易后难,逐渐摸索,有了一定能力就去多了解背景架构的东西,最好快点儿让自己有些成就感。废话不多说了,反正这两天开始学习驱动了。

按照网上的hello world驱动教程,总会 有些问题,今日忽然解决了,糊里糊涂的不太清楚什么原因,只是把系统源代码路径改为了本系统的就好了。

下面我也把代码贴一遍:

  1. #include <linux/module.h>//所有模块都需要的头文件   
  2. #include <linux/init.h>   
  3. MODULE_LICENSE("GPL");   
  4. static int __init hello_init(void)   
  5. {   
  6.     printk("Hello module init!\n");   
  7.     return 0;   
  8. }   
  9. static void __exit hello_exit(void)   
  10. {   
  11.     printk("Goodbye ,cruel world!\n");   
  12. }   
  13. module_init(hello_init);   
  14. module_exit(hello_exit);  

文件内容我就不多解释了,网上大把

然后是Makefile文件:

PWD = $(shell pwd)

KERNEL_SRC = /usr/src/linux-headers-2.6.35-22-generic/  ###我就是改的这句粗体字,我的系统是这个通用版本的,更好的办法是用$(shell uname -r)代替

obj-m:=hello.o

module-objs:=hello.o

all:

$(MAKE) -C $(KERNEL_SRC) M=$(PWD) modules #####记住有tab键,不要复制我的,我这是空格键

## -C 是改变它的目录到$(KERNEL_SRC) 目录下,执行完该目录下的modules之后,回到$(PWD)当前路径下

clean:

rm *.ko

rm *.o

rm -f *mod*

rm  -f Mod*

以前,有段时间学过《跟我一起写makefile》,只是一直没怎么用过,都忘记了,到现在具体规则记不住了,只记得就是这么简单一回事,编译谁,生成谁,怎么编译。一直不明不白的为什么只是make一下就会自动编译,今天实验了一下,把all: 和clean: 顺序调换了一下,然后使用make,发现会出错,终于明白:使用make命令会默认执行第一个标签的命令!!

执行insmod hello.ko

知性rmmod hello.ko

命令行没有任何显示

查看系统日志,  vim /var/log/kern.log(syslog也行),  然后Shift + G 看到底行出现了预期的打印字符。成功了。

从网上看到的,这个makefile作为模板挺不错,像python语言一样优美整洁:

obj-m : = test.o

KERNELDIR := /lib/modules/$(shell uname -r)/build

default:

(tab键)make -C $(KERNELDIR) M=$(shell pwd) modules

install:

insmod test.ko

uninstall:

rmmod test.ko

clean:

make -C $(KERNELDIR) M=$(shell pwd) clean

OK,驱动大概流程怎样,应该怎么走知道了,下面就是折腾具体技术问题了。预祝成功。

相关内容