当前位置:  技术问答>linux和unix

【百度分享】基于内核模块的测试代码编写(一)

    来源: 互联网  发布时间:2016-12-29

    本文导语:  本帖最后由 c_hua6280 于 2010-11-11 14:25:38 编辑 1、背景     压缩卡驱动提供给文件系统KAPI,供文件系统对文件数据进行压缩和解压。在测试中,最初采用的方法是通过文件系统提供的系统调用,利用文件系统在处理系统调用时...

本帖最后由 c_hua6280 于 2010-11-11 14:25:38 编辑
1、背景
    压缩卡驱动提供给文件系统KAPI,供文件系统对文件数据进行压缩和解压。在测试中,最初采用的方法是通过文件系统提供的系统调用,利用文件系统在处理系统调用时,会调用到驱动的KAPI,来完成对压缩卡KAPI及其更下层(包含硬件)正确性的测试。考虑到这种方法,可能会由于文件系统对KAPI的具体使用方式而屏蔽一些问题的发现,因此展开了对KAPI的直接测试。由于KAPI是内核态的接口,无法在用户态直接调用,因此要最终完成对KAPI的更直接测试,需要借助编写内核模块(Kernel Module),来实现用户进程对KAPI的访问;此外,还要解决用户态和内核态两者的交互。下图中表示了引入基于内核模块的测试方法,可以使我们的测试程序在调用关系上更加接近被测模块,从而在测试效率和覆盖性上得到改进。

在本文中,将主要介绍实现基于内核模块的测试的相关知识与代码编写方式。
【百度分享】基于内核模块的测试代码编写(一)[图片]

2、用户态和内核态
    操作系统中,虚拟内存被分为内核空间和用户空间。内核空间被用于内核,内核扩展功能和一些设备驱动的运行;用户空间是用户进程在用户态下运行时所使用。在 linux系统中,内核拥有地址为3G到4G的内存空间,并且它是被共享的,而用户进程拥有0到3G的用户空间,每个用户进程拥有独立的空间。
【百度分享】基于内核模块的测试代码编写(一)[图片]

    CPU根据PSW寄存器中的模式bit,可以工作在用户态(Ring 3)或内核态(Ring 0),用户态能执行有限的非特权的CPU指令。在内核态可以执行所有指令。工作在用户态的进程无法直接访问硬件和内核的内存空间,这是出于运行安全的考虑。当然,操作系统也会也提供系统调用或中断等方法,让用户进程可以切换到内核态,以访问内核空间或硬件。系统调用或中断,可以看作是有限度的开放给用户进程对内核和硬件的访问,从而保证了系统安全。 

    在驱动项目中,驱动程序工作在内核空间中,它直接提供KAPI给内核,这样我们就无法通过用户进程完成对该KAPI的测试。当然,通过执行内核提供的系统调用,当发生磁盘读写时可以间接的调用到该KAPI,但是内核对其有限或具体的调用方式往往屏蔽了底层驱动的部分缺陷,这种测试方法也带来发现问题后追查定位的困难。要改变这些不足,最直接的思路就是跨越对内核特殊逻辑间接调用的依赖,通过直接对KAPI进行调用的方法完成测试。

    为了实现对工作在内核态的KAPI的访问,必须向内核置入内核态的代码以发起调用,这将通过kernel module来完成,会在第三部分具体介绍。而为了实现对测试数据输入,执行发起,结果输出采集等的灵活控制,还必须实现用户态和内核态的交互,具体方法将在第四部分介绍。

3. Kernel Module
    要达成对KAPI的直接调用和测试,需要添加工作在内核态的代码实现对该函数的访问,这里我们借助kernel module来完成。kernel module提供了不需要重新编译kernel image,就向内核引入新代码和逻辑的支持。Kernel Module通常是以ko为扩展名的文件,通过lsmod命令可以查看已经加载的Kernel Module,通过insmod/rmmod命令完成指定的的模块的加载和卸载。Kernel Module最基本的编程模式是编程者通过宏定义module_init和module_exit,指定在模块加载和卸载时进行的初始化或清理等工作。一个基本的hello world程序如下。向init中就可以加入对KAPI进行调用的函数,当模块被insmod时就会在内核态被执行。但是这与灵活的完成各种测试任务还有差距,为了能在用户态完成测试数据的准备和输入,测试结果的获取和对执行的控制,还需要引入用户态和内核态的交互。关于Kernel Module更详细的编译方式和编程模式介绍,可以参考 http://www.tldp.org/LDP/lkmpg/2.6/html/

#include  /* Needed by all modules */
#include  /* Needed for KERN_INFO */
#include  /* Needed for the macros */

static int __init hello_init(void){
printk(KERN_INFO "Hello, world 2n");
return 0;
}
static void __exit hello_exit(void){
printk(KERN_INFO "Goodbye, world 2n");}

module_init(hello_init);
module_exit(hello_exit);


后续请看:【百度分享】基于内核模块的测试代码编写(二)

|
多谢分享 
Mark

|
mark...........................

|
基于C语言的啊

|
犀利.....

|
谢谢分享。。

|
谢谢很好啊

|
不错,还可以,152131

|
学习了,学习了

|
谢谢分享!!!!!!!!11

|
不错,标记了

|
o,貌似这样

|
内容存入剪贴板

|
好动心呀 !!!!!!!!

|
bu cuo 

|
teste

|
不错:学习了,多谢分享!

|
该回复于2011-01-04 17:41:33被版主删除

|
不错 不错

|
讲的太好了 学习

|
Thanks for sharing~~

|
讲的太好了 学习

    
 
 

您可能感兴趣的文章:

  • P2P分享软件 Phex iis7站长之家
  • 【百度分享】基于内核模块的测试代码编写(二)
  • 『分享』从 2.4 到 2.6:Linux 内核可装载模块机制的改变对设备驱动的影响!!! (转载)
  • 【百度分享】Socket通讯模块压力及大数据对比工具开发之aperlib(二)
  • 【百度分享】Socket通讯模块压力及大数据对比工具开发之aperlib(八)
  • python发布模块的步骤分享
  • 【百度分享】Socket通讯模块压力及大数据对比工具开发之aperlib(三)
  • 【百度分享】Socket通讯模块压力及大数据对比工具开发之aperlib(七)
  • 【百度分享】Socket通讯模块压力及大数据对比工具开发之aperlib(一)
  • ubuntu12.04使用c编写php扩展模块教程分享
  • [百度分享]Bonding模块主要工作模式相关代码分析(一)
  • 用smtplib和email封装python发送邮件模块类分享
  • [百度分享]Bonding模块工作流程综述
  • [百度分享]Bonding 模块代码及主要工作模式分析(4)
  • [百度分享]Bonding 模块代码及主要工作模式分析(1)
  • [百度分享]Bonding 模块代码及主要工作模式分析(2)
  • [百度分享]Bonding 模块代码及主要工作模式分析(3)
  • [百度分享]Bonding模块主要工作模式相关代码分析(二)
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 自己编写sqlhelper类示例分享
  • vc6编写python扩展的方法分享
  • 将c#编写的程序打包成应用程序的实现步骤分享(安装,卸载) 图文
  • c#编写webservice服务引用实例分享
  • Oracle存储过程的编写经验与优化措施(分享)
  • 如何编写健壮的Bash脚本(经验分享)
  • ​docker之轻量虚拟化技术——docker实战分享
  • php利用腾讯ip分享计划获取地理位置示例分享
  • 点对点文件分享客户端 PeerProject
  • 网络文件分享 Giver
  • IM及文件分享软件 iptux
  • P2P分享软件 Alliance P2P
  • 文件分享软件 eMule Plus
  • P2P 文件分享软件 ShakesPeer
  • 分享页面内容插件 ContentShare
  • 社交分享按钮生成JS库 Socialite.js
  • P2P分享软件 Phex
  • 前端代码编辑和分享平台 RunJS
  • jQuery 分享按钮插件 Share Button
  • 昨天考过SCJP快乐大家分享
  • P2P文件分享 GNUnet
  • 响应式社交分享按钮 RRSSB
  • 谁有免费的英文Office2003(日文也成)分享一下吧!
  • 谁有qmail的日常维护,日志分析的资料分享下?
  • 代码分享
  • 谁有xml和libxml2的说明文档,分享一下吧
  • Java代码分享工具 Java Gems


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3