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数据结构关联的一些文件
procfs(/proc文件系统);sysctl(/proc/sys目录);sysfs(/sys文件系统)
复制代码

 

复制代码
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包大多数命令都使用此接口
ioctl系统调用;Netlink套接字(socket)
复制代码

 

posted @   雲淡風輕333  阅读(44)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示