无需系统调用即可打印到屏幕的汇编代码

无需系统调用即可打印到屏幕的汇编代码

在Linux中,是否可以编写一个x86汇编程序来将字符打印到屏幕上(标准输出)没有使用什么系统调用?

我认为这是不可能的,因为在 x86 汇编中,输入/输出操作是特权的,因此如果 CPU 不在 RING 0 中,则不可能运行该操作。

答案1

是和不是。

是的 - 您是对的,操作系统确实阻止用户进程直接访问设备(在本例中为视频)。

否 - 您可以将您的应用程序发送到零环。例如,只需将其作为模块提供给内核即可。当然,它不会是标准的用户级应用程序,但这是可能的。

答案2

我想说,现代操作系统的重点是提供内存保护和用户进程之间的分离以及文件系统、管道和终端等有用的抽象。其中一部分是充当流程之间的中介,以确保这些抽象的规则得到执行。因此,无论用户进程与进程外部的任何内容进行交互,几乎都必须通过操作系统,而系统调用是主要方式。

现在,有一些解决方法。例如,共享内存映射允许在进程之间传输数据,而不涉及操作系统代码。即使内核也提供了一些简单系统调用的实现,而无需实际调用内核代码,但(AFAIK)这些是只读的。参见例如为什么 Linux utils 不使用系统调用来获取当前时间?

即使在那里,问题还是设置共享映射,这是通过系统调用完成的(毫不奇怪)。执行程序文件会破坏内存映射,因此我们无法使用常规的独立程序来做到这一点。可以通过让一段代码进行设置,然后调用另一段代码来完成,该代码然后仅通过共享映射进行交互。第二部分可以从单独的库文件加载,但我不知道这是否重要。

相关内容