文章翻译自:
http://derekmolloy.ie/writing-a-linux-kernel-module-part-1-introduction/
http://derekmolloy.ie/writing-a-linux-kernel-module-part-2-a-character-device/
我想写一个linux内核模块,让他可以跟我的用户程序一起工作:一个普通的.c程序可以调用printk之类的内核函数。但是我找不到太多的教程,上面这个链接是我找到比较新的教程。
一、写一个可加载内核模块loadable kernel module (LKM)
一个可加载内核模块loadable kernel module (LKM)是一种运行时给linux kernel添加或者删除代码的机制。非常适合用来做设备驱动器,可以让内核在不知道硬件具体细节的情况下与硬件通信。如果不用LKM,就只能把每个驱动器的代码写进kernel里面。
linux kernel就会变得十分臃肿。如果你想添加新的硬件或者升级驱动器,你就要重新build整个kernel。LKM在运行时加载,但是并不在用户空间执行,他们实质上是内核的一部分。
内核空间和用户空间有各自独立的内存地址空间。通过超级用户与普通用户权限的保护机制,内核可以防止不同的用户程序彼此冲突。
用嵌入式linux的时候你要使用sysfs和低级的文件操作与电路板通信。在linux用户空间用pthreads、回调函数和sys/poll.h实现。但是也可以用内核代码,可以支持中断
内核模块的特点(区别于用户程序):
- 并不会顺序执行,而是事件驱动。
- 并不会自动回收资源
- 不能使用printf(),但是可以使用printk()
- 比用户程序有更高的执行优先级
- 不支持浮点数