Системные библиотеки в Linux против Windows - PullRequest
0 голосов
/ 27 апреля 2020

У меня фон Windows, а я Linux нуб. Все еще пытаюсь обернуть голову вокруг некоторых базовых c концепций и, в частности, системных библиотек:

  1. Windows имеет ntdll.dll, которая обертывает системные вызовы, и библиотеку CRT, которая взаимодействует между C синтаксис к службам ntdll, доступным для ОС.
    (для упрощения я игнорирую промежуточный уровень user32, kernel32, kernalbase et c. Я также понимаю, что CRT - это несколько dll, это не главное).
  2. Кажется, что Unix / Linux имеет в значительной степени просто lib c, которая оборачивает системные вызовы и , вызываемые непосредственно из кода вашего приложения.

Is это правильная аналогия? (ntdll + CRT) <===> lib c?

Я понимаю, что C & Unix развивались вместе, но все еще удивлен. Может ли быть так, что интерфейс C встроен в ОС для Unix / Linux? В Windows не-C программах ссылки на базовые ОС предоставлены DLL. Возможно ли, что в Linux нет границы OS / C -runtime?

Ответы [ 2 ]

4 голосов
/ 28 апреля 2020

Как правило, большинство программ ссылаются на lib c, даже если они написаны на другом языке. Он обеспечивает стандартный интерфейс библиотеки C (например, MSVCRT), функции POSIX (эквивалент некоторых частей подсистемы Win32) и обертки вокруг системных вызовов. Например, Rust использует lib c, потому что он предоставляет переносимую среду для связи с *. 1001 *

Однако на Linux вы не должны ссылаться на lib c , Go выбирает выполнение системных вызовов напрямую, что означает, что он может отправлять статические c двоичные файлы, которые не имеют зависимостей времени выполнения. Это возможно, потому что Linux гарантирует стабильный ABI ядра, но не все операционные системы делают это (например, macOS). Поэтому, если у вас нет значительных ресурсов (например, всей команды по языку программирования), это, как правило, не разумный ход, если вы не работаете только с несколькими системными вызовами.

Я должен отметить, что даже Windows изначально встроен в язык C: он использует C строки (предоставленные, обычно широкие C строки) для своих системных вызовов, и большая часть ядра написана на C. Даже если вы запускаете ядро ​​с нуля, вам все равно нужен общий интерфейс C, поскольку практически каждый язык программирования имеет способ взаимодействия с C.

3 голосов
/ 28 апреля 2020

Системные вызовы Linux документированы в syscalls (2) и являются основой пользовательских программ. соглашения о вызовах описаны в спецификациях ABI . Исполняемый формат ELF документируется, например, в elf (5) .

Читайте также Дополнительно Linux Программирование и о философии Unix .

Системные вызовы можно выполнять прямо в ассемблере. Linux Assembly HowTo объясняет это. Вы предпочтете использовать C интерфейс, и по этой причине libc предпочтительнее. На практике libc.so является краеугольным камнем большинства Linux систем.

Играть с ldd (1) , pmap (1) , strace (1) , BusyBox

Компилятор G CC позволяет использовать полезные языковые расширения и смешивание C и ассемблер * код 1044 *.

Некоторое программирование языковые реализации едва используют C и могут вызывать системные вызовы напрямую (см. SBCL или Go ...)

Оба Linux ядро ​​ и обычный GNU lib c (или musl-lib c), а также компилятор G CC и binutils являются бесплатными программами или с открытым исходным кодом , и вы можете изучить их исходный код .

Все становится сложнее с systemd и vdso (7) .

См. также http://linuxfromscratch.org/

Некоторые графические приложения используют сервер дисплея , часто Xorg или Wayland . Читайте о X11 . Вы можете использовать GUI наборы инструментов, такие как GTK или Qt для их кодирования.

...