繁体   English   中英

为 Linux VM 编写内核模块

[英]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_cntalloc_size ),这可以使用module_param()来完成。

结构

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

使用 kmalloc 分配 Memory

练习表明您应该分配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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM