Kernel 为什么任何用户都不能调用setup syscall?

Kernel 为什么任何用户都不能调用setup syscall?,kernel,system-calls,Kernel,System Calls,我在手册页上找不到任何原因。首先,该系统调用不再存在: 由于Linux2.1.121,因此不再存在此类功能 从2.1.120中可以看到,它被用于内核的init中(实际上有syscall number0)。只调用了两次:第一次调用释放了初始内存(从initram中),第二次调用设置了设备、文件系统并装载了根目录。因此,如果一个程序可以运行系统调用,显然是不好的(它会导致分段冲突或其他不好的事情) 首先,为什么它是一个系统调用是一个好问题。为此,我下载了1.0.0,即使这样,系统调用也没有被init


我在手册页上找不到任何原因。

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

由于Linux
2.1.121
,因此不再存在此类功能

2.1.120
中可以看到,它被用于内核的init中(实际上有syscall number
0
)。只调用了两次:第一次调用释放了初始内存(从initram中),第二次调用设置了设备、文件系统并装载了根目录。因此,如果一个程序可以运行系统调用,显然是不好的(它会导致分段冲突或其他不好的事情)

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

我刚刚给Linus&LKML发了一封电子邮件,并在IRC上提问(尽管除了Linus之外,其他人不太可能知道,而且他正忙着回复关于Linux线粒体DNA的电子邮件)

EDIT:好的,进一步看,内核实际上是从进程上下文调用它的(
setup
调用实际上充当系统调用,
int0x80
和所有调用)。内核的初始化不是在进程上下文中完成的,并且():

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

其中“move_to_user_mode()”将重新加载所有段(某些段由 手,但CS/SS通过“iret”)。所以第一个fork()将 实际上是在用户空间中完成的,在此之前,内核 无法睡眠(因为没有空闲任务)。[…]所以“setup()”是一个 系统调用,因为它需要睡眠(执行IO)和内核 在进入用户模式和第一个分叉之前无法睡眠

是否可以采取不同的做法?当然显然我们没有这样做 这样,我们就可以分别创建空闲任务,而不是 再也不用“fork()”了。但这在当时是有意义的


我已经更新了我的答案,包括Linus在我的电子邮件中关于“如果用户空间无法调用setup()为什么是系统调用?”问题的答案。谢谢。你的回答再好不过了。
move_to_user_mode();
if (!fork()) {          /* we count on this going ok */
        init();
}
for(;;) pause();        /* [this is the idle task] */