http://blog.chinaunix.net/uid-25299072-id-1753870.html在内核模块编译中,会选择编译成模块,或者build in 内核镜像中,其中对内核模块有很好的的说明,这也是linux在嵌入式当中得到广泛应用的充分体现, 内核中有很多功能选项,其中有许多使我们不需要的,内核设计成模块的优势所在就在这里,不需要的我们不需要进行编译,在进行裁剪过后(剔除不需要的功能选项之后),编译成我们的镜像文件。其中内核模块有很多选项之间是相互依赖的,这也就是在进行内核裁剪的时候难点的所在。 对模块在这里我要进行一定说明和解释,在系统目录中有两处包含模块的相关信息
(1)/sys/module/(目录下)(包含所有编译的模块信息) | 这里有系统中所有模块的信息,不论这些模块是以内联(inlined)方式编译到内核映像文件(vmlinuz)中还是编译为外部模块(ko文件),都可能会出现在
/sys/module 中: 编译为外部模块(ko文件)在加载后会出现对应的 /sys/module//, 并且在这个目录下会出现一些属性文件和属性目录来表示此外部模块的一些信息,如版本号、加载状态、所提供的驱动程序等; 编译为内联方式的模块则只在当它有
非0属性的模块参数时会出现对应的 /sys/module/, 这些模块的可用参数会出现在
/sys/modules//parameters/ 中,
- 如 /sys/module/printk/parameters/time 这个可读写参数控制着内联模块 printk 在打印内核消息时是否加上时间前缀;
- 所有内联模块的参数也可以由 ".=" 的形式写在内核启动参数上,如启动内核时加上参数 "printk.time=1" 与 向 "/sys/module/printk/parameters/time" 写入1的效果相同;
(2)/proc/modules(记录在文件当中)proc/moudles 那种信息的单个文件版本. 其中的条目包含了模块名, 每个模块占用的内存数量, 以及使用计数. 另外的字串追加到每行的末尾来指定标志, 对这个模块当前是活动的.
wugang@wugang-desktop:~$ cat /proc/modules
book 3200 0 - Live 0xe042e000
hello 2560 0 - Live 0xe02c3000
i915 32512 2 - Live 0xe0417000
其中 book(模块名) 3200是模块占用内存的大小。 0是模块加载计数 Live表示模块可用
0xe042e000 肯定是模块的起始地址。
在/sys/modules模块的信息(新版)
来自内核源码目录的目标文件, 描述一个模块为之建立的环境.
wugang@wugang-desktop:~$ cd /sys/module/book
wugang@wugang-desktop:/sys/module/book$ ls
holders initstate notes parameters refcnt sections srcversion
holders 持有人,是写本模块的人。但是目录为空。
initstate 记录模块活动
notes 暂且没有查到,好像是日记,有个隐藏文件,可能就是记录本模块的信息 *
parameters 使用的变量
refcnt 模块的加载计数
wugang@wugang-desktop:/sys/module/book/sections$ ls
__param __versions
其中sections目录中, __param是参数起始地址。
而sections目录中,__versions 好像和版本有关 *
这两个参数和地址有关。
srcversion BDF6D850ED985425407E440 模块版本号 像模块的ID一样
打开/proc/kallsyms目录下文件都是0字节,且打开为空白信息。
但是用cat命令,可以查看出里面的信息。
最后翻书,操作系统运行时,进程及内核信息(cpu,硬盘分区,内存信息)存放在这里。
/proc目录为伪文件系统,proc并不是真正的文件系统,它存在于内存中。
而且/sys也是存在内存中。
-r-------- 1 root root 528420864 2008-07-17 21:25 kcore
我机子上的,/proc文件目录大小几乎全部集中在那个文件中。
且无法用命令查看其中的信息.
/proc 文件系统是一种特殊的、由程序创建的文件系统,内核使用它向外界输出信息。/proc 下面的每个文件都绑定于一个内核函数,这个函数在文件被读取时,动态地生成文件的"内容",例如,/proc/modules 列出的是当前载入模块的列表。这样可以动态访问其中进程和内核信息。
Linux系统对/proc的使用很频繁。现代Linux系统中的很多工具都是通过 /proc 来获取它们的信息,例如 ps、top 和 uptime。有些设备驱动程序也通过 /proc 输出信息,你的驱动程序当然也可以这么做。因为 /proc 文件系统是动态的,所以驱动程序模块可以在任何时候添加或删除其中的文件项。
特征完全的 /proc 文件项相当复杂;在所有的这些特征当中,有一点要指出的是,这些 /proc 文件不仅可以用于读出数据,也可以用于写入数据。不过,大多数时候,/proc 文件项是只读文件。
注:*表示我不确定的问题,有问题请参考 module.h源代码。