Linux内核基础
主要用于记录一些看过自我感觉不错的Linux相关的知识点,
概述:
Android使用标准的Linux内核,随着Android发布版本的升级,Linux内核也在同步更新。Android中内核的结构与标准的Linux内核基本相同,因功能需要还增加了一些驱动程序,这些驱动程序可以分为专用驱动和设备驱动两类。因此在学习Android内核之前,有必要了解Linux内核。Linux操作系统自上而下可以分为用户空间(User Space)和内核空间(KernelSpace),

用户空间也称为应用程序空间,是用户应用程序执行的地方。C Library(libc)用于应用程序和内核之间的相互转换,提供了连接内核的系统调用接口。内核的主要用途是实现对设备硬件的编程控制和接口操作,调度对硬件资源的访问,为用户程序提供一个高级的执行环境和对硬件的虚拟接口,实现用户程序与硬件的交互。内核实现的是一个资源管理器功能。无论进程、内存还是硬件设备,内核负责管理并裁定多个竞争用户对资源的访问(既包括内核空间也包括用户空间)。内核提供两种结构模式,整体式的单内核模式和层次式的微内核模式。Android所采用的Linux内核是基于单内核模式的。这种模式的优点在于代码紧凑,执行速度快。Linux内核可以看作一个整体,也可以被划分为多个子系统。Linux内核由上至下分别为:系统调用接口,实现系统的基本功能,如read和write功能;独立于体系结构的内核代码,这些代码是Linux所支持的所有处理器体系结构所通用的内核代码;依赖于体系结构的代码,这些代码用于特定体系结构的处理器和特定平台的代码,构成了通常称为BSP(Board Support Package)的部分。
Linux内核的主要子系统
Linux内核可以划分为多个子系统,Linux内核的主要组件

1.系统调用接口(System Call Interface)
SCI层依赖于体系结构,定义了从用户空间到内核的函数调用接口,提供函数调用多路复用和多路分解服务。在./linux/kernel中可以找到SCI层的实现,在./linux/arch中可以找到依赖于体系结构的部分。
2.进程管理(Process Management)
进程管理的重点是进程的执行。内核通过SCI层提供了一个应用程序编程接口(API)用于新进程的创建和运行进程的停止操作,例如进程创建函数fork、exec和Portable Operating System Interface[POSIX]函数,进程终止函数kill、exit函数,并通过signal机制和POSIX机制实现进程之间的通信和同步。进程管理还通过O(1)调度算法协调各活动进程之间共享CPU的需求。该算法支持多处理器(称为对称多处理器或SMP),特点是调度多个进程所使用的时间和调度一个进程所使用的时间是相同的。因此不管有多少个进程竞争CPU,该算法都可以在固定时间内完成操作。
3.内存管理(Memory Management)
Linux内存管理机制中拥有物理内存和虚拟内存两种内存形式。物理内存就是系统硬件提供的内存大小,是真正的内存。虚拟内存是物理内存的扩展,以提升物理内存的利用率为目的,是利用磁盘空间虚拟出的一块逻辑内存。用作虚拟内存的磁盘空间被称为交换空间(Swap Space),工作原理是在物理内存不足时,根据内核中的“最近最经常使用”算法将暂时不用的页面文件信息写入交换空间,释放相关的物理内存,被释放的内存空间可以用于其他应用程序的申请。当系统需要调用这些页面文件时,这些信息重新从交换空间写入物理内存空间。内存管理的源代码可以在./linux/mm中找到。
4.虚拟文件系统(Virtual File System)
虚拟文件系统为文件系统提供了一个通用的抽象接口。VFS在SCI和内核所支持的文件系统之间提供了一个交换层如图5-3所示。

在VFS上面是对API的抽象,为open、close、read和write之类的函数提供一个通用的API。在VFS下面是对文件系统的抽象,定义了上层函数的实现方式。它们是给定文件系统(超过50个)的插件。文件系统的源代码在./linux/fs中。文件系统层之下是缓冲区缓存,它为文件系统层提供了一个通用函数集(与具体文件系统无关)。这个缓存层通过将数据保留一段时间(或者随机预先读取数据以便在需要时就可用)优化了对物理设备的访问。缓冲区缓存之下是设备驱动程序,实现特定物理设备的接口。
5.网络堆栈(Network Stack)
网络堆栈在设计上遵循分层体系结构,是网络子系统的标准API,它为各种网络协议提供了一个用户接口。从原始帧访问到IP协议数据单元(PDU),再到TCP和UDP,socket层提供了一种标准化的方法来管理连接,并在各个终点之间移动数据。网络堆栈的源代码在./linux/net中。
6.设备驱动程序(Device Drivers)
设备驱动程序是内核的重要组成部分,实现特定硬件设备的运转。Linux源码树提供了一个驱动程序子目录,这个目录又进一步划分为各种支持设备,例如Bluetooth、I2C、serial等。设备驱动程序的代码可以在./linux/drivers中找到。
7.依赖体系结构的代码(Arch)
为实现更高效率的操作,Linux需要发挥不同体系结构的优点,在./linux/arch子目录中定义了内核源代码中依赖于体系结构的部分,包含了各种特定体系结构的子目录,例如典型桌面系统所使用的i386目录。每个子目录都包含了很多关注内核中某一个特定方面的目录,例如引导、内核、内存管理等。
转载:
《安卓底层开发实战》-周国庆老师的书
网友评论