CMU上的编程难题:如何找到堆栈底部的过程控制块wrt的位置

CMU上的编程难题:如何找到堆栈底部的过程控制块wrt的位置,c,process,C,Process,我在CMU读到了彼得·范·德·林登(Peter Van der Linden)的《专家C编程:深层C秘密》(Expert C programming:deep C secrets)一书中的编程难题 对程序进行编码以读取数字文件并打印平均值的难题。程序必须尽可能快地运行,并且必须用PASCAL或C编写程序 似乎一个程序员创造了一个程序,实际上只花了三秒钟。仔细检查后,发现程序员知道进程控制块相对于堆栈底部的存储位置。因此,他制作了一个指针来访问进程控制块,并用一个非常高的值重写了CPU时间。操作系

我在CMU读到了彼得·范·德·林登(Peter Van der Linden)的《专家C编程:深层C秘密》(Expert C programming:deep C secrets)一书中的编程难题

对程序进行编码以读取数字文件并打印平均值的难题。程序必须尽可能快地运行,并且必须用PASCAL或C编写程序

似乎一个程序员创造了一个程序,实际上只花了三秒钟。仔细检查后,发现程序员知道进程控制块相对于堆栈底部的存储位置。因此,他制作了一个指针来访问进程控制块,并用一个非常高的值重写了CPU时间。操作系统没有想到会有这么高的值,因此,在二者的互补方案下,它将这个高正值视为负数

现在,我想知道他是怎么做到的。我知道使用这段代码我们可以找到堆栈的基址

int main()
{
  int i;
  printf("The base value of the stack is %#d", &i);
  return 0;
}
我可以理解堆栈向下扩展,堆栈的底部将位于物理内存的顶部。因此,堆栈的底部将低于系统内存内核内存/内核地址空间。所以,他用堆栈作为基础。但是他怎么知道进程控制块存储在系统内存中的什么位置呢。 此外,过程控制块的结构是什么


有人知道这件事吗。

我不认为这是直截了当的今天,虚拟内存和我所有的猜测;我不知道这本书是什么时候写的


我的建议是读一读这部经典作品来做一个介绍。如果这些概念对您来说是新概念,那么您将非常快地阅读它并学习一些真正重要的东西。

在某些实现中,*nix将用户结构映射到用户空间内存中,堆栈就在其中,这一点过去是正确的。如今,这几乎不可能实现。
有点相关:

现代操作系统不再以这种方式工作。