您现在的位置: 主页 > 嵌入式相关 > 【连载】嵌入式Linux开发教程:Linux内核
本文所属标签:
#Linux内核#   
为本文创立个标签吧:

【连载】嵌入式Linux开发教程:Linux内核

来源:网络整理 网络用户发布,如有版权联系网管删除 2018-07-10 

摘要:与单纯的硬件开发或软件开发有所不同,嵌入式Linux系统在研发过程中通常都要涉及到硬件和软件两个环节。我们将开始每周连载由周立功编著的《嵌入式Linux开发教程》,供所有开发者阅读。

1.1.3 内核版本号

Linux内核版本由Linus所领导的内核开发小组控制,版本号有严格规定。

Linux内核版本号通常由3个数字组成,以2.6.28为例,2为主版本号,6为次版本号,28为修订号。次版本号为偶数则表示这是一个稳定版本,如2.6.17,为奇数则表示是一个开发版本,有可能是不稳定的,如2.5.6。

另外,还可能见到如2.6.27.8这样的版本号,末尾的.8表示这是2.6.27版本的第8个升级版本,也是可用的稳定版本。

1.1.4 组成部分

Linux内核由5个主要子系统组成,分别是:内存管理、进程管理、进程间通信、虚拟文件系统和网络,各子系统之间的关系如图 1.1所示。

GPL是GNU General Public License的缩写,非正式中文翻译为“GNU

图1.1 Linux内核组成部分

1. 进程管理

进程管理负责控制进程对CPU的访问,如任务的创建、调度和终止等。任务调度是进程管理最核心的工作,由Linux内核调度器来完成。Linux内核调度器根据一定算法来选择最值得运行的进程。

一个进程的可能状态有如下几种:

(1)运行态--已经获得了资源,并且进程正在被CPU执行。进程既可运行在内核态,也可运行在用户态。

内核态,内核和驱动所运行时的状态,程序处于特权阶级,能够访问系统的任何资源,好比社会的统治者。

用户态,用户程序运行的状态,处于非特权阶级,不能随意访问系统资源,必须通过驱动程序方可访问,用户态程序可通过系统调用进入内核态。用户态程序有如社会的被统治者,处于被管理的非特权阶级,只有通过某种途径才能进入特权阶级。

(2)就绪态--当系统资源已经可用,但由于前一个进程还没有执行完而释放CPU,准备进入运行状态。

(3)可中断睡眠状态--当进程处于可中断等待状态时,系统不会调度该程序执行。当系统产生一个中断或者释放了进程正在等待的资源,或者进程收到一个信号,都可以被唤醒进入就绪状态或者运行态。

(4)不可中断睡眠状态--处于中断等待状态,但是该进程只能被使用wake_up()函数明确唤醒的时候才可进入就绪状态。

(5)暂停状态--当进程收到SIGSTOP、SIGSTP、SIGTTIN或者SIGTTOU就会进入暂停状态,收到SIGCONT信号即可进入运行态。

(6)僵死态--进程已经停止运行,但是其父进程还没有询问其状态。

各状态之间的转换关系和转换条件如图 1.2所示。

图1.2 Linux进程状态和转换

进程和状态的转换有点抽象,用生活中一个比较接近的例子类比一下,或许能有助于理解。Linux内核调度器好比是生产线的主管,而进程则好比是生产线上的工人。主管24小时不间断的工作,工人的工作时间是朝九晚五,其余时间在等待区排队等候。

早上工人到达工厂,还没到9点上班时间,工人可以在等待区休息,这个状态可以称之为“就绪态”;但是9点一到,工人则必须上生产线工作,这个工作状态可称之为“运行态”;下午5点一到,到了工人下班时间,工人离开生产线又回到等待区排队等候,处于“就绪态”。

如果工人上班的时候,收到主管的命令,说是“你暂时不用工作了,到休息室休息等待”,工人此时的这个状态,可以称之为“暂停”状态,过了一段时间,主管通知工人说是“休息结束,要准备工作了”,工人不能直接回生产线岗位,而是必须先到等待区排队等待,轮到后才上生产线工作。

