内核proc文件系统与seq接口(6)----分析sysctl函数接口与procfs之间的内部关系
来源:互联网 发布:360vr全景通 4.5 源码 编辑:程序博客网 时间:2024/06/05 15:52
之前在研究内核的procfs时,疏漏了一个与之相关的知识点,在之后的阅读《深入Linux内核构架》的相关知识时才注意到,这就是用户空间使用sysctl函数(系统控制机制)时的内核实现原理。
系统控制机制可以在Linux内核运行时控制内核的行为,控制参数从用户空间传输到内核中,且无须reboot。早期实现这种机制的方法是用户空间使用sysctl函数,glibc将调用sysctl系统调用来实现,然后通过传递过来的二进制码(在<linux/sysctl.h>中的枚举定义)来找到相关的struct ctl_table:
(早期结构体定义)
- struct ctl_table
- {
- int ctl_name;
- const char *procname; /* Text ID for /proc/sys, or zero */
- void *data;
- int maxlen;
- mode_t mode;
- struct ctl_table *child;
- struct ctl_table *parent; /* Automatically set */
- proc_handler *proc_handler; /* Callback for text formatting */
- ctl_handler *strategy;
- struct proc_dir_entry *de;
- void *extra1;
- void *extra2;
- };
并使用其中的ctl_handler *strategy;函数来实现对内核配置的修改。
这时内核对于同一个参数的操作既有sysctl接口,也有procfs接口,可以说是冗余了。
现在的内核中,这种机制已经改变了,即使是《深入Linux内核构架》中的描诉也已经过时了。可以说是为了对原有的sysctl系统调用兼容,内核现在对于原有的sysctl系统调用的实现做了修改,首先struct ctl_table删除了一些无用的成员:
- struct ctl_table
- {
- const char *procname; /* Text ID for /proc/sys, or zero */
- void *data;
- int maxlen;
- mode_t mode;
- struct ctl_table *child;
- struct ctl_table *parent; /* Automatically set */
- proc_handler *proc_handler; /* Callback for text formatting */
- void *extra1;
- void *extra2;
- };
其次,内核将通过sysctl系统调用(in kernel/sysctl_binary.c)传递进来二进制码通过sysctl_getname函数并利用一堆的struct bin_table结构体提供的信息转换为/proc/sys目录下的文件名路径,最终通过操作相应的procfs文件实现sysctl。源码都在 kernel/sysctl_binary.c文件中,有兴趣的读者可以自己RTFSC。
综上所述,为了软件兼容性,现在的sysctl被保留,底层通过procfs实现原来的系统控制机制,如下图所示:
上一篇:Linux内核驱动fsync机制实现图解
下一篇:Linux内核ARM构架中原子变量的底层实现研究
- 接口-数据流-系统运行...
- linux GPIO驱动
- 移植mjpg-streamer
- USB和串口(COM)的区别,以及相...
- MDIO/MDC(SMI)接口
- linux 常见服务端口
- 【ROOTFS搭建】busybox的httpd...
- xmanager 2.0 for linux配置
- 什么是shell
- linux socket的bug??
- 系统提供的库函数存在内存泄漏...
- 初学UNIX环境高级编程的,关于...
- chinaunix博客什么时候可以设...
- 一个访问量较大网站的服务器。...
- 收音机驱动与v4l2架构的关系,...
- 内核proc文件系统与seq接口(6)----分析sysctl函数接口与procfs之间的内部关系
- 内核proc文件系统与seq接口(6)----分析sysctl函数接口与procfs之间的内部关系
- 内核proc文件系统与seq接口
- 内核proc文件系统与seq接口(2)---内核proc文件系统编程接口
- 内核proc文件系统与seq接口(2)---内核proc文件系统编程接口
- 内核proc文件系统与seq接口(5)---通用proc接口与seq_file接口实验
- 内核proc文件系统与seq接口(1)---内核proc文件系统简介
- 内核proc文件系统与seq接口(1)---内核proc文件系统简介
- 内核与用户空间的接口procfs, sysctl, ioctl,netlink
- 内核proc文件系统与seq接口(3)---内核proc文件底层结构浅析
- 内核proc文件系统与seq接口(3)---内核proc文件底层结构浅析
- 内核proc文件系统与seq接口----内核proc文件系统编程接口
- 内核proc文件系统与seq接口(4)---seq_file接口编程浅析
- 内核proc文件系统 --和--seq接口
- 用户空间与内核空间的接口:proc文件系统
- 用户空间与内核空间的接口:proc文件系统
- 接口与接口、接口与类之间的关系
- 接口与接口、接口与类之间的关系
- 嵌入式web服务器预研报告1
- libevent和libev资料
- 根文件系统的制作(二)
- 嵌入式Linux之我行——C+CGI+Ajax在S3C2440中的应用
- Linux内核驱动fsync机制实现图解
- 内核proc文件系统与seq接口(6)----分析sysctl函数接口与procfs之间的内部关系
- Linux内核ARM构架中原子变量的底层实现研究
- 深入分析Linux自旋锁
- Linux内核container_of详解(图解)
- 《深入Linux设备驱动程序机制》学习心得---字符设备驱动原理图解
- 关于GCC的__attribute__(constructor)
- 一道小学数学题[状元蹄]
- [转]再谈javascript面向对象编程
- __attribute__使用的一些总结