【问题标题】:Exit from an application in an OS without memory separation在没有内存分离的情况下退出操作系统中的应用程序
【发布时间】:2014-11-06 02:38:46
【问题描述】:

我正在编写一个单一的操作系统(称它为操作系统是一个笑话,但它确实有非常少的学校级功能主义者)。 当我说单体时,我的意思是,它被编译为单个二进制 blob,不支持文件系统等。目前我只有一个基本的简单用户空间,它只不过是无限的 while 循环。

我计划让我的操作系统更有用,并希望能够编写可以像成熟操作系统上的常规应用程序一样终止的用户应用程序。

我没有 glibc 或同等版本。我当前在用户空间中的库是我编写的代码。 现在我的问题是如何为用户空间应用程序添加一个框架,让它们在一个固定点终止。

我确实知道程序是如何在常规系统上编译的,以及程序终止时会发生什么。但是,在我的情况下,我没有奢侈地针对库编译程序,如果程序终止,那么我的指令指针只会绕道而行。

目前我正在制作所有应用程序来执行“返回调用”,并且我正在使用修复地址(在启动期间)预先填充应用程序堆栈。 有没有更好的方法来处理这个问题?

除了答案之外,我非常乐意了解一些操作系统概念。

我正在使用 x86 模拟器平台并静态编译我的二进制文件。 (我确实有虚拟内存支持)

【问题讨论】:

  • 我很确定早期版本的 Linux 也是个笑话。不要这么快自我贬低:-)
  • 您是在询问应用堆栈的特定问题,还是询问其他问题?
  • 我在询问有关在固定地址中终止应用程序的解决方案。目前我已经采取了一条路线,其中每个应用程序都有一个固定的返回地址,我将其填充到堆栈中。现在,我正在寻找更好的解决方案。

标签: c operating-system kernel


【解决方案1】:

手工制作第一个堆栈帧并返回到您需要运行的任何进程清理代码似乎是一种非常合理的方法。如果您的操作系统有“系统调用”,那么用户空间进程清理代码(可能称为exit())可能以调用_exit() 系统调用结束。您仍然需要处理程序尝试在“la-la land”中执行代码的情况,因为这种情况仍然可能发生(但是在您拥有页面保护系统之前这样做可能是一个难题)。

【讨论】:

  • 是的,我目前的解决方案与您提到的完全一样。我的每个应用程序确实返回到一个固定地址,并且它降落在一个相当于退出的例程中。然后我去进行系统调用并为该应用程序进行必要的用户空间和内核空间清理。但是,我不能有一个不返回的应用程序。(x86 领域的“ret call”)。我正在尝试通过一些骇客来实现这一目标。
  • 您可以拥有几乎不会在所有操作系统中返回的应用:int main(void) { do {} while(1); }
  • 哦,可能是我的措辞不对。我不能有这样的应用程序 void main(void){int j = 2;}。随着这个应用程序的退出进入 La La Land。然而 int main(void){int j=2; return;} 不会引起任何问题,因为它有一个 return 语句,可以让我进入清理例程。
  • 在其他系统中,main 并不是你程序的真正入口点——本质上是一个像:void REAL_MAIN() { int v = main(argc, argv);exit(v); 这样的 blob; }` 已链接到您的代码中。
猜你喜欢
  • 1970-01-01
  • 2010-10-26
  • 2017-04-17
  • 1970-01-01
  • 1970-01-01
  • 2014-04-14
  • 1970-01-01
  • 2012-04-16
  • 2022-10-07
相关资源
最近更新 更多