【问题标题】:Write a Kernel-Modul for Linux VM为 Linux VM 编写内核模块
【发布时间】:2022-01-06 05:48:50
【问题描述】:

这是我第一次在这里写问题,所以如果信息丢失或我写错了格式,我提前道歉。我目前正在参加一个系统课程,我们正在使用 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 时间戳计数器 mittels der Instruktion „rdtsc“ (auf Intel x86 / AMD64) bzw。 mit hrtimers (ARM) und geben das auf der Kernel-Console mittels printk() aus

我们应该构建自己的 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();
}

但除此之外,我完全不知所措。

【问题讨论】:

标签: c linux module linux-kernel


【解决方案1】:

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

参数

你的内核模块需要定义2个参数(loop_cnt, alloc_size),这可以使用module_param() macro来完成。

结构

你的模块需要声明一个 init 和 exit 方法,看看下面的Hello World example 对内核模块的结构有一个基本的了解。

使用 kmalloc 分配内存

练习表明你应该分配loop_cnt 乘以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.
您可以使用以下命令检查输出:dmesg | tail.
要删除模块,您可以致电sudo rmmod mod_kmalloc

【讨论】:

    猜你喜欢
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 2015-09-21
    • 2012-11-20
    相关资源
    最近更新 更多