Linux系统简介

上一篇 / 下一篇  2006-12-13 18:08:11

嵌入式Linux的版本
实时Linux(RT Linux)
RT Linux是美国新墨西哥州大学计算机系研制开发的。它在底层实现了添加Linux实时特性支持。RT Linux在通常的Linux内核的下层实现了一个简单的实时内核,而通常的linux把这个实时内核作为优先级最低的任务,但所有实时任务的优先级都应高于Linux本身以及Linux下的一般任务。经过加入实时处理后,RT Linux就完全能够达到硬实时系统的性能指标。

uClinux
uClinux是在Linux Kernel 2.0之后出现的一个Linux的变种,目标是将Linux应用于没有内存管理单元MMU (Memory Management Units)的处理器。由于uClinux是在Linux的基础之上添加了对没有MMU的微处理器的支持,所以它一方面继承了Linux的大部分优点,例如稳定性、各种网络协议栈的支持以及不同类型的文件系统支持等等;另一方面支持很多常用的嵌人式微控制器系统。

普通Linux
www.kernel.org
V2.4
V2.6
对进程调度进行了改进,软实时操作系统,并且支持无MMU的CPU

Arm Linux
http://www.arm.linux.org.uk/

PPC Linux
http://www.linuxppc.org

MIPS Linux
http://linuxmips.ichilton.co.uk

SH Linux
http://linuxsh.cjb.net


进程的基本概念
linux中每一个进程由一个task_struct结构描述,定义于 includelinuxsched.h.也就是PCB.其中包含了系统用来管理进程的所有信息:进程状态,调度信息(优先级),各种标识,IPC有关信息,时间和定时信息,文件系统西信息,VM信息,页面信息,环境context等. (宏内核)

一个进程包含两种结构:用户态下的数据和堆栈;内核态的堆栈和task_struct.task_struct和内核栈存放在一个8K大小的内存块中,其低地址存放task_struct,然后由高到低是内核态的堆栈。当一个进程在CPU上执行的时候,通过将当前堆栈指针低13位清0来得到指向当前进程task_struct的指针(因为内存块大小是8K,低13位清0就是该内存块的最低地址)。由current宏来实现,指向当前CPU上运行的进程的task_struct.

State 进程执行时它根据情况改变状态
Running 进程在运行 ( 是系统的当前进程 ) 或者准备运行(等待被安排到系统的一个 CPU 上) Waiting 进程在等待一个事件或资源。 Linux 区分两种类型的等待进程:可中断和不可中断的,可中断的等待进程可以被信号中断,而不可中断的等待进程直接等待硬件条件,不能被任何情况中断。
Stopped 进程停止了,通常是接收到了一个信号。正在调试的进程可以在停止状态。 Zombie 终止的进程。

进程的组织形式:linux中进程分为用户进程和内核线程,都有自己的task_struct.linux用以下几种方式来管理进程:

  a.进程链表:linux为每一种状态的进程都维护了一个双向链表,这样可以更方便管理。
  b.TASK_RUNNING状态链表:当内核要寻找一个新的进程在CPU上运行的时候,必须寻找能立即投入运行的进程,也就是TASK_RUNNING状态的进程。
  c.等待队列:等待队列同TASK_RUNNING队列不同,它有自己特殊的结构。等待队列表示一组睡眠的进程,当某个条件为真的时候由内核唤醒它们。
  d.task数组空闲表项的链表:当一个进程创建或撤消的时候,task数组必须被更新。线性的搜索太低效,内核就维护了一个非循环双向链表,包含 task数组中的空闲项。当创建一个进程的时候直接从这个链表取走第一个表项;当删除一个进程的时候将空闲表项加入链表的第一项。
  e.HASH表:在linux中的HASH表叫做pidhash,因为是由进程的PID映射的。它由PIDHASH_SZ个元素组成,表项是指向task_struc的指针。对于HASH的冲突,将各由冲突的表项连成双向链表。

其中a,e是针对系统中所有进程的,而b,c,d是将具有同一状态的进程组织起来。

Linux的进程调度
在linux中进程的优先级是动态的,调度程序跟踪并适时调整进程的优先级。在linux中进程是抢占式的,而内核是非抢占的(2.4内核)。

*所谓进程是抢占的也就是说如果有一个进程进入TASK_RUNNING状态,内核将检查它的优先级是否大于current的优先级,若大于,则 current被中断,并用调度程序选择一个进程运行(注意!不一定是刚刚那个TASK_RUNNING进程,但通常是这样)。当然,在一个进程时间片到期的时候也可以被抢占。
*所谓内核非抢占是说内核态下的进程不能被随意中断,以保证内核态进程数据的完整和有效。也避免了一些同步的问题。

linux所选择的进程调度算法将CPU时间划分为时期,在一个时期内,每一个进程有一个指定的时间片。通常每个进程的时间片不相等。当一个进程的时间片用完时,将被调度。在一个时期内进程也可以多次被调度,只要它的时间片还没有用完。当所有进程都用完他们的时间片的时候,这个时期结束。调度算法重新计算每个进程的时间片,开始一个新的时期。

那linux在什么情况下才进行调度呢?
1.进程状态的改变。例如RUNING->STOPPED。
2.当前进程时间片用完。
3.设备驱动程序。
4.进程丛中断,异常,系统调用返回的时候。
对于其中的1,进程要调用exit(),wait()等函数,这些函数自动调用调度程序;对于3,当驱动程序执行长而重复的任务时候直接调用调度程序。在每次反复循环中都由驱动程序检查need_resched的值,如果有必要就调用调度程序。。而对于2和4,由于都是从中断或调用返回,最终都要调用 ret_from_sys_call(),有这个函数进行判断,有必要就进行调度。

