Написание POSIX-совместимого ядра - PullRequest
7 голосов
/ 16 июля 2010

Я давно хотел написать ядро. У меня уже есть достаточные знания C, и я баловался на x86 Ассемблере. Видите ли, я хотел написать ядро, совместимое с POSIX на C, чтобы приложения * NIX могли быть потенциально перенесены на мою ОС, но я не нашел много ресурсов по стандартным функциям ядра POSIX. Я нашел ресурсы по структуре файловой системы, переменным среды и многим другим на странице POSIX открытой группы .

К сожалению, я не нашел ничего, объясняющего, какие вызовы и функции ядра должны иметь POSIX-совместимое ядро ​​(другими словами, какая внутренняя структура должна иметь ядро ​​для соответствия POSIX). Если кто-нибудь сможет найти эту информацию, пожалуйста, скажите мне.

Ответы [ 2 ]

11 голосов
/ 16 июля 2010

POSIX вообще не определяет внутреннюю структуру ядра, интерфейс ядро-пользовательское пространство или даже libc. Действительно, даже Windows имеет POSIX-совместимую подсистему. Просто убедитесь, что интерфейсы POSIX, определенные по вашей ссылке, работают как-то . Однако обратите внимание, что POSIX не требует, чтобы что-то было реализовано конкретно в ядре - вы можете реализовывать вещи в библиотеке C, используя, где возможно, более простые интерфейсы ядра вашей собственной разработки.

Просто так получилось, что многие POSIX-совместимые ОС (BSD, Linux и т. Д.) Имеют довольно тесную связь между многими из этих вызовов и уровнем ядра, но есть исключения. Например, в Linux вызов write() - это прямой системный вызов, вызывающий функцию sys_write() в ядре. Однако в Windows write() реализован в DLL поддержки POSIX, которая преобразует дескриптор файла в дескриптор NT и вызывает NtWriteFile() для его обслуживания, что, в свою очередь, вызывает соответствующий системный вызов в ntoskrnl.exe. Таким образом, у вас есть много свободы в том, как что-то делать - что делает вещи сложнее, если что-нибудь:)

4 голосов
/ 16 июля 2010

opengroup.org оставляет решения о системных вызовах ядра для каждой имплементации.
Например, write () должен выглядеть и вести себя так, как указано, но то, что он вызывает ниже, не определено. Многие вызовы, такие как write, read, lseek, могут свободно вызывать любую точку входа в ядре.

Итак, нет, на самом деле нет ничего, что говорит о том, что вам нужно иметь определенное имя функции с определенным набором семантики, доступной в ядре. Он просто должен быть доступен в библиотеке времени исполнения C.

...