【发布时间】:2011-12-11 19:37:46
【问题描述】:
我打算为英特尔 64 位架构编写自己的操作系统,我需要实现通用保护机制。我不会使用虚拟内存或分页,而是使用物理寻址。我还不知道如何准确地实现它,但我有一个大概的想法,它是这样的:
- 在启动时,内核将被加载,假设它会启动名为“filemanager”的第一个用户级进程,该进程将根据从另一个进程接收到的某些信号将一些数据保存到磁盘。
- 文件管理器将有一个代码段、一个堆栈段和一个数据段。
- 在正常操作期间,内核将启动另一个进程,该进程将从可用的物理内存堆中获取内存,并管理内核负责处理的内存。
- 让我们假设,“文件管理器”进程需要获得更多内存,因为它的数据段已满。它向内核发送一个系统调用以请求另一个数据段。内核将请求的内存块提供给它,该内存块物理上位于不同的位置,并且与第一段不连续。
现在的问题是,应用程序('filemanager')将如何处理 2 个段?因为据我了解,英特尔实施的一般保护机制只能检查存储在“DS”中的当前段的限制。但是对于文件管理器,我们现在有 2 个段。我是否必须在应用程序内手动从一个段切换到另一个段?编写这样的应用程序会很痛苦 因为你必须写这样的东西:
__asm('set DS register to the address and length of segment 1');
for (i=0;i<size_of_segment1;i++) {
segment1_data[i]= some_processing();
}
__asm('set DS register to the address and length of segment 2');
for (i=0;i<size_of_segment2;i++) {
segment2_data[i]= some_processing();
}
这仅适用于 2 个段,但假设应用程序必须向内核请求 1000 个或更多数据段,您如何实现通用保护机制以便开发人员可以快速轻松地进行编程?一种方法是修改 GCC,它必须在访问每个数据段之前插入汇编代码以将相应的数据段加载到 DS 寄存器中,但这看起来工作量很大。还有其他方法吗?
继续... 5.共享内存。假设另一个进程“编辑器”需要通过“文件管理器”进程保存一些数据。操作系统必须提供共享内存机制。 “editor”进程将请求内核添加“filemanager”进程的数据段。 'filemanager' 将确认请求,并且新段将被添加到编辑器的数据段列表中,以便它可以合法地写入它。同样的问题,我如何在“编辑器”内的多个段之间切换,它对应用程序是透明的,对整个系统来说是安全的?
注意:我不会在我的操作系统中使用分页,所有的内存寻址都是物理的,并且是 64 位模式。
【问题讨论】:
-
实现受保护内存的方式是通过虚拟内存。你为什么不想使用它?
标签: assembly operating-system x86 x86-64