procfs伪文件系统原理

Linux系统/proc目录下,有一些特殊的目录和文件,用来展示或者设置内核数据。例如,/proc/meminfo展示系统内存信息:

$ cat /proc/meminfo
MemTotal:         506160 kB
MemFree:           73528 kB
MemAvailable:     335160 kB
Buffers:           54756 kB
Cached:           162888 kB
SwapCached:            0 kB
Active:           247648 kB
Inactive:          96840 kB
Active(anon):     127044 kB
Inactive(anon):     4332 kB
Active(file):     120604 kB
Inactive(file):    92508 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:               104 kB
Writeback:             0 kB
AnonPages:        126824 kB
Mapped:            14412 kB
Shmem:              4532 kB
Slab:              70608 kB
SReclaimable:      59128 kB
SUnreclaim:        11480 kB
KernelStack:        2928 kB
PageTables:         3028 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:      253080 kB
Committed_AS:     530132 kB
VmallocTotal:   34359738367 kB
VmallocUsed:        5536 kB
VmallocChunk:   34359731707 kB
HardwareCorrupted:     0 kB
AnonHugePages:         0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       69568 kB
DirectMap2M:      454656 kB

这些数据随着系统的变化动态调整,感觉好神奇!

还有一些文件,直接跟一些内核变量映射。除了可以读出数据,还可以更新数据呢。例如,/proc/sys/net/ipv4/ip_forward用来控制IP包转发,设置为1则是是启用转发:

$ cat /proc/sys/net/ipv4/ip_forward
0
echo "1" > /proc/sys/net/ipv4/ip_forward
$ cat /proc/sys/net/ipv4/ip_forward
1

那么,这些文件本质是什么呢?是真正的文件吗?

来龙去脉

系统用户和程序(进程)经常需要某些内核信息,该怎么获得呢?

/proc/sys/net/ipv4/ip_forward为例,内核里有一个变量用来控制协议栈是否转发IP包。系统用户要控制转发是否开启,就需要去设置这个内核变量。怎么设置呢?要知道用户空间可是没有办法直接访问内核空间的。

可以考虑实现一个新的系统调用——int set_ip_forward(int value)。然而,天呀有好多这样或那样的场景,这样系统调用表是要爆炸的!而且这种方式用起来也麻烦,需要实现一个专用的命令,调用这个系统调用完成设置。

有没有更通用的方式呢?其实,让这个系统调用更加通用化,也是一种思路——int set_kernel_value(char *path, void *value)。这样一个系统调用就搞定了一些列设置要求,但是还是没有解决调用麻烦的问题。

如果,可以将内核数据伪装成一个文件,用read系统调用获取;用write系统调用设置不就完美了吗?这样,有现成的命令可以直接使用,比如用cat来获取,用echo来设置!

那么内核有办法做到吗?

办法肯定是有的。最直观的想法是,在内核处理read的代码进行控制,让read直接从内核数据中拷贝,而不是磁盘。当然了,内核黑客们不会写这么恶心的代码,而是抽象了一层——VFS

VFS

Linux支持各种各样的文件系统,光ext系列就有:ext2ext3ext4。内核如何实现不同文件系统差异性的呢?

答案是,内核抽象了VFS接口。跟面向对象编程中的接口有点类似,具体的文件系统按照各自的方式分别实现(多态)。

archi_VFS-eng.gif

如上图所示,不同的文件系统以各自的方式实现处理接口,如readwrite等等。这些处理接口被封装成结构一致的结构体注册。这样,同样的系统调用,在不同的文件系统下,由不同的函数处理。

因此,完全有可能实现一个假的文件系统,就叫procfs,读写分别映射为变量的读出和写入。

流程

最后,图解说明访问/proc下文件的整个流程:

procfs
  1. 用户进程发起一个系统调用read
  2. 内核VFS根据文件描述符找出操作描述体;
  3. 内核从描述体取出read处理函数指针;
  4. 内核执行该处理函数;
  5. 处理函数读出内核变量并拷贝到用户态空间;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,496评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,187评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,091评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,458评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,542评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,802评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,945评论 3 407
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,709评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,158评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,502评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,637评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,300评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,911评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,744评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,982评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,344评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,500评论 2 348

推荐阅读更多精彩内容