Linux 内核有很多可以定制化的参数—— 内核参数 ( kernel parameters ),
斟酌设置内核参数对 系统调优 意义重大。
内核参数 涵盖内核的方方面面,包括 网络 ( net )、 文件系统 ( fs )等等。
本文以 fs.file-max 参数为例,介绍设置内核参数的几种不同方式。
procfs
Linux 内核通过 procfs 伪文件系统暴露 内核参数 的访问接口,
通过 procfs 接口,用户可 设置 或者 查看 指定内核参数。
内核参数位于 /proc/sys 目录下,以 fs.file-max 参数为例,路径为 /proc/sys/fs/file-max 。
查看参数只需读取对应文件内容 …
阅读全文
Linux 内核管理着计算机的所有资源,为上层应用程序提供统一的编程接口( 系统调用 ),屏蔽底层设备的差异。
由于不同用户物理设备以及对内核功能需求的差异性,需要一种类似插件的运行机制——编写插件实现所需功能,然后嵌入到内核中,与内核形成一个整体。
Linux内核模块 便是这样的插件。
作为 Linux 内核的扩展手段,可以在运行时动态加载和卸载。
那么,一个内核模块是怎么编写的呢?与普通程序编写有什么区别呢?
程序开发经常以 hello world 程序入门,因为这是最简单的。
本文也通过一个最简单的内核模块,演示如何一步步编写一个内核模块。
结构
内核模块与普通程序不同,没有执行流。
可以这样理解,内核模块实现一些函数,作为回调函数注册到内核中。
在内核加载/卸载时,或者其他应用程序调用系统调用时,注册的回调函数才得到调用。
有两个最基本的回调函数 init 和 exit ,分别由 module_init 和 module_exit 登记,分别在模块加载和卸载的时候执行。
下面实现的 hello world 内核模块 …
阅读全文
操作系统通过系统调用为运行于其上的进程提供服务。
当用户态进程发起一个系统调用, CPU 将切换到 内核态 并开始执行一个 内核函数 。
内核函数负责响应应用程序的要求,例如操作文件、进行网络通讯或者申请内存资源等。
举一个最简单的例子,应用进程需要输出一行文字,需要调用 write 这个系统调用:
| #include <string.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
char *msg = "Hello, world!\n";
write(1, msg, strlen(msg));
return 0;
}
|
阅读全文