【操作系统内核】进程

本文详细解析了操作系统内核中的进程构成,涉及进程的运行机制,包括内存管理、CPU上下文切换、调度信息、进程数据结构(如task_struct)以及进程的创建和执行流程。重点介绍了进程在用户态和内核态的切换、虚拟地址空间和内核栈的管理,以及exec()函数的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【操作系统内核】进程

进程的组成

进程的运行,需要考虑 磁盘 => 内存 => CPU => 内核 => 进程切换 这个过程

  1. 首先,程序运行要将可执行文件加载到内存,所以进程要读取可执行文件(运行后可能还需要读取其他文件的数据),需要知道:

① 文件系统的信息,fs_struct

② 打开的文件的信息,files_struct

20230805102419
  1. 其次,进程要访问内存,Linux要求它有一块自己的虚拟地址空间,所以进程中需要有一个mm_struct实例:

① vm_area_struct:内存映射,如mmp

② 页表:pgd存储页表目录的地址

20230805101045
  1. 程序加载到内存后,CPU需要知道下一条执行指令的内存地址,这个内存地址存储在CPU的程序计数器中; 此外,进程还需要其他,CPU寄存器的值,也就是CPU上下文(也称为CPU的硬件上下文),包括:

① 指令指针寄存器 (eip/rip): 存储进程的下一条指令

② 通用寄存器
eax、ebx、ecx、edx、esp、ebp、esi、edi(32位)
rax、rbx、rcx、rdx、rsp、rbp、rsi、rdi(64位)

③ 段寄存器
cs、ds、ss、es、fs、gs

④ 标志寄存器

20230805102602
  1. 每个进程都在运行在用户态和内核态,为实现CPU的上下文切换,每个进程都应该有:

① 一个用户栈

② 一个内核栈

进程的运行流程,无非就是函数链的调用,每调用一次函数,就把函数压栈;但是有一个特殊情况,就是用户态的函数调内核态的函数,如用户态函数c()调用内核态函数d(),将发生第一次CPU上下文切换

此时,内核需要将用户态的信息(通过pt_regs这个结构保存)保存到内核态的函数栈的底端,包含:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值