免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1263 | 回复: 0
打印 上一主题 下一主题

小菜 原创 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-04-21 10:23 |只看该作者 |倒序浏览
linux操作系统本身是一个巨内核(某些学校老师会胡扯,居然说linux是微内核,明明现在世界上较为有名的微内核系统只有塞班和minix),为了增加linux内核对日益增加的驱动的支持,linux采用了一种较为有趣的模块机制。

就像之前提到的,linux本身是巨内核,驱动的代码都是直接编译在内核里。但到了今天,linux源码已经有1100多万行了,如果把所有的驱动都编译进内核,即便采用bz2压缩,也要有100MB,一个内核都有100MB,这种体积是无法容忍的。所以linux引入了模块机制。

留心过/boot/目录的人,应该会发现类似于下面的结果:
adam@arch-vm ~ $ ls /boot/ -alh
总用量 13M
drwxr-xr-x  3 root root 4.0K  9月  4 09:33 .
drwxr-xr-x 21 root root 4.0K  9月  8 19:02 ..
drwxr-xr-x  2 root root 4.0K  9月 10 21:20 grub
-rw-r--r--  1 root root 8.1M  9月  4 09:36 kernel26-fallback.img
-rw-r--r--  1 root root 1.6M  9月  4 09:33 kernel26.img
-rw-r--r--  1 root root 1.4M  8月 27 23:19 System.map26
-rw-r--r--  1 root root 2.1M  8月 27 23:19 vmlinuz26
复制代码
虽然结果会根据发行版不同而有所差异,但大致上差别不大。
两个.img后缀的是initrd,vmlinuz那个才是真正的内核。(关于initrd请参照日后我写的linux引导详解)
可以看出实际上内核体积小的可怜。这就归功于linux的模块机制。

绝大多数发行版编译内核都是尽可能多的把选项编译成模块(详细编译内核请参照日后我写的内核编译的帖子)
所以内核本身并不大。
如果想要了解内核模块的大小,可以du -sh /lib/modulkes/*
adam@arch-vm ~ $ du -sh /lib/modules/*
102M        /lib/modules/2.6.35-ARCH
复制代码
可见,linux的通用内核的通用性主要还是体现在模块上,而不是内核本身。

linux模块实际上是编译好的模块代码,再加上一定的文件头(linux特定模块头)。
使用的时候,linux先检查模块头中的信息(内核版本号,许可协议等)。然后去除模块头,通过系统调用,将模块代码直接插入到运行中的内核里。之后,模块就成为内核的一部分,功能上和直接编译到内核里是没有区别的。
同时,由于模块的代码是直接运行在内核里的,所以如果模块写的不好有bug,经常会直接导致kernel panic(对于整天只会用X界面的人来说,一般是看不到kernel panic提示的),所以从本质上说,模块并没有提高linux的安全性。(这就是巨内核和微内核的最大的区别)


linux模块使用要点:
1.版本号要一致。
由于模块头信息中有版本号(uname -r的输出结果,所以包括版本号后面添加的自定义字段),而且到现在,linux已经有了无数的版本(现在已经是2.6.35了,不算小版本号,2.6系列已经至少35不同版本了,还有2.2 2.4等等),所以厂商一般不会给出编译好的模块,而是给出半成品的.o文件,然后让用户用自己的内核头文件将对应的.o链接成针对自己内核版本的.ko模块。
所以很多虚拟姬的tools需要gcc和linux-kernel-headers-`uname -r`才能安装。

PS:有一个发行版是特例,那就是傻瓜级的ubuntu,自以为所有用ubuntu的人都是傻瓜,不会自定义内核,所以很多厂商驱动都是只提供编译好的(针对ubuntu发行版指定的少数内核)。而且ubuntu并不鼓励用户修改配置(从ubuntu的很多配置文件里可以看出),完全违背了linux的可自定义的特点,所以真·linuxer都应该去BS ubuntu。

2.新编译出的模块最好不要直接使用
由于模块间通常有复杂的依赖关系,在编译好新模块后,通常要用sudo depmod -a来重新计算模块依赖关系。(通常情况下,厂商提供的Makefile中在install这个目标上已经做好这一步了)

3.模块使用
早期linux版本中使用insmod来安装模块,现在使用modprobe安装,参数直接接模块名。
程序会自动搜索/lib/modules/`uanme -r`来寻找模块。同时会自动装载有依赖关系的模块。
使用modprbe -r来移除正在使用的模块,同理会自动处理依赖关系。

本文只是简单介绍了一下linux模块。
其实由于linux的模块机制,给linux的启动也带来了一定的变化。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP