LINUX内核源码:基础知识1

内核介绍

在Unix系统中,多个并发进程负责不同的任务。每个进程都需要系统资源,可能是CPU、内存、网络连接或其他资源。内核是一大块负责处理所有系统资源的可执行代码。虽然不同内核任务之间的区别并不总是很明显,但是内核的角色可以被划分(如图1-1所示)为以下几个部分:
在这里插入图片描述

  • 进程管理
    内核负责创建和销毁进程,并处理它们与外部世界的连接(输入和输出)。不同进程之间的通信(通过信号、管道或进程间通信原语)是整个系统功能的基础,也由内核处理。此外,调度程序是进程管理的一部分,它控制进程如何共享CPU。更一般地说,内核的进程管理活动在单个或几个CPU上实现多个进程的抽象。

  • 内存管理
    计算机的内存是一项主要资源,用于处理内存的策略对系统性能至关重要。内核在有限的可用资源之上为任何和所有进程建立一个虚拟的寻址空间。内核的不同部分通过一组函数调用与内存管理子系统交互,从简单的mallocl/free对到更复杂的功能。

  • 文件系统
    Unix在很大程度上基于文件系统概念:Unix中的几乎所有东西都可以被视为文件。内核在非结构化硬件之上构建结构化的文件系统,由此产生的文件抽象在整个系统中被大量使用。此外,Linux支持多种文件系统类型,即在物理介质上组织数据的不同方式。例如,磁盘可以用linux标准的ext3文件系统、常用的FAT文件系统或其他几种文件系统进行格式化。

  • 设备控制
    几乎每个系统操作最终都映射到一个物理设备。除了处理器、内存和极少数其他实体之外,任何和所有的设备控制操作都是由特定于被寻址设备的代码执行的。这些代码被称为设备驱动程序。内核必须为系统上的每个外设,从硬盘驱动器到键盘和磁带驱动器,嵌入一个设备驱动程序。内核功能的这一方面是我们在本书中主要感兴趣的。

  • 网络
    网络必须由操作系统管理,因为大多数网络操作不是特定于某个进程的:传入的数据包是异步事件在某个进程处理这些数据包之前,必须先对它们进行收集、识别和分派。系统负责在程序和网络接口之间传递数据包,它必须根据程序的网络活动来控制程序的执行。此外,所有的路由和地址解析问题都在内核中实现

可加载的模块

Linux的一个很好的特性是能够在运行时扩展内核提供的特性集。这意味着您可以在系统启动和运行时向内核添加功能(也可以删除功能)。每一段可以在运行时添加到内核的代码被称为一个模块。Linux内核提供了对许多不同类型(或类)模块的支持,包括但不限于设备驱动程序。每个模块都由目标代码(没有链接到完整的可执行文件中)组成,这些目标代码可以通过insmod程序动态链接到正在运行的内核,也可以通过rmmod程序解除链接。图1-1中模块的位置涵盖了最重要的类,但还远远不够完整,因为Linux中越来越多的功能正在被模块化。

设备和模块的类别

