微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 深度介绍Linux内核是如何工作的

深度介绍Linux内核是如何工作的

时间:10-08 来源:互联网 点击:

一些了解,让我们再来简单看下它的物理组成。早期版本的Linux Kernel是整体式的,也就是说所有的部件都静态地连接成一个(很大的)执行文件。

相比较而言,现在的Linux Kernel是模块化的:许多功能包含在模块内,然后动态地载入kernel中。这使得kernel的内核很小,而且在运行kernel时可以不必reboot就能载入和替代模块。

Kernel的内核在boot time时从位于/boot 目录的一个文件加载进存储中,通常这个/boot 目录会被叫做KERNELVERSION,KERNELVERSION与kernel版本有关。(如果你想知道你的kernel版本是什么,运行命令行显示系统信息-r。)kernel的模块位于目录/lib/modules/KERNELVERSION之下,所有的组件都会在kernel安装时被拷贝。

管理模块

大部分情况下,Linux管理它的模块不需要你的帮忙,但是如果必要的时候有命令行可以来手动检查和管理模块。比如,为了查清楚当前到底哪个模块在载入kernel。这里有一个输出的例子:

# lsmod

pcspkr 4224 0

hci_usb 18204 2

psmouse 38920 0

bluetooth 55908 7 rfcomm,l2cap,hci_usb

yenta_socket 27532 5

rsrc_nonstatic 14080 1 yenta_socket

isofs 36284 0

输出的内容包括:模块的名字、大小、使用次数和依赖于它的模块列表。使用次数对防止卸载当前活跃的模块非常总要。Linux只允许使用次数为零的模块被移除。

你可以使用modprobe来手动加载和卸载模块,(还有两个命令行叫做insmod和rmmod,但modprobe更易于使用因为它自动移除了模块依赖)。比如lsmod的输出在我们的电脑上显示了一个名叫isofs的卸载模块,它的使用次数是零而且没有依赖模块,(isofs是一个模块,它支持CD上使用的ISO系统文件格式)这种情况下,kernel会允许我们卸载模块:

# modprobe -r isofs

现在,isofs不再显示在Ismod的输出中,kernel由此节省了36,284字节的存储。如果你放入CD并且让它自动安装,kernel将自动重新载入isofs模块,而且isofs的使用次数增加到1次。如果这时候你还试图移除模块,就不会成功了因为它正在被使用:

# modprobe -r isofs

FATAL: Module isofs is in use.

Lsmod只是列出了当前被载入的模块,modprobe则将列出所有可用的模块,它实际上输出了/lib/modules/KERNELVERSION目录下所有的模块,名单会很长!

实际上,使用modprobe来手动加载一个模块并不常见,但确实可以通过modprobe命令行来对模块设置参数,例如:

# modprobe usbcore blinkenlights=1

我们并不是在创建blinkenlights,而是usbcore模块的实参数。

那么如何知道一个模块会接受什么参数呢?一个比较好的方法是使用modinfo命令,它列出了关于模块的种种信息。这里有一个关于模块snd-hda-intel的例子

# modinfo snd-hda-intel

filename: /lib/modules/2.6.20-16-generic/kernel/sound/pci/hda/snd-hda-intel.ko

description: Intel HDA driver

license: GPL

srcversion: A3552B2DF3A932D88FFC00C

alias: pci:v000010DEd0000055Dsv*sd*bc*sc*i*

alias: pci:v000010DEd0000055Csv*sd*bc*sc*i*

depends: snd-pcm,snd-page-alloc,snd-hda-codec,snd

vermagic: 2.6.20-16-generic SMP mod_unload 586

parm: index:Index value for Intel HD audio interface. (int)

parm: id:ID string for Intel HD audio interface. (charp)

parm: model:Use the given board model. (charp)

parm: position_fix:Fix DMA pointer (0 = auto, 1 = none, 2 = POSBUF, 3 = FIFO size). (int)

parm: probe_mask:Bitmask to probe codecs (default = -1). (int)

parm: single_cmd:Use single command to communicate with codecs (for debugging only). (bool)

parm: enable_msi:Enable Message Signaled Interrupt (MSI) (int)

parm: enable:bool

对我们来说比较有兴趣的以parm开头的那些部分:显示了模块所接受的参数。这些描述都比较简明,如果想要更多的信息,那就安装kernel的源代码,在类似于/usr/src/KERNELVERSION/Documentation的目录下你会找到。

里面会有一些有趣的东西,比如文件/usr/src/KERNELVERSION/Documentation/sound/alsa/ALSA-Configuration.txt描述的是被许多ALSA声音模块承认的参数;/usr/src/KERNELVERSION/Documentation/kernel-parameters.txt这个文件也很有用。

前几天在Ubuntu论坛有一个例子,说的是如何将参数传递到一个模块(详见https://help.ubuntu.com/community/HdaIntelSoundHowto)。实际上问题的关键是snd-hda-intel参数在正确驱动声音硬件时需要一点操作,而且在boot time加载时

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top