Ядро Linux в комментариях



System_call


Первый аргумент system_call представляет собой номер активизируемого системного вызова; он находится в регистре ЕАХ. Кроме того, system_call принимает вплоть до четырех дополнительных аргументов, передаваемых вместе с системным вызовом. В редких случаях, когда четырехаргументный предел оказывается обременительным, его можно обойти, подготовив единственный аргумент, представляющий собой указатель на структуру, которая содержит любое требуемое количество аргументов. Дополнительная копия значения регистра ЕАХ может потребоваться позже, поэтому сейчас она сохраняется путем помещения в стек; в регистр ЕАХ помещается значение ORIG_EAX(%esp) (см. строку ).

Макрос SAVE_ALL определен в строке ; он занимается тем, что помещает копии всех регистров в стек ЦП. Несколько позже, перед возвратом из system_call, они достаются из стека при помощи макроса RESTORE_ALL (строка ). Между прочим, system_call может свободно использовать регистры для любых необходимых целей. Самое важное то, что любая вызываемая функция С ожидает присутствие аргументов в стеке, поскольку макрос SAVE_ALL их туда помещает.

Результирующее размещение в стеке документируется, начиная со строки . Выражения наподобие 0(%esp) и 4(%esp) обозначают смещение от указателя стека (регистр ESP) — 0 байт выше ESP, 4 байта выше ESP и т.д. В частности, копия ЕАХ, помещенная в стек в предыдущей строке кода, задокументирована как orig_eax; она располагается выше значений регистров, сохраненных через SAVE_ALL. Побочное замечание: поскольку копия ЕАХ, на которую мы ссылаемся как на orig_eax, сохраняется в стеке первой, не должна ли она оказаться в стеке ниже других регистров, а не выше? И да, и нет. Регистр указателя стека в архитектуре х86, ESP, декрементируется при каждом помещении элементов в стек, т.е. стек растет к нижним адресам памяти. Поэтому orig_eax логически расположен ниже других значений, однако физически — выше них. Набор макросов, определяемый начиная со строки , повышает читабельность упомянутых смещений. Например, ЕАХ(%esp) будет тем же самым, что и 18(%esp), однако первый случай более четко и понятно определяет, что выражение ссылается на сохраненную в стеке копию регистра ЕАХ.




Содержание  Назад  Вперед