首页 > centos 自定义内核模块 编译运行

centos 自定义内核模块 编译运行

简单记录一下 centos 自定义内核模块的一些编译运行记录,代码如下:

主要功能是通过rdtsc 指令直接从 CPU MSR 寄存器中获取时钟,尝试获取两次,两次之间会做一些赋值操作什么的,并记录一下时差。

#include 
#include 
#include 
#include 
#include 
#include 
void inline measured_function(volatile int *var) {  (*var) = 1; }static int __init hello_start(void) { unsigned long flags;uint64_t start, end;int variable = 0;unsigned cycles_low, cycles_high, cycles_low1, cycles_high1;printk(KERN_INFO "Loading test module...
");preempt_disable();         /*we disable preemption on our CPU*/raw_local_irq_save(flags); /*we disable hard interrupts on our CPU*//*at this stage we exclusively own the CPU*/asm volatile("RDTSC
	""mov %%edx, %0
	""mov %%eax, %1
	": "=r"(cycles_high), "=r"(cycles_low));measured_function(&variable);asm volatile("RDTSC
	""mov %%edx, %0
	""mov %%eax, %1
	": "=r"(cycles_high1), "=r"(cycles_low1));raw_local_irq_restore(flags);/*we enable hard interrupts on our CPU*/preempt_enable(); /*we enable preemption*/start = (((uint64_t)cycles_high << 32) | cycles_low);end = (((uint64_t)cycles_high1 << 32) | cycles_low1);printk(KERN_INFO "
 function execution time is %llu clock cycles",(end - start));return 0;
}static void __exit hello_end(void) {  printk(KERN_INFO "Goodbye Mr.
"); }
module_init(hello_start);
module_exit(hello_end);

编译方式,Makefile

# obj-m 必须存在,后面的 .o 文件可以是自己的文件名,其他无需更改
obj-m := rdtsc_mode.o 
KERNELBUILD :=/lib/modules/$(shell uname -r)/build
default:make -C $(KERNELBUILD) M=$(shell pwd) modulesclean:rm -rf *.o *.ko *.mod.c .*.cmd 

将源代码文件和 makefile 放在一个目录之下,

sudo make 执行即可,执行成功之后会在当前目录下生成一个 rdtsc_mode.ko 文件。

执行 sudo insmod rdtsc_mode.ko 加载模块,以及卸载模块 rmmod rdtsc_mode.ko,通过 dmesg -Tw 能看到自定模块的输出信息:

[Fri Jan 14 16:41:52 2022] Loading test module...
[Fri Jan 14 16:41:52 2022] function execution time is 3504353503 clock cycles
[Fri Jan 14 16:42:11 2022] Goodbye Mr.

当然, 这个只是方便对内核的一些知识做一些简单测试,稳定性则需要自己保证。

更多相关:

  • 忠告初学者学习Linux系统的8点建议 新手或者说即将要入坑的小伙伴们,常常在QQ群或者在Linux论坛问一些问题,不过,其中大多数的问题都是很基础的。例如:如何给添加的用户归属用户组,复制整个文件到另一个目录下面,磁盘合理划分,甚至配置IP,这些问题其实都不是很难的,只要了解了 Linux 的基础之后,就可以很轻易的解决掉这方面的问...

  • 1,路径名统一用正斜杠“/”。(windows下正反斜杠都识别,linux只认正斜杠。) 2,统一使用UTF-8格式编码。   vim中无法保存汉字时,可输入下列命令:   :set fileencoding=prc   :set encoding=prc   读取文件,输出为乱码时,可使用libiconv库,具体方法:linux下使...

  •     慢慢感觉linux很有乐趣,Linux的诞生是必然的,很传奇的一段历史。Linux计算机主要以二进制为单位,目前常用的磁盘容量单位未B,其单位换算为1B=8bit,其他的以1024为倍数,eg:1G=1024MB;1MB=1024B。操作系统(Operating System)主要用于管理与驱动硬件,因此必须能够管理内存、管...

  •  老段RHCE远程班自9月15日以来已经上了两期班了,共培养了80名RHCE(不是人次)。起初学员都是持怀疑态度,但学完后都反应极好,学习的方式和效率远远的高于现场培训班。前两期也许您已经错过了,但是我们现在第5期在12月1日周末班开班,现在火热招生中,您还在等什么,赶快加入我们吧! 同时赠送鸟哥Linux基础篇(第三版)视频 (老...

  • Oracle Enterprise Linux 是通用的企业Linux级操作系统,与Red Hat Enterprise Linux一一对应并完全兼容,支持x86及x86-64两种硬件平台,在4.6/4.7上支持IA64硬件平台,支持最大128G内存,大分区(大于2T),大用户数及终端数;符合常用标准如LSB,Li18n,POSIX...

  • 关于点云的分割算是我想做的机械臂抓取中十分重要的俄一部分,所以首先学习如果使用点云库处理我用kinect获取的点云的数据,本例程也是我自己慢慢修改程序并结合官方API 的解说实现的,其中有很多细节如果直接更改源程序,可能会因为数据类型,或者头文件等各种原因编译不过,会导致我们比较难得找出其中的错误,首先我们看一下我自己设定的一个场景,...

  • /* 使用正态分布变换进行配准的实验 。其中room_scan1.pcd room_scan2.pcd这些点云包含同一房间360不同视角的扫描数据 */ #include #include #include #include

  • #include #include #include #include ...

  • #include #include #include #include #include #include...

  • #include #include #include #include int main (int argc,...