Linux看待设备的方式区分了三种基本的设备类型。每个模块通常实现其中一种类型,因此可分为字符模块、块模块或网络模块。这种将模块划分为不同类型或类的划分并不是严格的;程序员可以选择在单个代码块中构建实现不同驱动程序的巨大模块。尽管如此,通常为他们实现的每个新功能创建一个不同的模块,因为分解是可伸缩性和可扩展性的关键元素。
这三个类是:

  • 字符设备
    字符(char)设备是可以作为字节流(如文件)访问的设备;char驱动程序负责实现这种行为。这样的驱动程序通常至少实现了open, close, read和write系统调用。文本控制台(/dev/console)和串行端口(/dev/ttySO等)都是char设备的例子,因为它们很好地由流抽象表示。通过文件系统节点(如/dev/ttyi和/dev/lpo)访问Char设备。char设备和常规文件唯一相关的区别是,你总是可以在常规文件中来回移动,而大多数char设备只是数据通道,你只能按顺序访问。尽管如此,还是有一些char设备看起来像数据区,你可以在其中来回移动;例如,这通常适用于帧捕获器,其中应用程序可以使用mmap或Iseek访问整个获取的图像。
  • 块设备
    与char设备一样,块设备由/dev目录下的文件系统节点访问。块设备是一种可以承载文件系统的设备(例如,磁盘)。在大多数Unix系统中,块设备只能处理传输一个或多个完整块的I/O操作,这些块的长度通常为512字节(或更大的2次方)字节。相反,Linux允许应用程序像字符设备一样读写块设备——它允许一次传输任意数量的字节。因此,块设备和char设备的区别只在于内核内部管理数据的方式,因此在内核/驱动程序软件接口中。和char设备一样,每个块设备都是通过文件系统节点访问的,它们之间的区别对用户来说是透明的。与char驱动程序相比,块驱动程序与内核的接口完全不同。
  • 网络接口
    任何网络事务都是通过接口进行的,即能够与其他主机交换数据的设备。通常,接口是一个硬件设备,但也可能是一个纯软件设备,比如环回接口。网络接口负责发送和接收数据包,由内核的网络子系统驱动,而不知道单个事务如何映射到正在传输的实际数据包。许多网络连接(尤其是那些使用TCP的)都是面向流的,但是网络设备通常是围绕数据包的传输和接收来设计的。网络驱动程序对单个连接一无所知;它只处理数据包。

网络接口不是面向流的设备,因此不容易像/dev/tty1那样映射到文件系统中的节点。Unix提供接口访问的方式仍然是为接口分配一个唯一的名称(比如etho),但是这个名称在文件系统中没有相应的条目。内核和网络设备驱动程序之间的通信与使用char和块驱动程序的通信完全不同。内核调用的不是readl和write,而是与包传输相关的函数。

还有其他与上述设备类型正交的驱动模块分类方法。一般来说,对于给定类型的设备,某些类型的驱动程序与附加的内核支持函数层一起工作。例如,我们可以谈论通用串行总线(USB)模块、串行模块、Scsl模块等等。每个USB设备都由与USB子系统一起工作的USB模块驱动,但是设备本身在系统中显示为字符设备(例如USB串行端口)、块设备(USB存储卡读卡器)或网络设备(USB以太网接口)。其他类的设备驱动程序最近也被添加到内核中,包括FireWire驱动程序和l2o驱动程序。与处理USB和SCSI驱动程序的方式相同,内核开发人员收集类范围的特性并将它们导出给驱动程序实施者,以避免重复的工作和错误,从而简化和加强编写此类驱动程序的过程。除了设备驱动程序,其他的功能,包括硬件和软件,都在内核中被模块化了。

一个常见的例子是文件系统。文件系统类型决定了如何在块设备上组织信息,以表示目录和文件的树状结构。这样的实体不是设备驱动程序,因为没有明确的设备与信息放置的方式相关联;文件系统类型反而是一个软件驱动程序,因为它将低级数据结构映射到高级数据结构。是文件系统决定了文件名的长度以及每个文件的哪些信息存储在目录条目中。文件系统模块必须实现访问目录和文件的最低级别的系统调用,通过将文件名和路径(以及其他信息,如访问模式)映射到存储在数据块中的数据结构。这样的接口完全独立于实际的数据与磁盘(或其他介质)之间的传输,这是由块设备驱动程序完成的。

如果您考虑Unix系统对底层文件系统的依赖程度,就会意识到这样的软件概念对系统操作是至关重要的。解码文件系统信息的能力停留在内核层次结构的最底层,是最重要的;即使您为新的CD-RoM编写了一个块驱动程序,如果您不能在它所承载的数据上运行is或cp,那么它也是无用的。Linux支持文件系统模块的概念,它的软件接口声明了可以在文件系统索引节点、目录、文件和超级块上执行的不同操作。程序员实际上需要编写文件系统模块是相当不寻常的,因为官方内核已经包含了最重要的文件系统类型的代码。

  • 21
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值