Linux的进程的切换
进程的切换主要包括地址空间的转换和上下文的切换。先说上下文切换
在操作系统课程中我们学过每一个进程的TSS段都保存了它的硬件上下文(hardwarecontext),当由中断触发进行进程切换的时候,CUP会自动将任务门中的段选择符装入TR寄存器,使TR指向新的TSS,完成任务切换。但由于硬件自动装入和切换会带来很多不必要的开销,所以linux选择了用软件来实现进程切换。TSS在linux中没有实际作用,只是在内核初始化的时候设置一个TSS,以后全部用这个TSS,只是通过更换其中的部分内容来切换进程。linux进程切换主要是通过切换每一个任务在TSS中的内核栈指针SS0和ESP0来实现的。具体的切换依赖于switch_to()这个宏

下面说地址空间的切换:主要由includeasm-i386Mmu_context.h
static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, struct task_struct *tsk, unsigned cpu)

当中断发生时也有上下文的切换,但是没有地址空间的切换。

Linux的进程的创建
在 Linux 系统中,没有一个进程是和其他进程完全无关的。系统中的每一个进程,除了初始的进程之外,都有一个父进程。新进程不是创建的,而是拷贝,或者说从前一个进程克隆的( cloned )。每一个进程的 task_struct 中都有指向它的父进程和兄弟进程(拥有相同的父进程的进程)以及它的子进程的的指针。在 Linux 系统中你可以用 pstree 命令看到正在运行的进程的家庭关系。
init(1)-+-crond(98)
|-emacs(387)
|-gpm(146)
|-inetd(110)
|-kerneld(18)
|-kflushd(2)
|-klogd(87)
|-kswapd(3)
|-login(160)---bash(192)---emacs(225)
|-lpd(121)

程序与进程
执行文件可以由许多格式甚至可以是一个脚本文件( script file )。脚本文件必须用合适的解释程序识别并运行。例如 /bin/sh 解释 shell script 。通常, Linux 支持的二进制文件是 a.out 和 ELF 。可执行文件不需要完全读入内存,而使用叫做 demand loading 的技术。当进程使用执行映像的一部分的时候它才被调入内存,未被使用的映像可以从内存中废弃。

ELF Shared Libraries ( ELF 共享库) 动态连接的映像,反过来,不包含运行所需的所有的代码和数据。其中一些放在共享库并在运行的时候连接到映像中。当运行时动态库连接到映像中的时候,动态连接程序( dynamic linker )也要使用 ELF 共享库的表。 Linux 使用几个动态连接程序, ld.so.1 , libc.so.1 和 ld-linux.so.1 ,都在 /lib 目录下.

Linux的内存管理,虚拟内存可以提供以下的功能:
>>       广阔的地址空间:系统的虚拟内存可以比系统的实际内存大很多倍。
>>       进程的保护:系统中的每一个进程都有自己的虚拟地址空间。这些虚拟地址空间是完全分开的,这样一个进程的运行不会影响其他进程。并且,硬件上的虚拟内存机制是被保护的,内存不能被写入,这样可以防止迷失的应用程序覆盖代码的数据。
>>       内存映射:内存映射用来把文件映射到进程的地址空间。在内存映射中,文件的内容直接连接到进程的虚拟地址空间。
>>       公平的物理内存分配:内存管理系统允许系统中每一个运行的进程都可以公平地得到系统的物理内存。
>>       共享虚拟内存:虽然虚拟内存允许进程拥有自己单独的虚拟地址空间,但有时可能会希望进程共享内存。

Linux的内存管理,内核空间和用户空间
linux内核采用了分段机制,使得虚拟地址和线性地址总是一致,因此,linux的虚拟地址空间为0-4G字节。Linux将这4G字节的空间分为两部分。将最高的1G字节(从0XC0000000到 0XFFFFFFFF),供内核使用,称为“内核空间”。而将较低的3G字节(从0X00000000到0XBFFFFFFF),供各个进程使用,称为 “用户空间”。因为每个进程可以通过系统调用进入内核,因此,linux内核由系统的所有进程共享。

Linux的内存管理,内核空间和用户空间
linux内核采用了分段机制,使得虚拟地址和线性地址总是一致,因此,linux的虚拟地址空间为0-4G字节。Linux将这4G字节的空间分为两部分。将最高的1G字节(从0XC0000000到 0XFFFFFFFF),供内核使用,称为“内核空间”。而将较低的3G字节(从0X00000000到0XBFFFFFFF),供各个进程使用,称为 “用户空间”。因为每个进程可以通过系统调用进入内核,因此,linux内核由系统的所有进程共享。

网络
The BSD Socket Interface ( BSD socket 接口)   这是一个通用的接口,不仅仅支持多种形式的联网,也是一种进程间通讯机制。一个 socket 描述了通讯连接的一端,两个通讯进程每一个都会有一个 socket ,描述它们之间通讯连接的自己部分。 Socket 可以想象成一种特殊形式的管道,但是和管道不同, socket 对于可以容纳的数据量没有限制。 Linux 支持几种类型的 socket ,这些类叫做 address families (地址族)。这是因为每一类都有自己通讯寻址方式。 UNIX Unix domain sockets,
INET The Internet address family supports communications via TCP/IP protocols
AX25 Amateur radio X25IPX Novell
IPXAPPLETALK
Appletalk DDP
X25 X25

TAG:

引用 删除 Guest   /   2008-09-04 14:36:28
引用 删除 Guest   /   2008-09-04 14:35:58
引用 删除 Guest   /   2008-09-04 14:15:13
-5
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

我的栏目

日历

« 2008-09-06  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 5283
  • 日志数: 13
  • 建立时间: 2006-12-13
  • 更新时间: 2008-02-18

RSS订阅

Open Toolbar