我打算写这篇文章,记录自己的学习历程,也算是以后的查阅宝典,不确定适合任何人。不会按照文章的格式来写,完全按照学习顺序来写。希望站在前线的linux 战友们提出宝贵意见,若有内容与某网友相同,则可认为我曾经搜到过你的文章。我的学习过程也不会分 1,2,3...... 。按照学习顺序补充文章。若有战友转载,请添加上自己的经验,帮助奋斗在前线的战友们。
1,最简单的字符驱动,就是hello world 。我把hello world 也引进驱动了(或许大家都是)。
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
MODULE_LICENSE("Dual BSD/GPL"); //这个是必须加的。因为开源
static int hello_init(void)
{
printk("<1>""Hello World \n");
return 0;
}
static void hello_exit(void)
{
printk("<1>""Bye Bye !\n");
}
module_init(hello_init);
module_exit(hello_exit);
程序写到上面,基本框架已经写完了。框架没有什么可以说的,就是这个套路,开始还是背过吧。
在上面的文章中,有以下几个点:
MODULE_LICENSE();开源代码,还是加上吧。
printk():与应用中的C 语言的printf(),使用一样,若没有添加下面的级别,会在加载驱动时打印不出来字符串。
<1>:
Makefile:
obj-m :=file_option.o
KERNELDR := /home/edu/linux-3.0.1
PWD :=$(shell pwd)
modules:
(Tab键)$(MAKE) -C $(KERNELDR) M = $(PWD) modules
modules_install:
(Tab键)$(MAKE) -C $(KERNELDR) M = $(PWD) modules_install
clean:
(Tab键)rm -rf *.o *.ko *.mod.* *.order *.symvers
若有战友看到这个截图,这是我的ubuntu 系统截图。file_option.o 要更换自己的驱动c文件名。KERNELDR 更换自己的内核文件路径。下面可以仿造了。
现在可以小试牛刀了。
下面的计划是 添加 file_operations 结构体,添加字符注册函数register_chrdev() ,添加unregister_chrdev(),创建节点
mknod /dev/文件名 c 主设备号 次设备号 。 主设备号和文件名用 cat /proc/devices 获得主设备号和文件名。次设备号为0
下次再议。