linux内核模块调试,linux内核实验教程

  linux内核模块调试,linux内核实验教程

  1.什么是内核模块?

  内核是Linux内核对外提供的一个套接字,全称为可加载内核模块(LKM),我们简称模块。Linux内核之所以提供模块机制,是因为它是一个单片内核。单片内核最大的优点是效率高,因为所有的内容都集成在一起了,缺点是扩展性和可维护性比较差。模块机制就是为了弥补这个缺陷。

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

  简而言之,模块就是为内核(某种意义上,内核也是一个模块)或其他内核模块提供功能的代码块。

  二、内核模块编写

  编写内核模块时必须具备的两个功能:

  __init和__exit是Linux内核的一个宏定义,使系统在初始化后释放这个函数及其占用的内存。因此,它的优势是显而易见的。在编写入口函数和出口函数时,建议使用后一种方法。

  此外,内核编程中使用的库函数不同于用户模式中使用的库函数。比如模块程序中使用的printk函数对应的是用户态的printf函数,printk是内核态的信息打印函数,类似于printf,但是printk也有信息打印级别。

  装载和卸载模块:

  1模块初始化(你好初始化)

  A.告诉内核你写的模块程序会从那里执行。

  B.b.module_init()函数中的参数是注册函数的函数名。

  2模块_出口(hello _出口)

  A.告诉内核你写了模块程序离开那里。

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

  三、内核模块编译:

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

  步骤2:编写Makefile文件。

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

  四。实验步骤:

  1.编写模块代码HelloWorld.c

  其次,编写Makefile文件

  第三,编译模块

  四。加载和卸载HelloWorld模块

  动词(verb的缩写)检查模块信息

  6.卸载HelloWorld模块

  七、查看模块信息

  动词(verb的缩写)实验演示:

  进入Linux终端控制台,创建HelloWorld.c文件,该文件可以由Vihelloworld.c创建和编写。

  //HelloWorld.c:

  图HelloWorld模块代码

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

  图2-2模块HelloWorld的Makefile配置文件

  注意:

  “makec/lib…”语句

  make语句前面的空格是tab(按tab),而-C中的C是大写的,不是小写的。

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

  图2-3模块HelloWorld的make操作

  编译后会生成许多文件:

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

  最后,加载和卸载模块:

  在终端的当前目录中,输入命令insmod。/hello world . ko;

  输入命令lsmod,可以找到名为HelloWorld的模块,表示该模块已经加载;

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

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

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

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

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

  不及物动词实验总结:

  LMakefile是一个脚本,主要用于编译多个文件。

  Lmake程序可以维护相互依赖的源文件,但当某些文件发生变化时,它可以自动识别,只自动编译相应的文件。

  上面这个简单例子中的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 `模块

  中间省略了-wall,W all可以看成W all,W代表警告,所以用-Wall就是显示所有警告!

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

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

  查看模块信息:dmesg

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: