Почему ядро Linux может компилироваться только с GCC? Какие расширения GNU C действительно необходимы для некоторых проектов и почему?Какие расширения GNU C доступны, которые нетривиальны для реализации на C99?
ответ
В этой статье объясняются используемые расширения: GCC hacks in the Linux kernel. Некоторые из них тривиальны, некоторые из них (в основном, оптимизационные трюки).
GCC поддерживает Nested Functions, которые не являются частью стандарта C99. Тем не менее, необходим некоторый анализ, чтобы увидеть, насколько распространены они на самом деле в ядре linux.
Я думаю, что это не они действительно это необходимо. Просто есть много полезных, а переносимость кросс-компиляторов - это не проблема для ядра Linux, чтобы отказаться от тонкостей. Не говоря уже о том, сколько работы потребуется, чтобы избавиться от использования расширений.
Ядро Linux было записано для компиляции GCC, поэтому стандартное соответствие никогда не было целью для разработчиков ядра.
И если GCC предлагает несколько полезных расширений, которые упрощают или скомпилировали ядро с меньшим или более быстрым преобразованием, было бы естественным выбором использовать эти расширения.
Вот несколько расширений GCC ядро Linux использует:
- рядный сборки
- GCC, встроенные команды, такие как __builtin_expect, __ builtin_constant, __ builtin_return_address
- функция атрибутов указать, например, (например, __attribute __ ((regparm (0)), __ атрибут __ ((упакованный, выровненный (PAGE_SIZE)))))
- конкретный код в зависимости от предопределенных макросов gcc (например, обходные пути для некоторых ошибок gcc в некоторых версиях)
- диапазоны в случае переключателя (случай 8 ... 15 :)
Вот еще несколько: http://www.ibm.com/developerworks/linux/library/l-gcc-hacks/
Большая часть этих особенностей GCC очень зависит от архитектуры, или стало возможным из-за того, как GCC является реализован и, вероятно, не имеет смысла указываться стандартом C. Другие - просто удобные расширения для C. Поскольку ядро Linux построено на основе этих расширений, другие компиляторы должны предоставить те же расширения, что и gcc, чтобы иметь возможность строить ядро.
Это не то, что Linux имел, чтобы полагаться на эти особенности gcc, например. ядро NetBSD очень мало связано с конкретными материалами gcc.
Если вы соскучились, вы можете найти вопрос со ссылками на другие компиляторы, которые успешно создали linux. 'tcc' может сделать это для некоторых версий ядра, по крайней мере. – dmckee
Название и вопрос не очень хорошо совпадают. –
dmckee: Ядро Linux должно быть исправлено немного, чтобы его можно было построить с помощью tcc. – Yktula