2.用户空间与内核的接口

procfs(/proc文件系统);sysctl(/proc/sys目录);sysfs(/sys文件系统) ============================================================================== 内核通过各种不同的接口吧内部信息输出到用户空间。其中有3个特殊接口(在这之中有2个虚拟文件系统) procfs(/proc文件系统) 这是一个虚拟文件系统,通常mount在/proc,允许内核以文件的形式向用户空间输出内部信息。这些信息并没有实际存在于磁盘中。 网络代码注册文件位于/proc/net,在系统引导或模块加载时进行注册 sysctl(/proc/sys目录) 此接口允许用户空间读取or修改内核变量的值。注意:不是所有的变量在此接口都是可见的。可以通过两种方式访问sysctl输出的变量: 1.sysctl系统调用 2.procfs:当内核支持procfs时,会在/proc目录下添加一个特殊目录/proc/sys,为每个由sysctl输出的内核变量引入一个文件。 /proc/sys目录下的文件实际上就是一个个内核变量;内核变量定义了在/proc/sys目录下的路径;定义了文件名;定义了访问权限。有些变量内容是在引导期间静态定义的;其他的则是运行期间添加的(例如模块新功能、模块加载卸载)。。 /proc/sys目录下的文件和目录都是基于ctl_table结构定义的;ctl_table结构实例的注册和除名是通过register_sysctl_table、unregister_sysctl_table函数完成的。 struct ctl_table { int ctl_name; /* Binary ID */ //###结点标识,同一层的结点用不同的数字来标识 const char *procname; /* Text ID for /proc/sys, or zero */ //###/proc/sys目录下的文件名 void *data; //###实际的系统参数在内核中的数据结构 int maxlen; //###内核变量的尺寸大小 mode_t mode; //###/proc/sys目录下对应文件的访问权限 ctl_table *child; //###子结点的clt_table结构指针 proc_handler *proc_handler; /* Callback for text formatting */ //###对/proc/sys下面的文件读写的时候将调用这个例程 ctl_handler *strategy; /* Callback function for all r/w */ //###用sysctl读写系统参数时候,将调用这个例程 //###根据文件关联的变量种类而定,proc_handler、strategy的初始化会不同; //###初始化proc_handler的函数:proc_dostring、proc_dointvec、proc_dointvec_minmax等等 //###初始化strategy的函数:sysctl_string、sysctl_intvec等等 struct proc_dir_entry *de; /* /proc control block */ //###指向在/proc/sys中的结点(proc文件系统数据结构) void *extra1; //###2个可选参数,通常用于蒂尼变量的最大值和最小值 void *extra2; //###例如ip_local_port_range文件使用这2个指针限定了port的范围 }; sysfs(/sys文件系统) 这是一种相对较新的文件系统,sysctl所输出的部分信息被移植到sysfs。 ------------------------------------------------------------------------- procfs:主要输出只读数据; sysctl:大多数sysctl信息都是可读可写的。 procfs:输出相对复杂的数据结构,或者有特使格式要求时,使用procfs sysctl:输出简单的内核变量or数据结构关联的一些文件

ioctl系统调用;Netlink套接字(socket) ===================================================================================== 多数网络内核功能都可以用Netlink或ioctl接口进行配置。 ioctl系统调用 ioctl(输入/输出控制)系统调用操作的对象是一个文件,通常是用户实现特殊设备所需但标准文件系统没有提供的操作。 网络代码使用ioctl的方式:socket系统调用返回的套接字描述符(socket descriptor)传给ioctl 老一代的命令也使用ioctl接口,例如ifconfig、route等 例如键入命令ifconfig eth0 mtu 1250:ifconfig会打开一个套接字,用从系统管理员那里接受的信息初始化一个本地数据结构,然后以ioctl调用传送给内核。 意思是内核接收到ioctl调用后,会根据函数参数去路由相应的函数处理例程? Netlink套接字(socket) 这是网络应用程序与内核通信时最新的首选机制。IPROUTE2包大多数命令都使用此接口
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!