Android底层接口与驱动开发技术详解
上QQ阅读APP看书,第一时间看更新

1.5.2 和Android密切相关的Linux内核知识

Android是在Linux内核基础上运行的,提供的核心系统服务包括安全、内存管理、进程管理、网络组和驱动模型等内容。接下来将简要讲解上述核心系统服务的基本知识。

1.安全

Linux安全的知识主要涉及用户权限问题和目录权限问题。

(1)Linux系统中用户和权限

Linux系统中的每个文件和目录都有访问权限,用它来确定谁可以通过何种方式对文件和目录进行访问和操作。Linux系统中规定了文件3种不同类型的用户:文件拥有者(user)用户、同组用户(group)、可以访问系统的其他用户(others)。并规定3种访问文件或目录的方式:读(r)、写(w)、可执行或查找(x)。

(2)文件及目录权限的功能

● 读权限(r):表示只允许指定用户读取相应文件的内容,禁止对它做任何更改操作,如目录读权限表示可以列出存储在该目录下的文件,即读目录内容。

● 写权限(w):表示允许指定用户打开并修改文件,如目录写表示允许从目录中删除或创建新的文件或目录。

● 执行权限(x):表示允许指定用户将该文件作为一个程序执行,如对目录表示允许在目录中查找,并能用cd命令将工作目录切换到该目录。

Linux系统在创建文件时,会自动把该文件的读/写权限分配给其属主,使用户能够显示和修改该文件,也可以将这些权限改变为其他组合形式。一个文件如果有执行权限,则允许它作为一个程序被执行。

2.内存管理

内存管理是计算机编程最为基本的领域之一。在很多脚本语言中,用户不必担心内存是如何管理的,这并不会使内存管理的重要性有一点点降低。对实际编程来说,理解内存管理器的能力与局限性至关重要。在大部分系统语言中必须进行内存管理,如C和C++。

追溯到在Apple Ⅱ上进行汇编语言编程的时代,那时内存管理还不是个大问题。实际上在运行整个系统,系统有多少内存用户就有多少内存。用户甚至不必费心思去弄明白它有多少内存,因为每一台计算机的内存数量都相同。所以,如果内存需求固定,那么用户只需选择一个内存范围并使用它即可。

但是即使是在这样一个简单的计算机中也会有问题,尤其是当用户不知道程序的每个部分将需要多少内存时。如果用户的空间有限,而内存需求是变化的,那么需要用一些方法来满足下面的需求。

(1)确定是否有足够的内存来处理数据。

(2)从可用的内存中获取一部分内存。

(3)向可用内存池(pool)中返回部分内存,以使其可以由程序的其他部分或者其他程序使用。

实现上述需求的程序库称为分配程序(allocators),因为它们负责分配和回收内存。程序的动态性越强,内存管理就越重要,用户的内存分配程序的选择也就更重要。下面来了解可用于内存管理的不同方法,它们的好处与不足,以及它们最适用的情形。

3.进程管理

在Linux操作系统中包括3种不同类型的进程,分别是交互进程、批处理进程和守护进程。每种进程都有自己的特点和属性。交互进程是由一个Shell启动的进程。交互进程既可以在前台运行,也可以在后台运行。批处理进程和终端没有联系,是一个进程序列。系统守护进程是Linux系统启动时启动的进程,并在后台运行。

Linux管理进程的最好方法就是使用命令行下的系统命令。Linux下面的进程涉及的命令有ps、kill、pgrep等工具。

(1)父进程和子进程

父进程和子进程的关系是管理和被管理的关系,当父进程终止时,子进程也随之终止。但子进程终止,父进程并不一定终止。比如,httpd服务器运行时,用户可以“杀掉”其子进程,父进程并不会因为子进程的终止而终止。在进程管理中,当用户发现占用资源过多,或无法控制的进程时,应该杀死它,以保护系统的稳定安全运行。

(2)进程命令

在Linux中,通过命令来管理和操作进程,其中常用的命令可以分为如下几类。

①监视进程命令

ps(process status命令):用于显示瞬间行程(process)的动态,其使用方式如下。

其中参数options的取值非常多,常用参数的具体说明如下。

pstree命令:功能是显示当前运行的所有进程及相关的子进程,输出的是类似‘tree’命令的树状格式。其使用方式如下。

常用参数的具体说明如下。

● -a:显示该行程的完整指令及参数,如果是被记忆体置换出去的行程则会加上括号。

● -c:如果有重复的行程名,则分开列出(预设值会在前面加上*)。

top命令:用于实时显示process的动态,其使用方式如下。

常用参数的具体说明如下。

● d:改变显示的更新速度,或是在交谈式指令列(interactive command)按s键。

● q:没有任何延迟的显示速度,如果使用者有superuser的权限,则top将会以最高的优先序执行。

● c:切换显示模式,共有两种模式,一是只显示执行档的名称,另一种是显示完整的路径与名称。

● S:累积模式,会将已完成或消失的子行程(dead child process)的CPU time累积起来。

● s:安全模式,将交谈式指令取消,避免潜在的危机。

● i:不显示任何闲置(idle)或无用(zombie)的行程。

● n:更新的次数,完成后将会退出top。

● b:批次档模式,搭配n参数一起使用,可以用来将top的结果输出到档案内。

控制进程命令。

向Linux系统的内核发送一个系统操作信号和某个程序的进程标识号,系统内核就可以对进程标识号指定的进程进行操作。例如,在top命令中会看到系统运行的许多进程,有时就需要使用kill命令中止某些进程来提高系统资源。在安装和登录命令中使用多个虚拟控制台的作用是,当一个程序出错造成系统死锁时可以切换到其他虚拟控制台工作关闭这个程序。此时使用的命令就是kill,因为kill是大多数Shell内部命令可以直接调用的。

在Linux系统中,使用kill命令来控制进程。kill可以删除执行中的程序或工作,可以将指定的信息送至程序,预设的信息为SIGTERM(15),可将指定程序终止。若仍无法终止该程序,可使用SIGKILL(9)信息尝试强制删除程序。程序或工作的编号可利用ps指令或jobs指令查看。

在现实应用中,有如下两种使用kill命令的方式。

各个参数的具体说明如下。

● -s <信息名称或编号>:指定要送出的信息;

● -l <信息编号>:如果不加<信息编号>选项,则-l参数会列出全部的信息名称。

注意:进程是Linux系统中一个非常重要的概念。Linux是一个多任务的操作系统,系统上经常同时运行多个进程。用户并不关心这些进程究竟是如何分配的,或者是内核如何管理分配时间片的,所关心的是如何去控制这些进程,让它们能够很好地为用户服务。

②进程优先级设定(nice命令)

使用nice命令可以使用更改过的优先顺序来执行程序,如果未指定程序,则会显示出目前的进程优先顺序,默认的adjustment为10,范围为-20(最高优先序)~19(最低优先序)。使用nice命令的方式如下。

各个参数的具体说明如下。

● -n adjustment,-adjustment,--adjustment=adjustment:都将原有的优先顺序增加adjustment。

● --help:显示求助信息。

● --version:显示版本资讯。

4.设备驱动程序

既然本书是讲解内核和驱动开发的书籍,就不可避免地讲解设备驱动程序的知识。设备驱动程序用于与系统连接的输入/输出装置通信,如硬盘、软盘驱动器、各种接口、声卡等。按照“万物皆文件(everything is a file)”的说法,对外设的访问可利用/dev目录下的设备文件来完成,程序对设备的处理完全类似常规的文件。设备驱动程序的任务在于支持应用程序经由设备文件与设备通信。通常可以将外设分为以下两类。

(1)字符设备。提供连续的数据流,应用程序可以顺序读取,通常不支持随机存取。相反,此类设备支持按字节、字符来读/写数据。举例来说,调制解调器是典型的字符设备。

(2)块设备。应用程序可以随机访问设备数据,程序可自行确定读取数据的位置。硬盘是典型的块设备,应用程序可以寻址磁盘上的任何位置,并由此读取数据。此外,数据的读/写只能以块(通常是512bit)的倍数进行。与字符设备不同,块设备并不支持基于字符的寻址。

编写块设备的驱动程序比字符设备要复杂得多,因为内核为提高系统性能广泛地使用缓存机制。

5.网络

网卡也可以通过设备驱动程序控制,但在内核中属于特殊状况,因为网卡不能利用设备文件访问。原因在于在网络通信期间,数据打包到各种协议层中。在接收到数据时,内核必须针对各协议层的处理,对数据进行拆包与分析,然后才能将有效数据传递给应用程序。在发送数据时,内核必须首先根据各个协议层的要求打包数据,然后才能发送。

为支持通过文件接口处理网络连接(按照应用程序的观点),Linux使用源于BSD的套接字抽象。套接字可以看作应用程序、文件接口、内核的网络实现之间的代理。