模块编程linux,linux模块编程实验.doc

linux模块编程实验

模块编程实验

【实验目的】

通过学习内核模块的编写和运行,了解模块是Linux OS的一种特有的机制,可根据用户的实际需要在不需要对内核进行重新编译的情况下,模块能在内核中被动态地加载和卸载。编写一个模块,将它作为Linux OS内核空间的扩展来执行,并通过insmod命令来手工加载,通过命令rmmod来手工卸载。

【准备知识】

Linux模块是一些可以作为独立程序来编译的函数和数据类型的集合。在装载这些模块时,将它的代码链接到内核中。Linux模块有两种装载方式:静态装载(内核启动时装载)和动态装载(在内核运行过程中装载)。若在模块装载之前就调用了动态模块的一个函数,则此调用将失败;若模块已被装载,则内核就可以使用系统调用,并将其传递到模块中的相应函数。模块通常用来实现设备驱动程序(这要求模块的API和设备驱动程序的API相一致)。模块可用来实现所期望的任何功能。

一.模块的组织结构

模块一旦被装载进系统,就在内核地址空间中管态下执行。它就像任何标准的内核代码一样成为内核的一部分,并拥有其它内核代码相同的权限和职责(当然也会引起系统的崩溃)。若模块知道内核数据结构的地址,则它可以读写内核数据结构。但Linux是一个整体式的内核(monolithic kernel)结构,整个内核是一个单独的且非常大的程序,从而存在一个普遍的问题:在一个文件中实现的函数可能需要在其它文件中定义的数据。在传统的程序中,这个问题是通过链接编辑器在生成可执行对象文件时,使用链接编辑器可以解析的外部(全局)变量来解决的。又因为模块的设计和实现与内核无关,所以模块不能靠静态链接通过变量名引用内核数据结构。恰好相反,Linux内核采用了另外一种机制:实现数据结构的文件可以导出结构的符号名(可以从文件/proc/ksyms或文件/…/kernel/ksyms.c中以文本方式读取这个公开符号表),这样在运行时就可以使用这个结构了。不过在编写模块的过程中,编写(修改)导出变量时要格外注意,因为通过修改变量会修改内核的状态,其结果可能并不是内核设计者所期望的。在确信自己了解修改内核变量的后果之前,应该对这些变量只进行读操作。

模块作为一种抽象数据类型,它具有一个可以通过静态内核中断的接口。最小的模块结构必须包括两个函数,它们在系统装载模块和卸载模块时调用,分别是module_init()和module_exit()。可以编写一个只包括这两个函数的模块,这样该模块中唯一会被调用的函数就是模块被装载时所调用的函数module_init()和模块被卸载时所调用的函数module_exit()。并且用函数module_init()来启动模块装载期间的操作,用函数module_exit()来停止这些操作。

由于模块可以实现相当复杂的功能,故可以在模块中加入很多新函数以实现所要期望的功能。不过加入模块的每个新函数都必须在该模块装载到内核中时进行注册。若该模块是静态装载的,则该模块的所有函数都是在内核启动时进行注册的;若该模块是动态装载的,则这些新函数必须在装载这个模块时动态注册。当然,如果该模块被动态卸载了,则该模块的函数都必须从系统中注销。通过这种方式,当这个模块不在系统中时,就不能调用该模块的函

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值