Linux内核模块和驱动的编写.doc
上传人:qw****27 上传时间:2024-09-12 格式:DOC 页数:7 大小:29KB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

Linux内核模块和驱动的编写.doc

Linux内核模块和驱动的编写.doc

预览

在线预览结束,喜欢就下载吧,查找使用更方便

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

Linux内核是一个整体是结构,因此向内核添加任何东西,或者删除某些功能,都十分困难。为了解决这个问题引入了内核机制。从而可以动态的想内核中添加或者删除模块。模块不被编译在内核中,因而控制了内核的大小.然而模块一旦被插入内核,他就和内核其他部分一样.这样一来就会曾家一部分系统开销。同时,如果模块出现问题,也许会带来系统的崩溃。模块的实现机制:启动时,由函数voidinti_modules()来初始化模块,因为启动事很多时候没有模块.这个函数往往把内核自身当作一个虚模块。如由系统需要,则调用一系列以sys开头的函数,对模块进行操作.如:sys_creat_modules(),sys_inti_modules(),sys_deldte_modules()等等.这里会用到一些模块的数据就结构,在/usr/scr/Linux/include/Linux/module.h中,有兴趣的朋友可以找出来一看块的加入有两种方法:一是手动加入:如:insmodmodulename.另一种是根据需要,动态的加载模块:如你执行命令:$mount-tmsdos/dev/hdd/mnt/d时.系统便自动加载FAT模块,以支持MSDOS的文件系统。1.模块编程写一个模块,必须有一定的多进程编程基础,因为你变得程序不是以一个独立的程序的来运行的。另外,因为,模块需要在内核模式下运行,会遇到在内和空间和用户空间数据交换的问题.一般的数据复制函数无法完成这一个过程。因此系统已入了一些特殊的函数以用来完成内核空间和用户空间数据的交换/这些函数有:voidput_user(typevalude,type*u_addr)memcpy_tofs()等等,有兴趣的朋友可以仔细的看看所有的函数,以及他们的用法.需要说明的是.模块编程河内核的版本有很大的关系。如果版本不通可能造成,内核模块不能编译,或者.在运行这个模块时,出现不可测结果。如:系统崩溃等。明白了这些以后,你就可以尝试着编写内核模块了。对于每一个内核模块来说,必定包含两个函数intinit_module()这个函数在插入内核时启动,在内核中注册一定的功能函数,或者用他的代码代替内和中某些函数的内容(估计这些函数是空的)。因此,内和可以安全的卸载。intcleanup_module()当内核模块谢载时,调用.将模块从内核中清除.同其他的程序设计教程一样,我们给出一个helloworld的例子/*hello.camoduleprogramm*//*theprogramruningunderkernelmodanditisamodule*/#include"Linux/kernerl.h"#include"lLinux/module.h"/*prosstheCONFIG_MODVERSIONS*/#ifCONFIG_MODVERSIONS==1#defineMODVERSIONS#include""Linux/modversions.h"#endif/*theinitfunction*/intinit_module(){printk("helloworld!\n');printd("IhaveruninginakernerHYPERLINK"mailto:mod@!!\\n"mod@!!\n");return1;}/*thedistoryfunction*/intcleanup_module(){printk("Iwillshutdownmyselfinkernerlmod/n)";retutn0;}这样一个例子就完成了.我们也写一个makefile的例子,以适于我们在大程序重的应用。一下是makfile文件的内容。#amakefileforamoduleCC=gccMODCFLAGS:=-Wall_DMODULE-D_KERNEL_-DLinuxhello.ohello.c/usr/inculde?Linux/version.hCC$(MODCFLAGS)0chello.cechothemoduleiscompliecompletely然后你运行make命令得到hello.o这个模块,运行$insmodhello.ohelloworld!Iwillshutdownmyselfinkernerlmod$lsmodhello(unused)….$remmodIwillshutdownmyselfinkernerlmod这样你的模块就可以随意的插入和删除了。Linux中的大部分驱动程序,是以模块的形式编写的,这些驱动程序源码可以修改到内核中,也可以把他们编译成模块形势,在需要的时候动态加载。一个典型的驱动程序,