Linux内核模块编程入门学习_第1页
Linux内核模块编程入门学习_第2页
Linux内核模块编程入门学习_第3页
Linux内核模块编程入门学习_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

精品文档-下载后可编辑Linux内核模块编程入门学习内核模块是Linux内核向外部提供的一个插口,其全称为动态可加载内核模块(LoadableKernelModule,LKM),我们简称为模块。Linux内核之所以提供模块机制,是因为它本身是一个单内核(monolithICkernel)。单内核的优点是效率高,因为所有的内容都集成在一起,但其缺点是可扩展性和可维护性相对较差,模块机制就是为了弥补这一缺陷。

模块是具有独立功能的程序,它可以被单独编译,但不能独立运行。它在运行时被链接到内核作为内核的一部分在内核空间运行,这与运行在用户空间的进程是不同的。模块通常由一组函数和数据结构组成,用来实现一种文件系统、一个驱动程序或其他内核上层的功能。

编写一个简单的模块

模块和内核都在内核空间运行,模块编程在一定意义上说就是内核编程。因为内核版本的每次变化,其中的某些函数名也会相应地发生变化,因此模块编程与内核版本密切相关。

程序举例

hellomod.c

001

//helloworlddriverforLinux2.6

004#include

005#include

006#include

/*必要的头文件*/

009staticint__initlkp_init(void)

{

printk(“1Hello,World!fromthekernelspace…\n”);

return0;

013}

015staticvoid__exitlkp_cleanup(void)

{

printk(“1Goodbye,World!leavingkernelspace…\n”);

018

}

020module_init(lkp_init);

021module_exit(lkp_cleanup);

022MODULE_LICENSE(“GPL”);

说明

第4行:

所有模块都要使用头文件module.h,此文件必须包含进来。

第5行:

头文件kernel.h包含了常用的内核函数。

第6行:

头文件init.h包含了宏_init和_exit,它们允许释放内核占用的内存。

建议浏览一下该文件中的代码和解释。

第9-12行:

这是模块的初始化函数,它必需包含诸如要编译的代码、初始化数据结构等内容。

第11行使用了printk()函数,该函数是由内核定义的,功能与C库中的printf()类似,

它把要打印的信息输出到终端或系统日志。字符串中的1是输出的级别,

表示立即在终端输出。

第15-18行:

这是模块的退出和清理函数。此处可以做所有终止该驱动程序时相关的清理工作。

第20行:

这是驱动程序初始化的入口点。对于内置模块,内核在引导时调用该入口点;

对于可加载模块则在该模块插入内核时才调用。

第21行:

对于可加载模块,内核在此处调用module_cleanup()函数,而对于内置的模块,

它什么都不做。

第22行:

提示可能没有GNU公共许可证。有几个宏是在2.4版的内核中才开发的(详情参见modules.h)。

函数module_init()和cleanup_exit()是模块编程

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论