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