【9】linux模块编程

【9】linux模块编程

ID:41909589

大小:1.86 MB

页数:29页

时间:2019-09-04

【9】linux模块编程_第1页
【9】linux模块编程_第2页
【9】linux模块编程_第3页
【9】linux模块编程_第4页
【9】linux模块编程_第5页
资源描述:

《【9】linux模块编程》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、Linux模块编程1主要内容1Linux内核模块机制介绍2内核编程2微内核与单内核Linux的模块机制Linux内核模块机制介绍13先来区分进程的两种运行模式:用户模式(usermode)运行在用户空间,实现用户的功能内核模式(kernelmode运行在内核空间,一般是实现系统相关的功能。进程在自己空间中实现用户功能时,如果想使用系统功能,必须将运行级别从用户态提升到核心态才能访问内核空间,实现相关操作。这个过程是通过系统调用实现的,而用户态切换到核心态过程不可避免的存在一定开销。41.两种体系结构下的内核微内核(M

2、icrokernel)最常用的功能模块被设计成内核模式运行的一个或一组进程,通常只包含进程调度、内存管理和进程间通信几个基本功能。其他功能都作为单独的进程在用户模式下运行,通过信号量、邮箱等信息传递方式进行通信。灵活、易于移植。进程间通信开销大,速度相对较慢。单内核(Monolithickernel,有时也叫宏内核Macrokernel)内核一般做为一个大进程存在,内部各功能模块可直接调用彼此的函数。因为都在内核空间,没有切换开销,效率上有一定优势。可扩展性和可维护性比较差。52.Linux的模块机制Linux操作系

3、统内核是单内核,速度和性能都很高,问题在于如何提高可扩展性和可维护性?模块(Module)机制用户可以根据需要,在不需要对内核重新编译的情况下,可以将模块动态地载入或移出内核。6模块的编写模块的编译模块的安装与使用2模块编程7内核模式下编程的一些限制:不能使用用户模式下的C标准库,因为内核模式下不存在libc库,也就没有这些用户函数供调用。不能使用浮点运算,因为linux内核切换模式时不保存处理器的浮点状态。不要让内核程序进行长时间等待,因为linux内核是非抢占的。尽可能保持代码的清洁易懂,因为内核调试不方便,简洁

4、的代码能减少并方便后期调试。81.模块的编写一个模块一般包含如下几部分许可证声明模块初始化和退出函数声明初始化和退出函数普通函数模块导出符号表其他操作9关于模块导出符号表只有模块中导出的内核函数才可以被其它模块调用。导出的内核符号表被看作是导出的内核接口,也可以看作内核API。在内核中,导出内核函数使用的指令有:10关于模块的许可证从Linux内核2.4.10开始,动态加载的模块必须通过MODULE_LICENSE宏声明此模块的许可证,否则动态加载时,会收到内核被污染“modulelicense‘unspecifie

5、d’taintskernel.”的警告。被内核接受的许可证有很多,最常用的的是“GPL”和"DualBSD/GPL"。书写格式如下:MODULE_LICENSE("GPL");MODULE_LICENSE("DualBSD/GPL");11关于模块的参数Linux操作系统内核模块也可带参数定义一个模块参数module_param(name,type,perm);name参数名type参数类型perm指定模块在sysfs文件系统下的对应文件权限,可用八进制,或S_Ifoo形式,如S_IRUGO

6、S_IWUSR表示任何人

7、可读,所有者可写。如:staticchar*user_name=“username”;module_param(user_name,charp,S_IRUGO);安装模块时使用参数insmodmodule.kouser_name=book_user1type参数:byte字节short短整型ushort无符号短整型int整型uint无符号整型long长整型ulong无符号长整型charp字符指针bool布尔类型12关于模块使用计数内核需要记录加载到系统里的每一个模块的使用情况。在Linux操作系统2.4内核中使用两个

8、宏来完成对模块引用计数的操作:在Linux操作系统2.6内核中,使用下面的两个函数来完成对模块引用计数的操作:13编写一个内核模块module,向外导出两个函数,分别是“求累积和”和“求阶乘”功能。编写另两个内核模块module1、module2,分别使用上面module模块中的函数,实现计算。注意路径清晰,分别在三个目录下编写内核编写实例14内核调试常用函数——printkprintk是内核使用的函数,接口和printf()基本相似,可以在控制台显示多达1024个字符。内核根据“记录级别”判断是否在终端打印消息。没

9、有指定日志级别的printk语句默认采用的级别是DEFAULT_MESSAGE_LOGLEVEL(级别在4),看不到输出,因为正常输出的前提是──日志输出级别小于console_loglevel(在内核中数字越小优先级越高)。这些级别都是简单宏定义,可在include/linux/kernel.h中查看。15#include

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。