Linux内核模块编程
摘要
Linux内核模块编程的资料有些纷繁复杂,有的过于简单,有的过于庞杂,我试图用笔记的形式想读者展示怎样来进程Linux模块编程,力图做到简明扼要,这篇文章也是作为本人备忘的资料,所以有些地方过于简略是难免的。本来这篇文章的目的就是让用户知其然,至于所以然还是请参考相应的资料,其实最好的资料莫过于Linux Kernel Source。
适用范围:
Linux Kernel >= 2.6.0
Linux模块简介
首先这个module不同于microkernel的module,microkernel的module是一个个的daemon进程,工作于用户空间,Linux的module只是一个内核的目标代码,内核通过执行运行时的连接,来把它整合到kernel中去,所以说Linux的module机制并没有改变Linux内核为monolithic OS本质,其module也是工作于内核模式,享有内核的所有特权。
至于为什么要引入Linux Kernle Module(一下简称LKM),我想至少有一下几点:
模块化编程的需要,降低开发和维护成本。
增强系统的灵活性,使得修改一些内核功能而不必重新编译内核和重启系统。
降低内核编程的复杂性,使入门门槛降低。
相关宏及头文件
LKM需要包含以下头文件:<linux/kernel.h> <linux/module.h>
需要定义以下宏:__KERNEL__, MODULE
一个简单的内核模块示例
/*file: hello.c*/
#ifndef __KERNEL__
#define __KERNEL__
#endif
#ifndef MODULE
#define MODULE
#endif
#include <linux/module.h>
#include <linux/kernel.h>
static int __init hello_init(void)
{
printk(KERN_ALERT "Hello, my LKM.\n");
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_ALERT "Bye, my LKM.\n");
}
module_init(hello_init);
module_exit(hello_exit);
很简答吧,不是吗?这个LKM的功能其实也很简单,就是当通过insmod加载它的时候,他打印Hello, my LKM.通过rmmod卸载它的时候他打印bye, my LKM.一个最基本的内核模块一般都包含有两个函数,一个是初始化函数(比如说这里的hello_init),一个是卸载函数(hello_exit), 当然也可以没有任何函数,只是提供一些变量。但是初始化函数和卸载函数必须成对出现。并且init函数当操作成功时返回值大于等于零,当操作失败时,返回非零。宏module_init和module_exit用于注册初始化函数和卸载函数。
LKM的编译
一个示例的Makefile如下所示
obj-m := hello.o
KERNE
相关文档:
Service Discovery Protocol(SDP)提供一种能力,让应用程序有方法发现哪种服务可用以及这种服务的特性。
服务发现协议(SDP或Bluetooth SDP)在蓝牙协议栈中对蓝牙环境中的应用程序有特殊的含意,发现哪个服务是可用的和确定这些可用服务的特征。SDP定义了bluetooth client发现可用bluetooth server服务和它们的特征的方法。 ......
一:前言
最近在研究android的sensor driver,主要是E-compass,其中用到了Linux input子系统.在网上也看了很多这方面的资料,感觉还是这篇分析的比较细致透彻,因此转载一下以便自己学习,同时和大家分享!
(这篇博客主要是以键盘驱动为例的,不过讲解的是Linux Input Subsystem,可以仔细的研究一下!)
键盘驱动将检 ......
如果想在Linux命令行方式下,对2个文本文件的内容做比较,找出同时包含在这2个文本文件中的内容,可以使用Linux系统带的工具comm来处理,前提是被比较的2个文本文件要是有序的,可以先用sort处理一下,具体操作方法如下:
原始文件如下:
a.txt
d
c
b
a
b.txt
g
f
b
a
排序处理
sort a.txt > a1.txt ......
用GCC开发linux应用程序(经典)
2009年11月01日 星期日 23:58
作为自由软件的旗舰项目,Richard Stallman 在十多年前刚开始写作 GCC 的时候,还只是把它当作仅仅一个 C程序语言的编译器;GCC 的意思也只是 GNU C Compiler 而已。经过了这么多年的发展,GCC 已经不仅仅能支持 C语言;它现在还支持 Ada 语言、C++ 语言、Ja ......
1 内存地址
linux中,我们必须区分三种不同的地址
逻辑地址:机器语言指令中用来指定一个操作数和一个指令的地址.在X86中,每一个逻辑地址都由一个段(segment)和偏移量(offset)组成.
线性地址(也称虚拟地址):是一个32位无符号函数,可以表示高达4GB的地址,范围从0x00000000到0 ......