根据教科书《操作系统概念第9》。进程的内存分为不同的部分。其中一个部分是数据部分。该书指出:
非正式地,如前所述,进程是正在执行的程序。进程不仅仅是程序代码,有时也称为文本部分。它还包括当前活动,由程序计数器的值和处理器寄存器的内容表示。
“当前活动”的确切含义是什么?这是否意味着进程的程序计数器和处理器寄存器的内容都存储在文本部分中?
根据教科书《操作系统概念第9》。进程的内存分为不同的部分。其中一个部分是数据部分。该书指出:
非正式地,如前所述,进程是正在执行的程序。进程不仅仅是程序代码,有时也称为文本部分。它还包括当前活动,由程序计数器的值和处理器寄存器的内容表示。
“当前活动”的确切含义是什么?这是否意味着进程的程序计数器和处理器寄存器的内容都存储在文本部分中?
可执行代码(文本部分)是只读的,因此它不能存储“当前活动”(进程)的任何变量值。
该语句表示进程状态包括程序计数器和寄存器;当进程处于活动状态时,它们不在内存中,它们在 CPU 中。当进程不活动时,它们会保存到内存中。
在 Linux 上编译的程序以称为ELF的二进制格式存储。有报告内容的实用程序;运行
nm -n -g
或readelf -l
在二进制文件上运行以了解这一点。程序内容根据它们的保护和初始化要求进行分组,因此内核可以在加载它们时强制执行只读页面并阻止初始化。您可以在Wikipedia 的“数据段”文章中找到对内存布局的描述;它省略了历史上与 Unix 中的代码一起保存在文本中的 rodata(只读数据)。
存储“当前活动”取决于 CPU 架构。Linux具有抢先调度。CPU 可以运行一个进程,接收一个中断,然后在下一个周期运行其他东西。CPU 本身在中断期间将最少量的上下文压入堆栈:程序计数器、处理器标志和错误代码。然后它跳转到内核中已在中断描述符表中预先配置的地址。
然后内核必须存储任何剩余的 CPU 寄存器和其他上下文,因为当它最终使用从中断返回指令重新启动时,它需要重建被中断进程的确切状态。您可以在此处阅读有关 Linux 中的中断处理的更多信息。