Writing device drivers in Linux: A brief tutorial(二)

来源:互联网 发布:华网1588建站 编辑:程序博客网 时间:2024/05/01 23:01

内核空间和硬件设备之间的接口函数

在内核空间也有一些函数来控制设备或者用于内核和硬件之间的信息交换,下表阐述了这些概念.这个表也会随着一些概念的引入而完善.

 

Events

Kernel functions

Read data

 

Write data

 

表  设备驱动事件和与之相联系的介于内核空间和硬件设备之间的函数

 

第一个驱动程序:在用户空间加载和卸载驱动

         我将给你演示如何开发你的第一个Linux设备驱动,这个驱动将会以模块的形式加载到内核。

         为了达到以上目的,我将编写如下的程序,并将其命名为nothing.c

 

#include<linux/module.h>

MODULE_LICENSE("DualBSD/GPL");

 

         因为目前内核的发行版本是2.6.x,所以编译模块已经变得稍微复杂一些了。首先,你需要有一个完整的,被编译过的内核源码树。如果你有一个Debian Sarge系统,你可以按照附录B的步骤来完成(在本文章的后面)。在以后,我将假定你使用的是2.6.8的内核版本。

         然后,你需要编写一个makefile文件,对于我们当前的这个例子来说,我们应该编写一个名为“Makefile”的文件,它的内容如下:

 

obj-m := nothing.o

 

         和以往的内核版本不同,根据你准备将之后生成的模块用在哪个版本的内核中,你在编译这个模块的时候就必须使用和你这个目标内核相同的内核。为了编译它,你可以键入下面的命令:

 

$ make -C/usr/src/kernel-source-2.6.8 M=pwd modules

 

         这个非常简单的模块属于内核空间,在它被加载的时刻起它就成为了内核的一部分。在用户空间,你可以以root用户的权限键入以下命令行加载这个模块:

 

# insmod nothing.ko

 

         使用insmod命令可以将这个模块安装到内核。但是,实际上这个特殊的模块本身并没有很大的用处。

         为了检查我们的模块是否正确安装,我们可以键入以下命令来查看所有我们已经安装好的模块:

 

# lsmod

 

         最后,我们可以使用以下命令来移除我们已经安装的模块:

 

# rmmod nothing

 

         现在,通过再次键入lsmod命令,你可以确认这个模块在内核中已经不存在了。

         所有的总结到以下表中为:

 

Events

User functions

Kernel functions

Load module

Insmod

 

Open device

 

 

Read device

 

 

Write device

 

 

Close device

 

 

Remove module

rmmod

 

表  设备驱动事件和与对应的在用户空间和内核空间的交互函数


原创粉丝点击