簡體   English   中英

Linux 與 Windows 中的系統庫

[英]System libraries in Linux vs. Windows

我的背景是 Windows,我是 Linux 菜鳥。 仍在嘗試圍繞一些基本概念,特別是系統庫:

  1. Windows has ntdll.dll which wraps system calls, and a CRT dll which interface between the C syntax to the ntdll OS-exposed services.
    (為簡化起見,我忽略了 user32、kernel32、kernalbase 等中間層。我也意識到 CRT 是幾個 dll,這不是重點)。
  2. 似乎 Unix/Linux 幾乎只有 libc,它包裝系統調用直接從您的應用程序代碼中調用。

這是正確的比喻嗎? (ntdll + CRT) <===> libc?

我意識到 C 和 Unix 一起進化,但我仍然感到驚訝。 是不是 C 接口硬連線到 Unix/Linux 的操作系統中? 在 Windows 中,非 C 程序鏈接到底層操作系統提供的 dll。 在 Linux 中是否可能沒有 OS/C 運行時邊界?

通常,大多數程序都鏈接到 libc,即使它們是用另一種語言編寫的。 它提供 C 標准庫接口(如 MSVCRT)、POSIX 功能(相當於 Win32 子系統的某些部分)和圍繞系統調用的包裝器。 例如,Rust 使用 libc,因為它提供了一個可移植的鏈接環境。

但是,在 Linux 上,您不必鏈接 libc。 Go 選擇直接進行系統調用,這意味着它可以發布沒有運行時依賴的 static 二進制文件。 這是可能的,因為 Linux 保證了穩定的 kernel ABI,但並非所有操作系統都這樣做(例如,macOS)。 因此,除非您擁有大量資源(例如整個編程語言團隊),否則這通常不是明智之舉,除非您只使用少數系統調用。

I should point out that even Windows is intrinsically wired into the C language: it uses C strings (granted, usually wide C strings) for its system calls, and much of the kernel is written in C. 即使您從頭開始使用 kernel,您仍然需要一個通用的 C 接口,因為幾乎每種編程語言都有與 C 交互的方式。

Linux系統調用記錄在syscalls(2)中,是用戶級程序的基礎。 調用約定記錄在ABI規范中。 ELF可執行格式已記錄在案,例如在elf(5)中。

另請閱讀高級 Linux 編程Unix 理念

您可以直接在匯編程序中進行系統調用。 Linux 組裝方法說明了這一點。 您會更喜歡使用 C 接口,因此最好使用libc 實際上, libc.so是大多數 Linux 系統的基石。

ldd(1)pmap(1)strace(1)BusyBox

GCC編譯器支持有用的語言擴展,並混合 C 和匯編代碼。

一些編程語言實現幾乎沒有使用 C 並且可以直接調用系統調用(查看SBCLGo ...)

Linux kernel和通常的GNU libc (或musl-libc ),以及GCC編譯器和binutils代碼都是免費的,

使用systemdvdso(7)事情變得更加棘手。

另見http://linuxfromscratch.org/

圖形應用程序使用一些顯示服務器,通常是XorgWayland 閱讀有關X11的信息。 您可能希望使用GTKQt 之類的 GUI 工具包對其進行編碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM