Wednesday, September 23, 2009

built-in 与 modular两种module

本人不是一专追求机器性能的人. 本人世界观觉得是没有必要这样做的.
本文主要是为了弄明白一件事: 编译入内核的module与动态加载的module是否在效率上有较大的差距.

linux kernel是单核结构, 称为monolithic kernel. 因为单核的一些缺点, linux kernel加入了modular结构.
因此linux对待module的方法有两种:
1. module被编译入内核, 成为monolithic kernel内部代码
2. module被编译成模块, 需要时才加载. 称为modular kernel.

被加载入内核的module, 其实也是执行于kernel的code space的. 这个的module与built-in module在效率上什么区别吗?

如果一定要说效率的话, 差别就在于静态链接与动态链接的差别了!

相反, modular kernel可以让kernel得到功能裁减, 效率上有提升!

modular module
优势:
1. 方便增加功能.
2. module参数传递
3. 减少memory footprint, 增加效率. 不使用时可以rmmod, 减少内存开支
缺点:
1. 在加载module上浪费时间( 这点其实是可以无视的! )
2. 容易被利用rootkit( 如果Module support = N 的话就永远不会出现 )

这里也没有提到built-in的module是否比load入的module效率高.
http://www.redhatlinuxsysadmin.com/configure-key-linux-components/module2/modular-monolithic-kernels.php

module需要被注册才可以被使用的. 所以/proc/devices中有系统中的所有驱动module
jessinio@niolaptop ~ $ cat /proc/devices
Character devices:
  1 mem
  4 /dev/vc/0
  4 tty
  4 ttyS
  5 /dev/tty
...
Block devices:
  1 ramdisk
259 blkext
  7 loop
  8 sd
  9 md
 11 sr
...

例子中, major number是1的就是内存的module

jessinio@niolaptop ~ $ cat /proc/devices |grep alsa
116 alsa
jessinio@niolaptop ~ $ lsmod |grep alsa

比较一下, 可以知道alsa是一个built-in module

rmmod命令能否拆下built-in module呢? 下面测试一下
jessinio@niolaptop ~ $ sudo rmmod alsa
ERROR: Module alsa does not exist in /proc/modules
* 因为built-in module不在此文件中记录, rmmod是需要此文件的记录, 所以出错
其实rmmod是使用
delete_module这个system call的:
jessinio@niolaptop /tmp $ sudo strace rmmod test_n
...
open("/proc/modules", O_RDONLY)
...
delete_module("test_nx", O_RDONLY|O_EXCL|O_NONBLOCK)

...
从delete_module的man手册中看到:
delete_module - delete a loadable module entry. 只是针对于loadable的module才起作用的

* 所以rmmod是不能拆下built-in module的

其它参考文档:
http://systhread.net/texts/200510kdiff.php

No comments:

Post a Comment

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