Saturday, September 26, 2009

What Should Be Compiled as a Module?

前几天了解了一点关于module被kernel使用的两种方法:
1. built-in module
2. modular module
被编译入内核其实在速度上没有占有多大的优势, 相反, 列出了一堆使用模块module的好处. 那实际解决了一个极端的想法:
* 一切都被编译入kernel. ( 90%的人应该会想到速度上升的感觉. 其实这是幻觉 )

但是, 又会出现另一极端的想法:
* 一切都是modular module
又会是基于什么幻觉呢?

1. 基于方便使用?
这是不可能的. modular module还要被担心是不是被load到kernel中. 这增加了管理的需求.
built-in module在这方面更方便! 一切都在内核中了. 连modprobe和脚本都不用理会.

2. 基于省内存?
这篇文章: http://www.linuxjournal.com/article/1279 中的一节: What Should Be Compiled as a Module? 指出了多一个module会多浪费一点内存的. 这种浪费与多一个文件多一点浪费是一样道理的.

其实, 这种浪费会给人斤斤计较的感觉. 这个kernel会有成千上万个module? .和built-in module在速度上的上升一样是斤斤计较

所以, 两个极端的想都是不行的. 应该: 常用的被编译入kernel, 这样可以省去管理. 其它的都是modular module, 可以重编译module和省内存
这就存在一个如何区分哪些module是常用与不常的问题?

呃.... 我还不会. 我也不想斤斤计较.

上面引用的文章其实很旧了. 因为kerneld这种加载module的功能早已经被写到kernel中.
kernel中加载内核的实现:

内核代码树中的kernel/kmod.c中的:
int __request_module(bool wait, const char *fmt, ...)
在include/linux/kmod.h中定义一个重命名的宏:
#define request_module(mod...) __request_module(true, mod)

__request_module其实也是大家说的system call:
jessinio@niolaptop /usr/src/linux $ cat /proc/kallsyms |grep __request_module
c02389fa T __request_module
* 说白了, 这只是一个kernel空间被定义的, 很普通的function
* 这种system call在用户空间中没有什么特别能力! 因为它是使用了modprobe命令(在/proc/sys/kernel/modprobe中指定)
* 这种system call不会是人们关注的system call的
* "__"开始的函数与python推介的使用习惯是相同意义的

关于kmod: http://pficheux.free.fr/eyrolles/linux_embarque/docs_externes/kmod.txt.html
上面的文章中, 给出了一个issue, 和一个很有意义的建议:
Note for users building a heavily modularised system. It is a good idea to
create modules.dep after installing the modules and before booting a kernel for
the first time. "depmod -ae m.n.p" where m.n.p is the new kernel version.
不过. 这篇文章也是有点老了, 1999年的. 不知道在2.6内核中是否对这个issue上有了改进

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.