一如既往,我感谢您为我的旅程付出的时间和精力:)
因此,作为一个书呆子,我已经开始揭开操作系统的工作原理。我有一个问题是关于内核和标准库,比如glibc for Linux,它充当函数包装器。
为什么操作系统需要一个用C编写的标准库?OR问了另一种方法。你能用C语言以外的另一种语言为Linux内核编写一个标准库吗?
我认为STD库的语言可能取决于为内核选择的语言。因此,在我们用C编写的Linux示例中,包装器STD库也需要是C.
我理解为什么内核通常需要STD库,所以这并不是我在JIC想要得到的——我不清楚。
再次感谢!
让我们深入了解操作系统用户空间通信的更多细节。你知道进展如何吗?基本上,每个平台都使用自己的方法进行所谓的syscall->控制从用户空间到内核空间的转移。例如x86使用int
指令,x86-64使用syscall
指令,arm使用swi
指令等等。此外,每个平台都有自己的理解,即在调用syscall指令之前应该如何建立参数和syscall编号。让我们关注x86-64:例如,对于调用execve(系统调用编号0x3b),此代码就足够了。你可以试试。
section .text
global _start
_start:
mov rax, 0x3b
mov rdi, cmd
mov rsi, 0
mov rdx, 0
syscall
section .data
cmd: db '/bin/sh'
.end:
现在让我们了解什么是execve
-libc函数。基本上,如果您深入研究libc代码,您会发现它是导致syscall函数的包装器(请参阅syscall.S中的arch)。这个系统调用。S看起来与我们上面的例子非常相似:
.text
ENTRY (syscall)
movq %rdi, %rax /* Syscall number -> rax. */
movq %rsi, %rdi /* shift arg1 - arg5. */
movq %rdx, %rsi
movq %rcx, %rdx
movq %r8, %r10
movq %r9, %r8
movq 8(%rsp),%r9 /* arg6 is on the stack. */
syscall /* Do the system call. */
因此,基本上,正如user4098326和rcgldr所提到的那样,uspace和内核之间的互连是汇编代码,以及它上面的所有东西——只是包装器。因此,据我所知,所有这些包装器都可以编写,而不仅仅是用C编写。
通用内核驱动程序通过文件操作工作,如打开、关闭、读取和;写
同样,由于内核也是完全用C.编写的
因此,由于这两个原因,我认为,我们不能用其他语言编写较低级别的库调用。