[英]Write a Kernel-Modul for Linux VM
这是我第一次在这里写问题,所以如果信息丢失或我写的格式错误,我提前道歉。 我目前正在使用系统 class,我们正在使用 Ubuntu VM 来学习“基本”Linux 指令和命令/编程。 我们目前的项目是编写自己的 Kernel-Modul 并将其安装在 Linux 中。 不幸的是它是德语的,但会发布整个内容并尽我所能翻译。
Bauen Sie ihr eigenes Kernel-Modul mod_kmalloc.ko。 Hierzu müssen Sie ein eigenes C-File anbieten und den Makefile anpassen。 Ihr Modul soll den Parameter „loop_cnt“ nehmen, der angibt wie häufig Speicher der Größe „alloc_size“ (ein weiterer Parameter) allokiert werden soll。 Diese Speicherallokation messen Sie mittels des Time-stamp-Counters mittels der Instruktion „rdtsc“ (auf Intel x86 / AMD64) bzw。 mit hrtimers (ARM) 和 geben das auf der Kernel-Console mittels printk() aus
我们应该构建自己的 Kernel-Modul 并将其命名为 mod_kmalloc.ko。 然后我们使用 loop_cnt 参数,它告诉我们 memory 多久分配一次 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();
}
但不仅如此,我完全不知所措。
我不会为你的练习提供答案,但我可以为你提供解决它所需的信息:
您的 kernel 模块需要定义 2 个参数( loop_cnt
, alloc_size
),这可以使用module_param()
宏来完成。
您的模块需要声明一个 init 和 exit 方法,请看下面的Hello World 示例,以基本了解内核模块的结构。
练习表明您应该分配loop_cnt
乘以大小为 alloc_size 的alloc_size
。 为此,请在循环中使用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
lsmod | grep mod_kmallloc
。
您可以使用以下命令检查 output: dmesg | tail
dmesg | tail
。
要删除模块,您可以调用sudo rmmod mod_kmalloc
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.