c-为Linux虚拟机编写内核模块



这是我第一次在这里写问题,所以如果信息丢失或我写的格式错误,我提前道歉。我目前正在上一门系统课程,在那里我们将使用UbuntuVM学习"基本"Linux指令和命令/编程。我们目前的项目是编写我们自己的内核模块并将其安装在Linux中。不幸的是,它是用德语写的,但我会把整件事发出来,并尽我所能翻译。

Bauen Sie ihr的特征是内核模块mod_kmalloc.ko。Hierzu müssen Sie的特征是C-File和Makefile。模块解决方案的参数为"loop_cnt"nehmen,参数为"alloc_size"des时间戳计数器仪表"rdtsc"(auf Intel x86/AMD64(bzw.mit hrtimers(ARM(和内核控制台的打印机

我们应该构建自己的Kernel-Modul并将其称为mod_kmalloc.ko。然后我们使用loop_cnt参数,该参数告诉我们用alloc_size和另一个参数分配内存的频率,以及应该多久分配一次。为了测量数量,我们需要使用rdtsc命令,然后通过printk((命令/函数将所有内容发送到控制台上。

根据我目前所学到的知识和理解,我制作了一个"合适的"Makefile。

obj-m = mod_kmalloc.o
KVERSION = $(shell uname -r)
modules all:
make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(KVERSION)/build M=$(PWD) clean

让我困惑的是C-File应该如何/什么,然后如何安装新的Modul/Kernal并使其运行。遗憾的是,我对Linux还不太了解,完全不知道第一步应该是什么。我知道我需要使用一些类似的东西

uint64_t rdtsc(){
return __rdtsc();
}

但更重要的是,我完全不知所措。

我不会给你的练习答案,但我可以为你提供解决问题所需的信息:

参数

您的内核模块需要定义2个参数(loop_cntalloc_size(,这可以使用module_param()宏来完成。

结构

您的模块需要声明一个init和exit方法,请查看下面的Hello World示例,以基本了解内核模块的结构。

使用kmalloc分配内存

练习指出,您应该分配大小为alloc_size的内存的loop_cnt倍。为此,在循环中使用kmalloc(alloc_size, GFP_KERNEL)方法并分配通过参数传递的大小。此外,您应该在模块的退出方法中释放分配的空间(请参阅kfree(。

测量时钟周期

使用rdtsc方法将返回自处理器上次复位以来的时钟周期计数。如果在每次调用kmalloc之前和之后调用rdtsc,并将返回的值保存在两个变量中,则可以减去两个值,例如使用printk打印。

使用内核模块

确保Makefile和C-File位于同一目录中。要构建模块,只需在此目录中运行命令make即可
要将模块插入内核,需要运行insmod命令。此外,您需要将模块参数传递到此命令,例如sudo insmod mod_kmalloc.ko loop_cnt=3 alloc_size=3
现在您可以检查是否添加了模块:lsmod | grep mod_kmallloc
您可以使用以下命令检查输出:dmesg | tail
要删除模块,可以调用sudo rmmod mod_kmalloc

最新更新