Как определяется системный вызов в ядре Linux? Какова связь между compat_sys_xxx и sys_xxx?

#linux #linux-kernel #system-calls

#linux #linux-ядро #системные вызовы

Вопрос:

В /include/linux/compat.h я вижу много compat_sys_xxx . Кроме того, где-то еще определен sys_xxx . Какова связь между compat_sys_xxx и sys_xxx?

Ответ №1:

Если есть запись compat, это почти наверняка означает, что прототип системного вызова был изменен, и версия предыдущего прототипа была сохранена для совместимости. Часто вы увидите, что compat_sys_xxx просто вызывает sys_xxx с соответствующим преобразованием аргументов (или оба вызывают общую функцию с немного разными преобразованиями).

В качестве более или менее случайного примера compat_sys_msgsnd принимает три аргумента «int», за которыми следует указатель на структуру compat_msgbuf (где первое — якобы «длинное» — поле принудительно имеет 32-битный размер). OTOH, sys_msgsnd перечисляет аргументы в другом порядке и с типами аргументов, выбранными для преобразования соответствующим образом для архитектуры (т. Е. Длинные числа с плавающей точкой в соответствии с естественным размером длинного целого числа, size_t заменяет int в одном месте и т. Д.).

Без сомнения, интерфейс системного вызова был изменен, потому что исходный интерфейс был каким-то образом неоднозначным при переходе на другую (не i386) архитектуру. Версия compat_ позволяет существующим двоичным файлам продолжать работать без изменений.