• Linux实验二:Linux 内核模块测试


    一、实验目的

    Linux内核模块进行了解。

    二、实验内容

    创建一个内核模块,在加载和卸载模块时在内核中打印相关信息。

    三、背景知识:

    一、什么是内核模块?

           内核模块是Linux内核向外部提供的一个插口,其全称为动态可加载内核模块(Loadable Kernel Module,LKM),我们简称为模块。Linux内核之所以提供模块机制,是因为它本身是一个单内核(monolithickernel)。单内核的最大优点是效率高,因为所有的内容都集成在一起,但其缺点是可扩展性和可维护性相对较差,模块机制就是为了弥补这一缺陷。

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

    总之,模块是一个为内核(从某种意义上来说,内核也是一个模块)或其他内核模块提供使用功能的代码块。

     

    二、内核模块编写

    编写内核模块时必须要有的两个函数 :
         __init 和 __exit 是 Linux 内核的一个宏定义,使系统在初始化完成后释放该函数,并释放其所占内存。因此它的优点是显而易见的。建议在编写入口函数和出口函数时采用后面的方法。
       还有,在内核编程时所用的库函数和在用户态下的是不一样的。如模块程序中使用的printk函数,对应于用户态下的printf函数,printk 是内核态信息打印函数,功能和printf类似但 printk还有信息打印级别。

    加载模块和卸载模块:
    1>module_init(hello_init)
        a. 告诉内核你编写模块程序从那里开始执行。
        b.module_init() 函数中的参数就是注册函数的函数名。
    2>module_exit(hello_exit)
        a. 告诉内核你编写模块程序从那里离开。

        b.module_exit() 中的参数名就是卸载函数的函数名。

     

    三、内核模块编译:

    第一步:模块源代码,如果使用vi更好,直接wq保存退出即可!

    第二步:写一个Makefile文件。

    Makefile文件所做的工作是编译生成.o,.ko等模块相关文件!

    四、实验步骤:

    一、编写模块代码HelloWorld.c

    二、编写Makefile文件

    三、编译模块

    四、加载卸载HelloWorld模块

    五、查看模块信息

    六、卸载HelloWorld模块

    七、查看模块信息

     

    五、实验演示:

                   

    进入Linux终端控制台,创建HelloWorld.c文件,可用vi HelloWorld.c创建并编写内容。

    // HelloWorld.c

                                                   2-1  模块HelloWorld代码

    创建Makefile文件(注意文件名大小写区分)

    2-2 模块HelloWorldMakefile配置文件

    注意:

          “make –C/lib  ......”语句

           make语句前面的空格为制表符(按tab键),-C 中的C为大写,不能为小写

    保存好后在终端当前目录执行make操作进行编译,如下图:

    2-3 对模块HelloWorld执行make操作

    编译好后会生成许多文件:

    2-4 模块HelloWorld编译后的内容

     

    最后对模块进行加载和卸载测试:

    终端在当前目录下,输入命令 insmod ./HelloWorld.ko

    输入命令 lsmod,能找到名为HelloWorld 的模块,说明模块已经加载;

    2-5 模块HelloWorld已经加载到内核

     

    输入命令 dmesg,查看最后一行,会有模块加载时调用的函数输出;

    输入命令 rmmod HelloWorld ,卸载模块(注意与加载时不同),然后输入lsmod,已经找不到HelloWorld模块,说明模块已经卸载;

    输入命令 dmesg,查看模块卸载是调用的函数输出。

    图2-6 模块HelloWorld加载以及卸载时内核模块的记录

    六、实验小结:

    l Makefile 是一种脚本,这种脚本主要是用于多文件的编译

    l make 程序可以维护具有相互依赖性的源文件,但某些文件发生改变时,它能自动识别出,并只对相应文件进行自动编译。

    上述简单例子中的Makefile文件的内容为:obj-m:=helloworld.o,在这我要提醒大家,在网上有许多种Makefile文件的写法,但都太麻烦了,如果写的是内核模块,obj-m:=*.o足矣(*是你的模块文件名,比如上面的hellworld.c文件).之后使用

    make -Wall -C /lib/modules/`uname -r`/build M=`pwd`modules

    命令生成helloworld.o,helloworld.ko等文件,有的人直接使用

    make -C /lib/modules/`uname -r`/build M=`pwd` modules

    中间省略了-Wall,Wall可以看成 W+all,而W代表Warning,所以使用 -Wall 即是显示所有警告!

     

    l 加载模块命令:insmod helloworld.ko

    l 卸载模块命令:rmmod helloworld.ko

    查看模块信息:dmesg

  • 相关阅读:
    Node.js的安装与配置【转载】
    The Tomcat connector configured to listen on port 8080 failed to start. The port may already be in use or the connector【端口号被占用】
    MVC登陆认证简单设置
    Winform无边框窗体拖动
    Winform截图小程序
    C#Winform实时更新数据库信息Demo(使用Scoket)
    记DateTime.Now.ToString()遇到的一个坑
    T4模板的一些配置(从EF数据更新)
    设计模式之策略模式
    打造高效的研发组织架构:高效研发流程那些事(一)——读《技术领导力实战笔记》摘要
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3014102.html
Copyright © 2020-2023  润新知