Chinaunix首页 | 论坛 | 博客
  • 博客访问: 356241
  • 博文数量: 197
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 303
  • 用 户 组: 普通用户
  • 注册时间: 2013-09-02 14:21
文章分类

全部博文(197)

文章存档

2014年(89)

2013年(108)

我的朋友

分类: LINUX

2013-11-14 17:59:44

1. 进程的模型

进程是现代操作系统中的一个重要的概念,引入进程的目的就是让操作系统能有序的执行多个任务,并各个任务互不干扰,还能有效的配合完成更加复杂的任务。

那么,我们应该首先了解什么是linux的进程。构成进程包含的资源很多,但是构成进程的最重要的包含了

4个要素:

1. 首先进程需要有可执行的一段代码,一般进程有在用户太运行的一段代码,这也是进程需要完成的任务。有的内核态线程,有一段在内核态执行的代码。

2. 其次,内核要有自己的地址空间映射,这也是程序运行的基础,也是保证各个进程会不干扰的基础。

3. 然后,进程需要有一个内核堆栈,这是用户态进程陷入内核执行内核系统调用的必要资源。

4. 还有,进程在内核中必须有相应的进程管理数据结构,用于进程的调度和管理工作。

Linux中进程的内存模型为下图所示。之前了解过linux虚拟内存管理的话,应该对这张图并不陌生,这张图表示一个linux进程在虚拟地址空间中各个部分的分布。这个示意图,形象的展示了进程可执行代码分布,和自己地址空间的结构。

memory-3.png

上文中提到了,进程必须拥有自己的内核堆栈,和进程管理数据结构。这两个要素如下图所示。内核为每个进程分配了一个4K的内核堆栈(也有可能是8K)。这个4K堆栈的高地址开始向下就是内核的栈空间,在4K的最小地址开始向上,有一个thread_info结构,该结构中task指针指向了task_struct机构,这个结构就是linux进程的管理数据结构。Task_struct结构体庞大,它记录了进程相关的很多数据和资源。

wps_clip_image-15613

Thread_info数据结构是一个和CPU体系结构相关的数据结构,其中ARM体系结构对thread info结构体的定义为

struct thread_info
{
    unsigned long        flags;        /* low level flags */ 
    int            preempt_count;    /* 0 => preemptable, <0 => bug */ 
    mm_segment_t        addr_limit;    /* address limit */ 
    struct task_struct    *task;        /* main task structure */ 
    struct exec_domain    *exec_domain;    /* execution domain */ 
    __u32            cpu;        /* cpu */ 
    __u32            cpu_domain;    /* cpu domain */ 
    struct cpu_context_save    cpu_context;    /* cpu context */ 
    __u32            syscall;    /* syscall number */ 
    __u8            used_cp[16];    /* thread used copro */ 
    unsigned long        tp_value;
    struct crunch_state    crunchstate;
    union fp_state        fpstate __attribute__((aligned(8)));
    union vfp_state        vfpstate;
#ifdef CONFIG_ARM_THUMBEE
    unsigned long        thumbee_state;    /* ThumbEE Handler Base register */ 
#endif 
    struct restart_block    restart_block;
};

除了上面说的进程的4个要素,实际上还有一个和进程相关的很重要的概念就是CPU现场!所谓CPU现场就是CPU发生中断,或者调度切换进程时CPU当时各个寄存器的状态。之所以说这个概念重要,是因为必须实现CPU现场的保存和恢复,才能完成进程的切换!对于ARM架构的内核来说,在内核态如果发生进程切换,被切换的进程将CPU现场保存在threa info结构的 struct cpu_context_save cpu_context变量中。而从用户态切换到内核态的时候,CPU现场保存在内核堆栈中。

阅读(1670) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~