前段时间忙着学python语言,其实,学得不咋滴~~从习惯的底层编程换到上层编程,不用考虑内存的东西,还不用申请变量,总感觉不太习惯,相信久了就会好了,不过已经基本可以看懂程序了,语言确实简单。留着以后慢慢琢磨吧。
现在需要学习linux下的驱动了,一直都想学,上学期学习迷茫期中,有个机会去广州参加尚观的一个七天免费培训,学了一下,可惜回来后没有继续搞驱动,而是自己找了一个项目自己从上层开始折腾了——就是那个远程监控的东东。
因为给自己定的方针是先易后难,逐渐摸索,有了一定能力就去多了解背景架构的东西,最好快点儿让自己有些成就感。废话不多说了,反正这两天开始学习驱动了。
按照网上的hello world驱动教程,总会 有些问题,今日忽然解决了,糊里糊涂的不太清楚什么原因,只是把系统源代码路径改为了本系统的就好了。
下面我也把代码贴一遍:
#include <linux/module.h>//所有模块都需要的头文件 #include <linux/init.h> MODULE_LICENSE("GPL"); static int __init hello_init(void) { printk("Hello module init!\n"); return 0; } static void __exit hello_exit(void) { printk("Goodbye ,cruel world!\n"); } module_init(hello_init); 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,驱动大概流程怎样,应该怎么走知道了,下面就是折腾具体技术问题了。预祝成功。