如果有一天工人精神状态不好,向主管申请要睡觉休息,理由可以是“某种配件不到,我无法工作”,也可以是“我就是困了,想睡觉”,工人最后可能得到两种批准结果:一是主管批准了,但是附加了一个条件说“等我叫醒你,你必须醒来上班”,然后工人就去享受他的安稳觉了,工人进入“不可中断睡眠”状态;另一种是主管也批准了,但是附加了另一个条件,说“在你睡觉的时候,如果配件到了,你就得立马给我起来上班”,工人也去睡觉去了,但此时工人睡得并不安心,因为这不是一个安稳觉,是“可中断睡眠”。无论工人睡得是安稳觉,还是不安稳觉,醒来都不能直接上生产线,而是回到等待区,等待轮值。

还有一种情况,工人干完活到点下班了,但主管对他不闻不问,也不安排新的工作,这是一种非正常状况,工人进入了“僵死态”。

2. 内存管理

内存管理的主要作用是控制和管理多个进程,使之能够安全的共享主内存区域。当CPU提供内存管理单元(MMU)时,内存管理为各进程实现虚拟地址到内存物理地址的转换。在32位系统上,Linux内核将4G空间分为1G内核空间(3~4G)和3G(0~3G)用户空间,通过内存管理,每个进程都可以使用3G的用户空间。

3. 文件系统

Linux内核支持众多的逻辑文件系统,如Ext2、Ext3、Ext4、btrfs、NFS、VFAT等。VFS则是Linux基于各种逻辑文件系统抽象出的一种内存中的文件系统,隐藏了各种硬件设备细节,为用户提供统一的操作接口,是用户访问各种不同文件系统和设备时,不用区分具体的逻辑文件系统。例如,Linux下硬盘上使用的文件系统通常是Ext3/4格式,而U盘通常是FAT32格式,但是用户在使用中根本感觉不到差异,也不用区分文件系统的具体差别。

4. 网络接口

Linux对网络支持相当完善,网络接口提供了对各种网络标准的存取和各种网络硬件的支持,接口可分为网络协议和网络驱动程序。网络协议部分负责实现每一种可能的网络传输协议。网络设备驱动程序负责与硬件设备通讯,每一种可能的硬件设备都有相应的设备驱动程序。

5. 进程间通信

支持进程间各种通信机制,如管道、命名管道、信号、消息队列、内存共享、信号量和套接字等。

管道通常用于具有亲缘关系的父子进程或者兄弟进程间通信,是半双工的,数据只能往一个方向流动,先入先出,与自来水管很相似。如果双方互通时,需要建立两个管道。

命名管道则突破了进程间的亲缘关系限制,即非父子、兄弟进程之间也可相互通信。

信号是软件中断,用于在多个进程之间传递异步信号。日常生活中信号的例子很多了,如一对很亲密的哑巴情侣,在很多时候只需要一个简单的眼神,对方就能知道他(她)需要什么,并做出回应,这个眼神,就是一个“信号”。

信号能传递的信息有限,而消息队列则正好弥补了这点。例如情侣的一个眼神,对方可能能知道情侣的需求,但是如果情侣有一大堆需求,仅仅靠一个眼神就比较费力了。情侣就把自己的需求写在了一张纸条上,递交给对方,对方根据纸条的内容,逐一满足情侣的需求。

共享内存常用于不同进程间进行大量数据传递。Linux下每个进程都有自己的独立空间,各自都不能直接访问其它进程的空间。好比这对情侣都有自己的小金库,有时候需要给对方一部分钱用,但他们不能直接相互转账,必须先将前存到他们俩合开的一个公共账户上面,然后再使用。这个公共账户就是这对情侣的“共享内存”。

信号量用于进程同步。只有获得了信号量的进程才可以运行,没有获得信号量的进程则只能等待。就像十字路口的红绿灯,只有在绿灯亮(获得了绿灯)的时候才能通行,否则只能等待。

套接字(Socket)起源于BSD,也常称“BSD套接字”,用于多个进程间通信,可以基于文件,也可基于网络。Socket本意是“插座”,套接字设计就是通过某些参数设定,然后将一个“插座”与另外一个“插座”连接起来。可能还有点抽象,看一个例子可能就好理解了。把套接字理解为固定电话的插口,现在要打电话出去,必须要知道打给谁,往哪里打;另外电话另一端必须有人在听才可以通话,否则也不能打电话。

本文版权由致远电子所有,请勿转载



              查看评论 回复



嵌入式交流网主页 > 嵌入式相关 > 【连载】嵌入式Linux开发教程:Linux内核
 一个 状态 进程

"【连载】嵌入式Linux开发教程:Linux内核"的相关文章

网站地图

围观()