Unix 进程基本信息


内容来源:《Unix内核源码剖析》

一、程序执行流程

  • 为程序建立 #进程 并分配内存
  • 将程序从磁盘读入内存
  • 进程使用独立的虚拟地址控制,这就需要用到[[MMU控制器]]进行转换
    请添加图片描述

二、进程的执行状态

  • #用户模式 对应用户进程

  • #内核模式 对应内核进程

  • CPU通过 #PSW 改变运行模式

  • 模式切换时映射到 #虚拟地址 的物理内存区域也随之切换,通过 #MMU 实现
    请添加图片描述

  • 关于限制内存访问地址

    • 用户进程无法加载内核进程的内存空间,因此也无法执行内核所能实现的功能
    • 限制原因:内核提供的功能对系统影响很大(如涉及硬件操作),必须严加限制
    • 用户进程为了访问内核功能必须通过 #系统调用 实现
    • 处理器变化:用户模式-》内核模式-》用户模式

三、进程信息记录

  • 记录进程状态信息和控制信息等
  • 每个进程会分配一组proc和user结构体

3.1 proc结构体

  • 来自哪里?(proc.h)
    • 数组proc[]中的每个元素分别对应一个进程
    • 相当于用这个数组串起进程信息,后续遍历查询,选择下一个执行的程序
  • proc[]长度多少?(param.h)
    • proc[] 的 长度 决定了 在 系统 中 可以 同时 存在 的 进程 上限。长度 由 常量 NPROC 定义。
  • 为何常驻内存?
    • #proc结构体 管理者进程的状体、执行优先级的进程相关的经常被内核访问的信息,放在内存中加快访问速度

3.2 user结构体

  • 用于管理进程打开的文件或目录等信息
  • 当进程被换出到内存空间时,对应的user结构体也被移出内存

四、内存分配

  • 进程通过虚拟地址访问被分配的物理内存

4.1 代码段

  • 该段为只读的,存放程序指令的机器代码
  • 会不会被共享?
    • 某个进程被同时执行多次时,各进程共享一个代码段
  • 代码段如何管理?

4.2 数据段

  • 用于存放程序使用的变量数据

  • 是否会被共享?

    • 不共享,各个进程独立
      请添加图片描述
  • 数据 段的物理地址和长度分别由proc. p_ addrproc. p_ size 表示。

  • 内核栈区:

    • 内核模式处理时的临时工作区
    • USIZE在(param.h)中定义
  • 数据区域:

    • 存放全局变量或 #bss 等静态变量
    • 进程动态管理内存的堆(相当于提前为进程分配静态变量,运行时动态管理)
    • 什么是扩展堆区?(从虚拟地址的低位向高位方向进行)
  • 栈区域;

    • 暂时存放函数的参数、局部数据
    • 长度根据需要自动扩展(从虚拟地址的最高位向低位方向进行)

4.3 虚拟地址空间

虚拟地址空间 16bit虚拟地址 64kb容量
物理地址空间 18bit物理地址 256kb容量

进程的虚拟地址空间:
在这里插入图片描述

  • 代码段在最低地址
  • 数据区在8kb为边界对齐
  • 栈区在最高地址
  • 数据区域和栈区中间为生长区域

虚拟地址空间在不同进程中的体现:
请添加图片描述

  • 代码段可以共用(需要时)(代码段运行时只读的)
  • 数据段相互独立

为何使用虚拟地址?

  • 程序能自定地址点,不受物理内存限制(开发人员不用考虑底层问题)
  • 便于实现对内存的访问
  • 限制越界访问(MMU触发异常)
  • 提高内存使用效率

Unix V6的虚拟地址与物理内存的对应关系?

  • 代码段和数据段本身与连续的物理内存区域相对应
  • 进程被分配了代码段及数据段的两个连续的物理内存区域
  • 未进行将细小的物理内存区域的集合映射为连续的虚拟地址区域的处理。

4.4 交换地址

  • MMU通过APR寄存器将虚拟地址转化为物理地址

APR构成

请添加图片描述

  • PAR
bit 11~0
含义 基地址
  • PDR
bit 14~8 6 3 2~1
含义 页内块的数量 更新标志 == 1时按高位向低位方向分配 页的访问控制方法;01只读、11读写、00未分配

APR数量

请添加图片描述

  • PDP-1/40拥有两套APR
    通过PSW切换当前模式,可以在硬件MMU上切换APR,进而切换虚拟地址空间
  • APR共八组,0到7编号,1组APR对应1页

APR切换

  • 内核将进程使用的APR设定适当的值以保证各进程拥有独立的虚拟空间
  • 用户进程APR的值保存在user结构体中,当进程执行时读取值到用户进程用APR中

虚拟地址说明:
请添加图片描述

  • 高3bit对应页(APR)

如何通过变量u(0140000)访问user结构体?

  • 内核对供内核使用的APR做了相应的设定
  • 编号为6的PAR设为执行进程的数据段的物理地址
    请添加图片描述
  • u指向内核空间第六页的起始位置

相关推荐

  1. uni-app基本标签

    2024-04-28 17:52:02       34 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-28 17:52:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-28 17:52:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-28 17:52:02       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-28 17:52:02       20 阅读

热门阅读

  1. ssh -t 命令使用

    2024-04-28 17:52:02       14 阅读
  2. SSH ControlMaster功能

    2024-04-28 17:52:02       11 阅读
  3. 在ubuntu20上编译bcc时遇到:Could NOT find LibDebuginfod

    2024-04-28 17:52:02       11 阅读
  4. mysql数据库开发军规

    2024-04-28 17:52:02       13 阅读
  5. 朱元璋逆袭史:从流浪行僧到大明雄主

    2024-04-28 17:52:02       13 阅读
  6. Nest.js项目初始配置

    2024-04-28 17:52:02       15 阅读
  7. Redis(四) 主从、哨兵、集群环境搭建

    2024-04-28 17:52:02       12 阅读
  8. 【spring mvc】配置请求到视图名称转换器

    2024-04-28 17:52:02       10 阅读