深入理解Linux内核3

来源:互联网 发布:淘宝卖家工具源码 编辑:程序博客网 时间:2024/06/03 22:48

Unix内核概述

Unix内核提供了应用程序可以运行的环境,因此,内核必须实现一组服务及相应的接口。应用程序使用这些接口而不会跟硬件资源直接交互。

- 进程/内核模式

  • 用户态和内核态
  • 进程是动态的实体,在系统内通常只有有限的生存期
  • 内核本身不是一个进程,而是进程的管理者
    -请求内核服务的进程使用系统调用
  • 除了用户进程,还有些称为内核线程的特权进程
    • 以内核态运行在内核地址空间
    • 不与用户交互,不需要终端设备
    • 通常系统创建时启动,然后一直处于活跃状态
  • 激活内核例程的几种方式
    • 系统调用
    • 正在执行进程的CPU发出一个异常信号
    • 外围设备向CPU发出一个中断信号
    • 内核线程被执行

进程实现

  • 每个进程有一个进程描述符(包含有关进程的当前状态的信息)
  • 当内核暂停一个进程执行时,把几个相关处理器寄存器保存在进程描述符中

    • 程序计数器PC,栈指针sp寄存器
    • 通用寄存器
    • 浮点寄存器
    • 包含CPU状态信息的处理器控制寄存器(处理器状态字)
    • 跟踪进程对RAM访问的内存管理寄存器
  • 内核恢复一个进程执行时,用进程描述符中的合适字段装载CPU寄存器

  • 等待状态可能会有很多,有进程描述符队列实现、

可重入内核

  • 所有Unix内核都是可重入的(若干个进程可以同时在内核态下执行)
  • 可重入的一种方式是编写函数,至修改局部变量
  • 内核也可以包含非重入函数,利用锁机制来保证有且只有一个进程执行非重入函数
  • 内核控制路径(指令序列)
  • 内核控制路径交错执行

进程地址空间

  • 每个进程运行在自己的私有地址空间
  • 用户态下涉及私有栈、数据区和代码区
  • 内核态下,进程访问内核的数据区和代码区,但使用另外的私有栈
  • 每个内核路径都引用自己的私有内核栈
  • 有时候也会共享部分地址空间

    同步和临界区

  • 一致性状态

  • 抢占式和非抢占式内核
  • 禁止中断
  • 信号量

    • 组成:一个整数变量、一个等待进程的链表和两个原子方法(down()和up())。
  • 自旋锁(检查信号量耗时多,对于时间较短的操作较低效)

    • 跟信号量很相似
    • 但是没有进程链表
    • 但处理器环境下无效
  • 避免死锁

信号和进程间通信

  • 信号量
  • 消息队列
  • 共享内存
  • IPC资源是持久不变的

进程管理

  • fork()和_exit()系统调用分别创建一个新进程和终止一个进程
  • exec()类系统调用装入一个新程序
  • fork()的进程是父进程,而新进程是它的子进程。
  • 父子进程可以互相找到对方
  • 每个进程的数据结构中有两个指针,一个指向父,一个指向子
  • 写时复制技术

僵死进程

  • 父进程等待子进程结束,wait4()系统调用
  • init的特殊系统进程,系统初始化时创建
  • 当一个进程终止时,内核改变它的所有子进程的进程描述符指针,成为init的孩子

进程组和登录会话

  • 进程组(作业的抽象)
  • 登录会话通常是shell进程为用户创建的第一条命令
  • 一个登录会话可以让几个进程组同时处于活动状态
  • bg和fg命令的使用

内存管理

重点
- 虚拟内存
- 随机访问存储器RAM的使用
- 内核内存分配器KMA
- 进程虚拟地址空间处理,调页分配策略
- 高速缓存
- 设备驱动程序

原创粉丝点击