手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网站运营>建站经验>列表

Linux操作系统内核模块和用户程式对比

来源:互联网 作者:west263.com 时间:2008-04-16
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

代码空间

内存管理是个很复杂的课题。O'Reilly的《Understanding The Linux Kernel》绝大部分都在 讨论内存管理!我们 并不准备专注于内存管理,但有一些东西还是得知道的。

假如您没有认真考虑过内存设计缺陷意味着什么,您也许会惊讶的获知一个指针并不指向一个确切的内存区域。当一个进程建立时,内核为他分配一部分确切的实际内存空间并把他交给进程,被进程的代码,变量,堆栈和其他一些电脑学的专家才明白的东西使用[4]。这些内存从$0$ 开始并能够扩展到需要的地方。这些内存空间并不重叠,所以即使进程访问同一个内存地址,例如0xbffff978,真实的物理内存地址其实是不同的。进程实际指向的是一块被分配的内存中以0xbffff978 为偏移量的一块内存区域。绝大多数情况下,一个进程像普通的"Hello, World"不能够访问别的进程的 内存空间,尽管有实现这种机制的方法。我们将在以后讨论。

内核自己也有内存空间。既然一个内核模块能够动态的从内核中加载和卸载,他其实是共享内核的 内存空间而不是自己拥有单独的内存空间。因此,一旦您的模块具备内存设计缺陷,内核就是内存设计缺陷了。 假如您在错误的覆盖数据,那么您就在破坏内核的代码。这比现在听起来的还糟。所以尽量小心谨慎。

顺便提一下,以上我所指出的对于任何单整体内核的操作系统都是真实的[5]。 也存在模块化微内核的操作系统,如 GNU Hurd 和 QNX Neutrino。

一种内核模块是设备驱动程式,为使用硬件设备像电视卡和串口而编写。 在Unix中,任何设备都被当作路径/dev 的设备文档处理,并通过这些设备文档提供访问硬件的方法。 设备驱动为用户程式访问硬件设备。举例来说,声卡设备驱动程式es1370.o将会把设备文档 /dev/sound同声卡硬件Ensoniq IS1370联系起来。这样用户程式像 mp3blaster 就能够通过访问设备文档/dev/sound 运行而不必知道那种声卡硬件安装在系统上。

Major and Minor Numbers

让我们来研究几个设备文档。这里的几个设备文档代表着一块主IDE硬盘上的头三个分区:

# ls -l /dev/hda[1-3]

            brw-rw---- 1 root disk 3, 1 Jul 5 2000 /dev/hda1

            brw-rw---- 1 root disk 3, 2 Jul 5 2000 /dev/hda2

            brw-rw---- 1 root disk 3, 3 Jul 5 2000 /dev/hda3

注意一下被逗号隔开的两列。第一个数字被叫做主设备号,第二个被叫做从设备号。 主设备号决定使用何种设备驱动程式。每种不同的设备都被分配了不同的主设备号; 任何具备相同主设备号的设备文档都是被同一个驱动程式控制。上面例子中的 主设备号都为3,表示他们都被同一个驱动程式控制。

从设备号用来区别驱动程式控制的多个设备。上面例子中的从设备号不相同是因为他们被识别为几个设备。

设备被大概的分为两类:字符设备和块设备。区别是块设备有缓冲区,所以他们能够对请求进行优化排序。 这对存储设备尤其重要,因为读写相邻的文档总比读写相隔很远的文档要快。另一个区别是块设备输入和输出 都是以数据块为单位的,但是字符设备就能够自由读写任意量的字节。大部分硬件设备为字符设备,因为他们 无需缓冲区和数据不是按块来传输的。您能够通过命令ls -l输出的头一个字母识别一个 设备为何种设备。假如是'b' 就是块设备,假如是'c'就是字符设备。以上您看到的是块设备。这儿更有一些字符设备文档(串口):

crw-rw---- 1 root dial 4, 64 Feb 18 23:34 /dev/ttyS0

            crw-r----- 1 root dial 4, 65 Nov 17 10:26 /dev/ttyS1

            crw-rw---- 1 root dial 4, 66 Jul 5 2000 /dev/ttyS2

            crw-rw---- 1 root dial 4, 67 Jul 5 2000 /dev/ttyS3

假如您想看一下已分配的主设备号都是些什么设备能够看一下文档 /usr/src/linux/Documentation/devices.txt。

系统安装时,任何的这些设备文档都是由命令mknod建立的。去建立一个新的名叫 coffee',主设备号为12和从设备号为2的设备文档,只要简单的 执行命令mknod /dev/coffee c 12 2。您并不是必须将设备文档放在目录 /dev中,这只是个传统。Linus本人是这样做的,所以您最好也不例外。但是,当您测试一个模块时,在工作目录建立一个设备文档也不错。 只要确保完成后将他放在驱动程式找得到的地方。

我还想声明在以上讨论中隐含的几点。当系统访问一个系统文档时, 系统内核只使用主设备号来区别设备类型和决定使用何种内核模块。系统 内核并无需知道从设备号。内核模块驱动本身才关注从设备号,并用之来 区别其操纵的不同设备。

另外,我这儿提到的硬件是比那种能够握在手里的PCI卡稍微抽象一点的东西。看一下下面的两个设备文档:

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!