Chinaunix首页 | 论坛 | 博客
  • 博客访问: 551749
  • 博文数量: 156
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1183
  • 用 户 组: 普通用户
  • 注册时间: 2013-11-22 11:42
文章分类

全部博文(156)

文章存档

2015年(67)

2014年(89)

分类: 嵌入式

2014-10-30 10:27:18

原文地址:嵌入式,进程简析 作者:一生有你llx

进程,资源分配的最小单位。线程,度的最小单位
进程四要素:有一段程序可供执行,有专用的内核空间堆栈,有一个task_struct数据结构(进程控制块),有独立的用户空间
有用户空间:用户线程。无用户空间:内核线程
task_struct结构:
                               pid_t  pid                               进程号
进程状态:
                               TASK_RUNNING                   执行或就绪状态
                               TASK_INTERRUPTIBLE       可中断阻塞,等待资源唤醒,或中断唤醒
                               TASK_UNINTERRUPTIBLE   不可中断阻塞,不能被中断或信号唤醒
                               TASK_STOPPED                  终止状态,接收到SIGSTIOP/SIGTSTP进入该状态,接收到SIGCONT后唤醒
                               TASK_KILLABLE                   不可中断睡眠,可被SIGKILL唤醒
                               TASK_TRACED                    调试状态
                               TASK_DEAD                         进程退出
                               EXIT_ZOMBIE                       僵死状态,进程已死亡,但父进程还没收集到结束信息
                               EXIT_DEAD                           最终死亡状态,资源被回收
进程描述:struct mm_srtuct *mm          进程用户空间描述指针,内核线程该指针为空
                 unsigned int  policy              进程调度策略
                 int prio                                  优先级,数值越大优先级越小。
                 int static_prio                        静态优先级
                 struct  sched_rt_entity  rt      时间片

调度:从就绪的进程中选出最适合的一个来执行。调度策略,调度时机,调度步骤
调度方式:主动式,内核直接调用schedule(),进程需要等待资源,主动要求系统调度
                 抢占式,用户抢占(2.4和2.6内核)  从内核空间返回用户空间时,发生用户抢占
                               内核抢占(2.6内核)
在支持内核抢占的系统中,有下列情况不可抢占
       内核正在进行中断处理,内核正在进行中断上下文处理,进程持有spinlock自旋锁、以及读写锁,内核正在执行调度
抢占式内核使用变量preempt_count,称为内核抢占计数,他设置在进程的thread_info结构中,内核进入以让状态后preempt_count会加1,退出后会减1
调度流程:清理当前进程,选出下一个进程,设置新进程运行环境,进程上细纹切换

系统调用:一般情况下用户进程不能访问内核空间的,系统调用除外。linux还提供了一些库函数来对系统调用进行封装
系统调用工作原理;应用程序将一个适当的值填人寄存器,然后调用一个特殊指令跳转到内核某一固定位置,内核根据填充的数据来调用函数
适当的值:在unist.h中为每一个系统调用设一个编号,系统调用号
特殊的指令:在intel中由中断0x80实现,ARM中由SWI实现
固定的位置;在ARM体系中,应用程序跳转到固定内核位置ENTRY(vector_swi)
相应的函数:根据系统调用号,从系统调用表sys_call_table找到对应函数

增加系统调用
       添加新的内核函数
       更新头文件unist.h
       更新系统调用表calls.s
阅读(356) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~