我正在编写一个应用程序,它报告 CPU 温度传感器和风扇速度监视器的读数。不过,根据Intel关于PECI的文档,所需的指令必须运行在ring 0模式,即内核模式,否则会抛出异常。
我在网上遇到了从保护模式转换到内核模式的代码,但是没有从用户模式转换到内核模式的代码,而且我读到它被内核禁止了。是否有解决方法,希望不需要修补内核,以允许最初处于用户模式的程序作为内核模式运行?
答案1
不可以。内核经过专门设计,禁止用户模式代码在 Ring 0 中运行。
为了做到这一点,您必须编写一个内核模块,然后通过ioctl
用户模式程序中的某种方法(也许)与您的模块进行通信。
编写内核模块不需要修补内核,但内核模块必须非常仔细地编写。最好从执行类似操作的示例模块开始,然后对其进行修改以满足您的需求。
答案2
这是一个非常好的入门指南; http://www.thegeekstuff.com/2013/07/write-linux-kernel-module/
makefile 对我不起作用(“all”不需要做任何事情),但直接运行内核 make 命令就可以正常工作;
user@gauss:~/a$ make -C /lib/modules/$(uname -r)/build M=$PWD modules
make: Entering directory `/usr/src/linux-headers-3.13.0-29-generic'
CC [M] /home/user/a/hello.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/user/a/hello.mod.o
LD [M] /home/user/a/hello.ko
make: Leaving directory `/usr/src/linux-headers-3.13.0-29-generic'