我不是一个开发人员,但我理解一些c概念。但是,我很难找到meminfo.c/meminfo_proc_show()中的枚举(例如NR_LRU_LISTS
等)和page_alloc.c/si_meminfo()中的变量(例如totalram_pages等)的设置位置。
我所说的set是指例如NR_LRU_LISTS = 324077
。我的理解是LRU_ACTIVE_FILE
等于3
,但是=
前面没有NR_LRU_LISTS
运算符,所以必须在其他地方设置。
我单击了枚举/变量以查看它们可能被调用的位置,但可能有太多不相关的引用或是不定义的引用。
最后一件事是我没有意识到什么,但是什么?
老实说,我的目标是确定如何计算/proc/meminfo的值。
但是,我的问题是:这些枚举和变量设置在哪里?
更新1:
枚举部分现在已经解决,并且NR_LRU_LISTS
等于5
。
但是totalram_pages
部分似乎更难找到…
最佳答案
您询问的常量是使用c的“enum”功能定义的。
enum Foo { A = 4, B, C };
分别用值4、5和6声明名为
A
、B
和C
的常量。每个没有初始值设定项的常数都被设置为比上一个常数多一个。如果
enum
声明中的第一个常量没有初始值设定项,则将其设置为零。您询问的变量在文件作用域(即,在任何函数之外)定义时没有初始值设定项。例如,
totalram_pages
被定义为on line 128 of page_alloc.c
,其中有一个公共声明供整个内核on line 50 of linux/mm.h
使用。因为它们是在文件作用域定义的,并且没有初始化器,所以在程序启动时它们被初始化为零。(这与在没有初始值设定项的函数中定义的变量有着重要的区别。它们以“不确定”值开始,即引发不确定行为的读数。)我不知道
totalram_pages
如何获得有意义的值。这段代码太复杂了,我现在不想追踪它。听起来你刚开始学C。学习别人的代码是一个很好的学习方法,但是你应该从简单的程序开始。Linux内核并不简单,因为它是一个操作系统内核,所以它也做了很多在其他程序中被认为是错误的风格或是完全错误的事情。别一开始就这样。
…也就是说,使用
enum
声明一堆相关的常量并让它们隐式地接受序列值是完全正常和良好的风格,在文件范围内定义变量(没有初始值设定项)并在程序启动时依赖它们为零也是如此。(首先拥有一个全局变量通常是错误的,但是如果您真的需要一个全局变量,依赖于隐式初始化为零并不是错误的。)这些是您需要理解的,也是您可能希望在适当时候自己完成的事情。