Linux kernel 从内核模块更改内核变量/参数

Linux kernel 从内核模块更改内核变量/参数,linux-kernel,kernel-module,kernel,Linux Kernel,Kernel Module,Kernel,有一些内核变量(例如tcp\u frto),可以通过使用sysctl net.ipv4.tcp\u frto或cat/proc/sys/net/ipv4/tcp\u frto等命令从用户空间访问这些变量 它可以从bash命令行读取并轻松更改。但是我想从我正在编写的内核模块中修改它们 如何从模块中读取和写入这些变量 (Linux源代码使用sysctl\u tcp\u frto来访问在tcp.h文件中声明的这个变量。可能可以导出变量名,然后可以通过模块找到,但我不想更改源代码并再次编译它)。我试图制

有一些内核变量(例如
tcp\u frto
),可以通过使用
sysctl net.ipv4.tcp\u frto
cat/proc/sys/net/ipv4/tcp\u frto
等命令从用户空间访问这些变量

它可以从bash命令行读取并轻松更改。但是我想从我正在编写的内核模块中修改它们

如何从模块中读取和写入这些变量


(Linux源代码使用
sysctl\u tcp\u frto
来访问在
tcp.h
文件中声明的这个变量。可能可以导出变量名,然后可以通过模块找到,但我不想更改源代码并再次编译它)。我试图制作一个可加载的内核模块(LKM),而不是每次编译源代码

除非将Linux内核变量设置为全局变量(使用
EXPORT\u SYMBOL
或其变体之一),否则无法在其范围外读取该变量

由于有另一种方法可以使用procfs访问
tcp\u frto
,因此您可以使用VFS函数在Linux内核模块中执行相同的操作,如这些所示


这是如何工作的以及为什么它通常不是一个好主意(除非调试除外)将在本

中详细描述,除非Linux内核变量是全局变量(使用
EXPORT\u SYMBOL
或其变体之一),否则无法在其范围之外读取它

由于有另一种方法可以使用procfs访问
tcp\u frto
,因此您可以使用VFS函数在Linux内核模块中执行相同的操作,如这些所示

这是如何工作的以及为什么它通常不是一个好主意(调试除外),将在本中详细描述