Доброй ночи. Я хочу посмотреть реализацию системного вызова open(), который делает fopen() из glibc. В fs/open.c нет функции open(). Есть только что-то похожее на неё, но там все в макросах, а макросы сами определены через макросы, в итоге 5 этажные макросы и ничего не понятно. Там ли я ищю? Как понимать код ядра? Я бы не сказал, что это the pure code.
Это самое что ни на есть pure code. Начните с man open и посмотрите, сколько всего имеется open-ов разного рода. Мне сейчас в исходники ведра лезть лениво, но сто процентов - все эти open-ы сводятся макросами к одному какому-нибудь __open(), который передает вызов в ядро, какому-нибудь __kernel_open()
SYSCALL_DEFINEx -- это реализация системного вызова с x параметрами, первое слово в скобках -- это название вызова, дальше -- x пар: тип параметра и имя параметра.
k3rnel: у меня нет ответа на вопрос "почему так запутанно", для того чтобы найти его нужно порыться в LKML. Ответ на вопрос "зачем" найти легче: с помощью git log легко находится момент, когда эти макросы появились:
commit 1a94bc34768e463a93cb3751819709ab0ea80a01
Author: Heiko Carstens <heiko.carstens@de.ibm.com>
Date: Wed Jan 14 14:13:59 2009 +0100
[CVE-2009-0029] System call wrapper infrastructure
From: Martin Schwidefsky <schwidefsky@de.ibm.com>
By selecting HAVE_SYSCALL_WRAPPERS architectures can activate
system call wrappers in order to sign extend system call arguments.
All architectures where the ABI defines that the caller of a function
has to perform sign extension probably need this.
-- для того, чтобы сгенерировать функции, выполняющие знаковое расширение до размера регистра всех аргументов системных вызовов, для архитектур, ABI которых предписывает это.
k3rnel: речь не про "я хочу", а про 32-битные параметры передаваемые в 64-битных регистрах. Давай уже, гугли CVE по номеру, читай что там сломалось, как взрослый.