Tekkaman Ninjatekkamanninja.blog.chinaunix.net

Linux我的梦想,我的未来! 本博客的原创文章的内容会不定期更新或修正错误!转载文章都会注明出处,若有侵权,请即时同我联系,我一定马上删除!! 原创文章版权所有!如需转载,请注明出处: tekkamanninja.blog.chinaunix.net ,谢谢合作!!!拒绝一切广告性质的评论,一经发现立即举报并删除!

  • 博客访问: 2375711
  • 博文数量: 261
  • 博客积分: 15936
  • 博客等级: 上将
  • 技术积分: 25012
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-27 11:22
  • 认证徽章:
个人简介

Fedora-ARM

文章分类
文章存档

2016年(3)

2014年(1)

2013年(3)

2012年(59)

2011年(64)

2010年(27)

2009年(30)

2008年(23)

2007年(51)

微信关注

IT168企业级官微



微信号:IT168qiye



系统架构师大会



微信号:SACC2013

订阅
热词专题

分类: LINUX

    之前在研究内核的procfs时,疏漏了一个与之相关的知识点,在之后的阅读《深入Linux内核构架》的相关知识时才注意到,这就是用户空间使用sysctl函数(系统控制机制)时的内核实现原理。

    系统控制机制可以在Linux内核运行时控制内核的行为,控制参数从用户空间传输到内核中,且无须reboot。早期实现这种机制的方法是用户空间使用sysctl函数,glibc将调用sysctl系统调用来实现,然后通过传递过来的二进制码(在<linux/sysctl.h>中的枚举定义)来找到相关的struct ctl_table

(早期结构体定义)

  1. struct ctl_table 
  2. {
  3. int ctl_name;
  4. const char *procname; /* Text ID for /proc/sys, or zero */
  5. void *data;
  6. int maxlen;
  7. mode_t mode;
  8. struct ctl_table *child;
  9. struct ctl_table *parent; /* Automatically set */
  10. proc_handler *proc_handler; /* Callback for text formatting */
  11. ctl_handler *strategy;
  12. struct proc_dir_entry *de;
  13. void *extra1;
  14. void *extra2;
  15. };

并使用其中的ctl_handler *strategy;函数来实现对内核配置的修改。

    由于原来的方案不是最优雅的方案(必须编写一个程序读取参数并使用sysctl将将要修改的参数传递给内核),并且这个系统调用非POSIX标准,所以sysctl是过时的,迟早会被抛弃。为了应对这种情况,Linuxprocfs,重排了所有的sysctl,建立了一个层次结构,最终导出到了/proc/sys/目录下。这样就可以用简单的用户空间工具来访问这些内核参数了。

    这时内核对于同一个参数的操作既有sysctl接口,也有procfs接口,可以说是冗余了。

    现在的内核中,这种机制已经改变了,即使是《深入Linux内核构架》中的描诉也已经过时了。可以说是为了对原有的sysctl系统调用兼容,内核现在对于原有的sysctl系统调用的实现做了修改,首先struct ctl_table删除了一些无用的成员:

  1. struct ctl_table 
  2. {
  3. const char *procname; /* Text ID for /proc/sys, or zero */
  4. void *data;
  5. int maxlen;
  6. mode_t mode;
  7. struct ctl_table *child;
  8. struct ctl_table *parent; /* Automatically set */
  9. proc_handler *proc_handler; /* Callback for text formatting */
  10. void *extra1;
  11. void *extra2;
  12. };

    其次,内核将通过sysctl系统调用in kernel/sysctl_binary.c传递进来二进制码通过sysctl_getname函数并利用一堆的struct bin_table结构体提供的信息转换为/proc/sys目录下的文件名路径,最终通过操作相应的procfs文件实现sysctl源码都在 kernel/sysctl_binary.c文件中,有兴趣的读者可以自己RTFSC 

综上所述,为了软件兼容性,现在的sysctl被保留,底层通过procfs实现原来的系统控制机制,如下图所示:

 

阅读(14853) | 评论(3) | 转发(36) |
给主人留下些什么吧!~~

Janneo2012-11-15 17:21:16

正在学习内核中,看了你的好多篇博文,受益良多,特来感谢博主!

tekkamanninja2012-07-04 21:44:40

erazy0: 老兄,图片最下面的procfs拼错了.....
谢谢,这就去改过来~~~

erazy02012-07-04 20:25:24

老兄,图片最下面的procfs拼错了

评论热议
请登录后评论。

登录 注册