http://linux.die.net/man/2/setup
我在手册页上找不到任何理由。
答案 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()"更多。但那时它有点意义。