我正在研究内核设计,我有一些关于分页的问题。
到目前为止,我的基本想法是:每个程序都有自己的(或者它认为的)4G 内存,减去我为程序可以调用的内核函数保留的部分。因此,操作系统需要找出某种方法来加载程序在运行期间需要使用的内存页面。
现在,假设我们有无限量的内存和处理器时间,我可以加载/分配程序写入或读取的任何页面,因为它使用不存在(或被换出)的页面的页面错误,因此操作系统可以快速分配或交换它们。但在现实世界中,我需要优化这个过程,这样我们就不会有一个程序不断消耗它曾经接触过的所有内存。
所以我想我的问题是,操作系统通常是如何解决这个问题的?我最初的想法是创建一个程序调用来设置/释放页面的函数,然后它可以自行管理内存,但是程序通常会这样做,还是编译器假设它有自由支配权?此外,编译器如何处理需要分配相当大的内存段的情况?我是否需要提供一个尝试按顺序给它 X 页的功能?
这显然不是一个特定于语言的问题,但我偏爱标准 C 并且擅长 C++,所以我希望任何代码示例都在那个或汇编中。(汇编应该不是必需的,我完全打算让它与尽可能多的 C 代码一起工作,并作为最后一步进行优化。)
另一件事也应该更容易回答:通常如何处理程序需要调用的内核函数?是否可以只拥有一个包含程序可以调用的大多数基本功能/进程特定内存的内存区域(我正在考虑虚拟空间的末尾)?我的想法是让内核函数做一些非常花哨的事情并在程序需要做任何重大事情时交换页面(这样程序就无法在自己的空间中看到敏感的内核函数),但我不是真的在这一点上专注于安全。
所以我想我更担心一般的设计理念而不是细节。我想让内核(以某种方式)与 GCC 完全兼容,并且我需要确保它提供了普通程序所需的一切。
感谢您的任何建议。