松江网站建设,漳州网站建设优化推广,免费的wordpress主题好,校园门户网站建设项目技术支持目录
一、设备类型
二、模块
构建模块
安装模块
载入模块 一、设备类型
在 Linux 以及 Unix 系统中#xff0c;设备被分为以下三种类型#xff1a;
块设备#xff08;blkdev#xff09;#xff1a;以块为寻址单位#xff0c;块的大小随设备的不同而变化#xff1…目录
一、设备类型
二、模块
构建模块
安装模块
载入模块 一、设备类型
在 Linux 以及 Unix 系统中设备被分为以下三种类型
块设备blkdev以块为寻址单位块的大小随设备的不同而变化块设备通常支持重定位seeking操作也就是对数据的随机访问。如硬盘、蓝光光碟和 Flash 这样的存储设备都是块设备。块设备是通过称为 ”块设备节点“ 的特殊文件来访问的并且通常被挂载为文件系统。字符设备cdev不可寻址只提供数据的流式访问即一个一个字符或字节地访问。如键盘、鼠标和打印机等都是字符设备。字符设备是通过称为 ”字符设备节点“ 的特殊文件来访问的与块设备不同应用程序通过直接访问设备节点与字符设备交互。网络设备有时也被称为以太网设备ethernet devices提供了对网络的访问这是通过一个物理适配器和一种特定的协议进行的。它不是通过设备节点来访问而是通过套接字 API 这样的特殊接口来访问。
并不是所有设备驱动都表示物理设备。有些设备驱动是虚拟的仅仅提供访问内核功能而已。这种设备被称为 ”伪设备“ (pseudo device)如内核随机数发生器/dev/random、空设备/dev/null等。
二、模块
尽管 Linux 是 ”单块内核“monolithic的操作系统但 Linux 内核时模块化组成的它允许内核在运行时动态地向其中安装或卸载一个模块。
下面编写一个 HelloWorld的模块程序
#include linux/init.h
#include linux/module.h
#include linux/kernel.h/* 初始化函数当模块装载时被调用 */
static int hello_init(void)
{printk(KERN_ALERT Module installed!\n);return 0;
}/* 退出函数当模块卸载时调用 */
static void hello_exit(void)
{printk(KERN_ALERT Module removed!\n);
}module_init(hello_init);
module_exit(hello_exit);MODULE_LICENSE(GPL);这是一个非常非常简单的内核模块程序hello_init() 是模块的入口点它通过 module_init() 例程注册到系统中在内核装载时调用。这个 init 函数仅仅打印了一行简单的信息但在实际的模块中该函数还会注册资源、初始化硬件、分配数据结构等。而 hello_exit() 函数负责对 init 函数以及在模块生命周期过程中所作的一切事情进行撤销与清理工作。
构建模块
下面开始构建模块。有两种方法来构建模块
第一种是放在内核源代码树中。这样构建的模块会正式成为 Linux 内核中的一部分设备驱动程序存放在内核源码树根目录下的 /drivers 的子目录下根据不同的设备类型字符设备存放于 /drivers/char块设备存放于 /drivers/block 等。
假如我们编写的模块类型是字符设备那就把模块文件移动到 /drivers/char 目录下然后往 /drivers/char 目录下的 Makefile 文件中添加一行
obj-m hello.o
然后编译内核重新装载内核即可。
第二种是放在内核代码外。将 hello.c 放到 /drivers/char 目录下后在内核代码外创建一个 Makefile 文件内容如下
# -C 后为你的内核源码树所在位置
# make -C /root/linux_kernel_learning/linux-2.6 modulesobj-m hello.o然后执行如下指令来构建模块
make -C /root/linux_kernel_learning/linux-2.6 SUBDIRS$PWD modules
安装模块
编译后模块将被装入到目录 /lib/modules/version/kernel/drivers/char 下 下面的构建命令用来安装编译的模块在内核源码树目录下执行
make modules_install
载入模块
载入一个模块
insmod hello.ko
卸载一个模块
rmmod hello.ko