清华大学出版社 000000 TSINGHUA UNIVERSITY PRESS 进程虚拟空间又分为程序区P和控制区P1,其中P0 区用来放用户程序,也就是进程上下文中的正文段 代码。这个段的起始虚址为0,且可以动态地向高 地址方向增长。P1区容纳各种方式的栈以及存放受 保护的进程专用代码和数据,P区从231-1单元开 始向低地址方向增长。进程空间基本结构如图66。 在图66中,核心态栈( kernal stack)是该进程执行 核心程序时,保留的核心栈副本。该栈中装有进程 调用核心函数时用到的有关参数等,另外,还包括 系统调用的调用序列。设置核心栈的目的是使进程 在执行了不同调用顺序的核心函数之后,仍能返回 到原来的用户态下执行。核心栈具有多个层次,其 中每层可保留一次调用或中断处理后,返回被中断 程序处继续执行所必需的有关寄存器的值
进程虚拟空间又分为程序区P0和控制区P1,其中P0 区用来放用户程序,也就是进程上下文中的正文段 代码。这个段的起始虚址为0 ,且可以动态地向高 地址方向增长。P1区容纳各种方式的栈以及存放受 保护的进程专用代码和数据,P1区从2 31 -1 单元开 始向低地址方向增长。进程空间基本结构如图6.6。 在图6.6中,核心态栈(kernal stack)是该进程执行 核心程序时,保留的核心栈副本。该栈中装有进程 调用核心函数时用到的有关参数等,另外,还包括 系统调用的调用序列。设置核心栈的目的是使进程 在执行了不同调用顺序的核心函数之后,仍能返回 到原来的用户态下执行。核心栈具有多个层次,其 中每层可保留一次调用或中断处理后,返回被中断 程序处继续执行所必需的有关寄存器的值
清华大学出版社 000000 TSINGHUA UNIVERSITY PRESS 0 用户程序 Po(用户)区 用户态栈 P1(控制)区 核心态栈 进程专用代码和数据 图66进程空间结构
图6.6 进程空间结构
清华大学出版社 000000 TSINGHUA UNIVERSITY PRESS 用户栈含有在用户态下执行时函数调用的参数、局 部变量及其他数据。图67给出了执行c0py程序时 用户栈和核心栈的变化例。图6.7的左侧描述了当 由main(argc;argy)过程调用copy(od,new),过程 copy(old,new)更进一步调用库函数wrte0来调用 writ的内部结构。系统调用使用专门的陷阱指令 trap,执行trap指令将产生一个中断,使得进程的 执行模式由用户态转换为核心态。 然后,用户态执行转变为核心程序执行,并使用核心 栈。 由于内核保护的原因,用户栈和核心栈之间不能互 相传递参数。因此,如果要把用户程序中的参数传 递给核心函数,必须通过通用寄存器和进程的PCB 结构
用户栈含有在用户态下执行时函数调用的参数、局 部变量及其他数据。图6.7给出了执行copy程序时 用户栈和核心栈的变化例。图6.7的左侧描述了当 由 main (argc,argv) 过程调用 copy (old,new),过程 copy (old,new) 更进一步调用库函数 write () 来调用 write 的内部结构。系统调用使用专门的陷阱指令 trap,执行trap指令将产生一个中断,使得进程的 执行模式由用户态转换为核心态。 然后,用户态执行转变为核心程序执行,并使用核心 栈。 由于内核保护的原因,用户栈和核心栈之间不能互 相传递参数。因此,如果要把用户程序中的参数传 递给核心函数,必须通过通用寄存器和进程的PCB 结构
清华大学出版社 000000 TSINGHUA UNIVERSITY PRESS 用户栈 核心栈 局部变量等 层2的返回地址 堆栈 层3调用」 增长方向 write() new write的参数buf count 局部变量等 层2调用」 层1的返回地址 copy() old eopy的参数new 局部变量等 局部变量等 层1调用 层1调用 层0的返回地址 内核功能1 匚功能1的返回地址 main() arge maIn 的参数argv trop指令 功能1的参数 图67执行copy程序时用户栈和核心栈的变化
图6.7 执行copy程序时用户栈和核心栈的变化
清华大学出版社 000000 TSINGHUA UNIVERSITY PRESS 进程空间的用户进程正文段、数据段、用户栈、核 心栈以及有关的专用代码和数据是以进程为单位独 立的。它们根据需要换进换出内存。 在系统虚拟空间部分存放的进程上下文部分是:系 统程序用页表、进程页表、proc结构、核心正文段 和数据段等。系统虚拟空间的内容常驻内存,不因 内存的大小或执行情况而换进换出。另外,由于核 心正文段和与它们有关的数据结构、系统页表是被 所有进程共享的,在UNIX系统中,不把它们看作 进程上下文的一部分
进程空间的用户进程正文段、数据段、用户栈、核 心栈以及有关的专用代码和数据是以进程为单位独 立的。它们根据需要换进换出内存。 在系统虚拟空间部分存放的进程上下文部分是:系 统程序用页表、进程页表、proc结构、核心正文段 和数据段等。系统虚拟空间的内容常驻内存,不因 内存的大小或执行情况而换进换出。另外,由于核 心正文段和与它们有关的数据结构、系统页表是被 所有进程共享的,在UNIX系统中,不把它们看作 进程上下文的一部分