【操作系统内核】进程
进程的组成
进程的运行,需要考虑 磁盘 => 内存 => CPU => 内核 => 进程切换
这个过程
- 首先,程序运行要将可执行文件加载到内存,所以进程要读取可执行文件(运行后可能还需要读取其他文件的数据),需要知道:
① 文件系统的信息,fs_struct
② 打开的文件的信息,files_struct

- 其次,进程要访问内存,Linux要求它有一块自己的虚拟地址空间,所以进程中需要有一个
mm_struct
实例:
① vm_area_struct:内存映射,如mmp
② 页表:pgd存储页表目录的地址

- 程序加载到内存后,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
④ 标志寄存器

- 每个进程都在运行在用户态和内核态,为实现CPU的上下文切换,每个进程都应该有:
① 一个用户栈
② 一个内核栈
进程的运行流程,无非就是函数链的调用,每调用一次函数,就把函数压栈;但是有一个特殊情况,就是用户态的函数调内核态的函数,如用户态函数c()调用内核态函数d(),将发生第一次CPU上下文切换
此时,内核需要将用户态的信息(通过pt_regs这个结构保存)保存到内核态的函数栈的底端,包含: