为什么设置系统调用不能被任何用户调用?

时间:2015-09-21 10:46:40

标签: kernel system-calls

http://linux.die.net/man/2/setup

我在手册页上找不到任何理由。

1 个答案:

答案 0 :(得分:3)

首先,系统调用不再存在:

  

自Linux 2.1.121以来,不再存在此类功能。

从我在2.1.120中看到的内容中,它在内核的init中使用(事实上它具有系统调用号0)。它只被调用了两次:第一次调用释放了初始内存(来自initram),第二次调用设置了设备,文件系统并挂载了根。很明显,如果一个程序可以运行系统调用(它会导致分段违规或其他坏事),那就太糟糕了。

为什么它首先是一个系统调用是个好问题。为此,我下载了1.0.0,然后即使,init也没有使用系统调用(这是我第一次猜测它为什么是系统调用)。即使在0.01中,这只在内核中使用。由于int 0x80没有使用,我对Linus为何这样做感到困惑。

我刚发送电子邮件给Linus& LKML并在IRC上询问(尽管除了Linus之外的任何人都不太可能知道,并且他很忙于回复有关Linux线粒体DNA的电子邮件)。

编辑:好的,所以进一步研究一下,事实证明内核实际上是从进程上下文中调用它(setup调用实际上充当了系统调用,int 0x80和所有)。内核的初始化不是在进程上下文中完成的,而是(according to Linus):

  

因此代码实际上进入了用户空间,但非常初始用户   实际上,空间与内核共享(直到第一个fork())。我们   只需切换到用户即可完成初始用户模式转换   段[...]所以在init / main.c中,神奇的是

move_to_user_mode();
if (!fork()) {          /* we count on this going ok */
        init();
}
for(;;) pause();        /* [this is the idle task] */
  

其中" move_to_user_mode()"将重新加载所有细分(一些   通过做一个" iret")来获得CS / SS。所以第一个fork()会   实际上是在用户空间中完成的,在此之前就发生了内核   无法入睡(因为没有空闲任务)。 [...]所以"设置()"是一个   系统调用,因为它需要睡眠(做IO)和内核   在它进入用户模式和第一个叉子之前无法入睡。

     

这可能做得与众不同吗?当然。显然我们不这样做   那样,我们分开创建空闲任务而不是   用" fork()"更多。但那时它有点意义。