OS体系结构:内核和标准库的互操作性

时间:2015-04-10 14:14:14

标签: c architecture linux-kernel kernel osdev

我一如既往地感谢您花时间和精力协助我的旅程:)

因此,作为一名书呆子,我已经开始撤回操作系统的工作方式。我对内核和标准库有疑问,例如glibc for Linux,它充当函数包装器。

为什么操作系统需要一个用C语言编写的标准库?或者问另一种方法你能用C语言以外的其他语言编写Linux内核的标准库吗?

我认为STD库的语言可能依赖于为内核选择的语言。因此,在我们用C语言编写的Linux示例中,包装器STD库也需要是C。

我理解为什么内核需要一般的STD库,所以这不是我想要在JIC上得到的我不清楚。

再次感谢!

2 个答案:

答案 0 :(得分:3)

让我们深入了解操作系统 - 用户空间通信。你知道怎么回事吗?基本上每个平台都使用自己的方法来制作所谓的系统调用 - >控制从用户空间到内核空间的转移。 例如,x86使用int指令,x86-64使用syscall指令,arm使用swi等等。此外,每个平台都有自己对如何在调用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函数(请参阅libc中的archc的syscall.S)。这个系统调用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 所提到的那样 - 空间和内核之间的互连是汇编代码,以及它上面的所有东西 - 只是包装器。因此,据我所知,所有这些包装器都可以写成不仅仅在C

答案 1 :(得分:-1)

通用内核驱动程序通过文件操作来完成,例如open,close,read和&写。

同样,内核也完全用C语言编写。

因此有两个原因 我认为,我们不能用其他语言编写低级库调用。