Jan. 27th, 2011

Есть искусственная сугубо формалистическая задача: позволить реализовать системный вызов с помощью чистого ANSI C. Последнее означает отсутствие нестандартных символьных констант и нестандартных конструкций, в том числе ассемблерных вставок.

По очевидным соображениям, варьируемой частью, которая и будет являться решением, может быть лишь компилятор, а не архитектура компьютера. Иными словами для решения задачи необходимо и достаточно представить компилятор языка ANSI C, нигде не противоречащий стандарту, который при этом позволял бы пользователю с помощью некоторых инструкций чистого ANSI C получать в качестве результатов компиляции системный вызовы, которые традиционно реализуются на языке ассемблера.

Нетрудно заключить, что решение задачи может быть найдено там, где стандарт не специфицирует поведение, оставляя свободу действий реализациям. При этом препроцессор с его #pragma не подходит по определению, а попытка рассмотреть стандартные библиотеки возвращает рекурсивно к исходной формулировке проблемы. Таким образом единственным остающимся в запасе местом оказывается ядро языка.

Логично взглянуть в сторону деления на нуль. Действительно, «если второй операнд [операций / и %] равен 0, то результат не определен». Следовательно системный вызов можно реализовать, по крайней мере, следующим образом:
void syscall(int num)
{
	num / 0;
}
Интересны и другие варианты решения данной задачи. Например, [livejournal.com profile] blacklion предложил решение даже без требования какого-либо специфического компилятора, а лишь добавив еще один интерфейс системных вызовов в дополнение к обычной ассемблерной инструкции syscall. Решение заключается в том, чтобы не рассматривать разыменование нулевого указателя попыткой доступа к неразрешенной памяти, но в то же время перехватывать это обращение в MMU самой операционной системой. Функция для вызова системного вызова без магических констант и без операций, поведение которых не специфицировано в ANSI C, может выглядеть следующим образом:
void syscall(char *data)
{
	static volatile char **const syscallp;

	*syscallp = data;
}

Profile

Anton Salikhmetov

November 2018

S M T W T F S
    123
45678 910
11121314151617
18192021222324
252627282930 

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 22nd, 2025 01:04 am
Powered by Dreamwidth Studios