Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ядра LinuxΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 8

Автор Π ΠΎΠ±Π΅Ρ€Ρ‚ Π›Π°Π²

НапримСр, для ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ x86, ΠΏΡ€ΠΈ использовании систСмного Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠ° grub ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌΡ‹ΠΉ ΠΎΠ±Ρ€Π°Π· ядра ΠΈΠ· Ρ„Π°ΠΉΠ»Π° arch/i386/boot/bzImage Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ /boot ΠΈ ΠΎΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» /etc/grub/grub.conf для указания записи, которая соотвСтствуСт Π½ΠΎΠ²ΠΎΠΌΡƒ ядру. Π’ систСмах, Π³Π΄Π΅ для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ LILO, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ соотвСтствСнно ΠΎΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» /etc/lilo.conf ΠΈ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρƒ lilo(8).

Π˜Π½ΡΡ‚Π°Π»Π»ΡΡ†ΠΈΡ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ядра Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π° ΠΈ Π½Π΅ зависит ΠΎΡ‚ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹. ΠŸΡ€ΠΎΡΡ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ с ΠΏΡ€Π°Π²Π°ΠΌΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ root.

$ make modules_install

Π’ процСссС компиляции Π² ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ Π΄Π΅Ρ€Π΅Π²Π° исходного ΠΊΠΎΠ΄Π° ядра Ρ‚Π°ΠΊΠΆΠ΅ создаСтся Ρ„Π°ΠΉΠ» System.map. Π’ этом Ρ„Π°ΠΉΠ»Π΅ содСрТится Ρ‚Π°Π±Π»ΠΈΡ†Π° соотвСтствия символов ядра ΠΈΡ… Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΌ адрСсам Π² памяти. Π­Ρ‚Π° Ρ‚Π°Π±Π»ΠΈΡ†Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅ для ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° адрСсов памяти Π² ΠΈΠΌΠ΅Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ….

"Π—Π²Π΅Ρ€Π΅ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Ρ€ΠΎΠ΄Π°"

Π―Π΄Ρ€ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ отличия Π² сравнСнии с ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΌΠΈ прилоТСниями, эти отличия хотя ΠΈ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ приводят ΠΊ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Ρ‹ΠΌ услоТнСниям ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ, Π½ΠΎ всС ΠΆΠ΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ спСцифичСскиС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ядра.

Π­Ρ‚ΠΈ отличия Π΄Π΅Π»Π°ΡŽΡ‚ ядро Π·Π²Π΅Ρ€ΡŒΠΊΠΎΠΌ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Ρ€ΠΎΠ΄Π°. НСкоторыС ΠΈΠ· старых ΠΏΡ€Π°Π²ΠΈΠ» ΠΏΡ€ΠΈ этом ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ Π² силС, Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π½ΠΎΠ²Ρ‹ΠΌΠΈ. Π₯отя Ρ‡Π°ΡΡ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠΉ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Π° (всС Π·Π½Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ ядро ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ всС, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΆΠ΅Π»Π°Π΅Ρ‚), Π΄Ρ€ΡƒΠ³ΠΈΠ΅ различия Π½Π΅ Ρ‚Π°ΠΊ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹. НаиболСС Π²Π°ΠΆΠ½Ρ‹Π΅ отличия описаны Π½ΠΈΠΆΠ΅.

β€’ Π―Π΄Ρ€ΠΎ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ доступа ΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ языка Π‘.

β€’ Π―Π΄Ρ€ΠΎ программируСтся с использованиСм компилятора GNU Π‘.

β€’ Π’ ядрС Π½Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠΉ Π·Π°Ρ‰ΠΈΡ‚Ρ‹ памяти, ΠΊΠ°ΠΊ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

β€’ Π’ ядрС нСльзя Π»Π΅Π³ΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ вычислСния с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ.

β€’ Π―Π΄Ρ€ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ стСк нСбольшого фиксированного Ρ€Π°Π·ΠΌΠ΅Ρ€Π°.

β€’ ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² ядрС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ асинхронныС прСрывания, ядро являСтся ΠΏΡ€Π΅Π΅ΠΌΠΏΡ‚ΠΈΠ²Π½Ρ‹ΠΌ ΠΈ Π² ядрС имССтся ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° SMP, Ρ‚ΠΎ Π² ядрС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ° ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡŽ.

β€’ ΠŸΠ΅Ρ€Π΅Π½ΠΎΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½Π°.

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим Π±ΠΎΠ»Π΅Π΅ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎ всС эти ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ всС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ядра Π΄ΠΎΠ»ΠΆΠ½Ρ‹ постоянно ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΎ Π½ΠΈΡ….

ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ libc

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ядро Π½Π΅ компонуСтся со стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ языка Π‘ (ΠΈ Π½ΠΈ с ΠΊΠ°ΠΊΠΎΠΉ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΆΠ΅ Ρ‚ΠΈΠΏΠ°). Для этого Π΅ΡΡ‚ΡŒ нСсколько ΠΏΡ€ΠΈΡ‡ΠΈΠ½, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ситуации с Π΄ΠΈΠ»Π΅ΠΌΠΌΠΎΠΉ ΠΎ ΠΊΡƒΡ€ΠΈΡ†Π΅ ΠΈ яйцС, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° β€” ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ выполнСния ΠΈ объСм ΠΊΠΎΠ΄Π°. Полная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ языка Π‘, ΠΈ Π΄Π°ΠΆΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ самая нСобходимая Π΅Π΅ Ρ‡Π°ΡΡ‚ΡŒ, ΠΎΡ‡Π΅Π½ΡŒ большая ΠΈ нСэффСктивная для ядра.

ΠŸΡ€ΠΈ этом Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°ΡΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒΡΡ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ языка Π‘ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π² ядрС. НапримСр, ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ со строками описаны Π² Ρ„Π°ΠΉΠ»Π΅ lib/string.с. НСобходимо лишь ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» <linux/string.h> ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ этими функциями.

Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹

Π—Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ упомянутыС Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Ρ‚ΡŒΡΡ Π΄Π°Π»Π΅Π΅ Π² этой ΠΊΠ½ΠΈΠ³Π΅, ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ Π΄Π΅Ρ€Π΅Π²Ρƒ исходного ΠΊΠΎΠ΄Π° ядра. Π’ Ρ„Π°ΠΉΠ»Π°Ρ… исходного ΠΊΠΎΠ΄Π° ядра нСльзя ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΠ·Π²Π½Π΅ этого Π΄Π΅Ρ€Π΅Π²Π° ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ², Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ внСшниС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ,

ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΠ΅Ρ‚ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ извСстная функция printf(). Π―Π΄Ρ€ΠΎ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ доступа ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ printf(), ΠΎΠ΄Π½Π°ΠΊΠΎ Π΅ΠΌΡƒ доступна функция printk(). Ѐункция printk() ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ строку Π² Π±ΡƒΡ„Π΅Ρ€ систСмных сообщСний ядра (kernel log buffer), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ читаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ syslog. ИспользованиС этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ использованию printf():

printk("Hello world! Π‘Ρ‚Ρ€ΠΎΠΊΠ°: %s ΠΈ Ρ†Π΅Π»ΠΎΠ΅ число: %d\n",

 a_string, an_integer);

Одно Π²Π°ΠΆΠ½ΠΎΠ΅ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ printf() ΠΈ printk() состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ printk() ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π»Π°Π³ уровня Π²Ρ‹Π²ΠΎΠ΄Π°. Π­Ρ‚ΠΎΡ‚ Ρ„Π»Π°Π³ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ syslog для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Π½ΡƒΠΆΠ½ΠΎ Π»ΠΈ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ сообщСниС ядра. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования уровня Π²Ρ‹Π²ΠΎΠ΄Π°:

printk(KERN_ERR "Π­Ρ‚ΠΎ Π±Ρ‹Π»Π° ошибка !\n");

Ѐункция printk() Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π° протяТСнии всСй ΠΊΠ½ΠΈΠ³ΠΈ. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π³Π»Π°Π²Π°Ρ… ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΎ большС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ printk().

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ GNU Π‘

Как ΠΈ всС "ΡƒΠ²Π°ΠΆΠ°ΡŽΡ‰ΠΈΠ΅ сСбя" ядра Unix, ядро Linux написано Π½Π° языкС Π‘. ΠœΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ, это покаТСтся Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½Ρ‹ΠΌ, Π½ΠΎ ядро Linux написано Π½Π΅ Π½Π° чистом языкС Π‘ Π² стандартС ANSI Π‘. Наоборот, Π³Π΄Π΅ это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ядра ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ языка, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ доступны с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ срСдств компиляции gcc (GNU Compiler Collection β€” коллСкция компиляторов GNU, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ содСрТится компилятор Π‘, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ для компиляции ядра).

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ядра ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΊΠ°ΠΊ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ языка Π‘ ISO C99[7] Ρ‚Π°ΠΊ ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ GNU Π‘. Π­Ρ‚ΠΈ измСнСния ΡΠ²ΡΠ·Ρ‹Π²Π°ΡŽΡ‚ ядро Linux с компилятором gcc, хотя соврСмСнныС компиляторы, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Intel Π‘, ΠΈΠΌΠ΅ΡŽΡ‚ Π΄ΠΎΡΡ‚Π°Ρ‚ΠΎΡ‡Π½ΡƒΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ возмоТностСй компилятора gcc для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠΈ Ρ‚ΠΎΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ядро Linux. Π’ ядрС Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ особСнныС Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ стандарта C99, ΠΈ ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ стандарт C99 являСтся ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ€Π΅Π΄Π°ΠΊΡ†ΠΈΠ΅ΠΉ языка Π‘, эти Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Ρ€Π΅Π΄ΠΊΠΎ приводят ΠΊ возникновСнию ошибок Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… частях ΠΊΠΎΠ΄Π°. Π‘ΠΎΠ»Π΅Π΅ интСрСсныС ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΌΠ΅Π½Π΅Π΅ Π·Π½Π°ΠΊΠΎΠΌΡ‹Π΅ отклонСния ΠΎΡ‚ стандарта языка ANSI Π‘ связаны с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡΠΌΠΈ GNU Π‘. Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ интСрСсныС Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΡ‚ΡŒΡΡ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ ядра.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ с подстановкой Ρ‚Π΅Π»Π°

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ GNU Π‘ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с подстановкой Ρ‚Π΅Π»Π° (inline functions). Π˜ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡ‹ΠΉ ΠΊΠΎΠ΄ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с подстановкой Ρ‚Π΅Π»Π°, ΠΊΠ°ΠΊ слСдуСт ΠΈΠ· названия, вставляСтся Π²ΠΎ всС мСста ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π³Π΄Π΅ ΡƒΠΊΠ°Π·Π°Π½ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π­Ρ‚ΠΎ позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π·Π°Ρ‚Ρ€Π°Ρ‚ Π½Π° Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (сохранСниС ΠΈ восстановлСниС рСгистров) ΠΈ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ позволяСт ΠΏΠΎΠ²Ρ‹ΡΠΈΡ‚ΡŒ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ компилятор ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ вмСстС. ΠžΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ стороной Ρ‚Π°ΠΊΠΎΠΉ подстановки (Π½ΠΈΡ‡Ρ‚ΠΎ Π² этой ΠΆΠΈΠ·Π½ΠΈ Π½Π΅ даСтся Π΄Π°Ρ€ΠΎΠΌ) являСтся ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ объСма ΠΊΠΎΠ΄Π°, ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ памяти ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠ΅ эффСктивности использования процСссорного кэша инструкций. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ядра ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с подстановкой Ρ‚Π΅Π»Π° для Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½Ρ‹Ρ… ΠΊΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ подстановку Ρ‚Π΅Π»Π° для Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, особСнно ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ большС ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ€Π°Π·Π° ΠΈΠ»ΠΈ Π½Π΅ слишком ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½Ρ‹ ΠΊΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния, Π½Π΅ рСкомСндуСтся.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ с подстановкой Ρ‚Π΅Π»Π° ΠΎΠ±ΡŠΡΠ²Π»ΡΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слов static ΠΈ inline Π² Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. НапримСр,

static inline void dog(unsigned long tail_size);

ДСкларация Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ описана ΠΏΠ΅Ρ€Π΅Π΄ Π»ΡŽΠ±Ρ‹ΠΌ Π΅Π΅ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ, ΠΈΠ½Π°Ρ‡Π΅ подстановка Ρ‚Π΅Π»Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½Π°. Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠ΅ΠΌ β€” это Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ с подстановкой Ρ‚Π΅Π»Π° Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ…. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ функция ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ ΠΊΠ°ΠΊ статичСская (static), экзСмпляр Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±Π΅Π· подстановки Ρ‚Π΅Π»Π° Π½Π΅ создаСтся. Если функция с подстановкой Ρ‚Π΅Π»Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΠ΄Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅, Ρ‚ΠΎ ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π° Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ части этого Ρ„Π°ΠΉΠ»Π°.

Π’ ядрС использованию Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ с подстановкой Ρ‚Π΅Π»Π° слСдуСт ΠΎΡ‚Π΄Π°Π²Π°Ρ‚ΡŒ прСимущСство ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с использованиСм слоТных макросов.

ВстроСнный ассСмблСр

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ gcc Π‘ позволяСт Π²ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ инструкции языка ассСмблСра Π² ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ языка Π‘. Π­Ρ‚Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚Π΅Ρ… частях ядра, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ для ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹.

Для встраивания ассСмблСрного ΠΊΠΎΠ΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° компилятора asm().

Π―Π΄Ρ€ΠΎ Linux написано Π½Π° смСси языков ассСмблСра ΠΈ Π‘. Π―Π·Ρ‹ΠΊ ассСмблСра ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Ρ… подсистСмах ΠΈ Π½Π° участках ΠΊΠΎΠ΄Π°, Π³Π΄Π΅ Π½ΡƒΠΆΠ½Π° большая ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ выполнСния. Π‘ΠΎΠ»ΡŒΡˆΠ°Ρ Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠ΄Ρƒ ядра написана Π½Π° языкС программирования Π‘.

Аннотация Π²Π΅Ρ‚Π²Π»Π΅Π½ΠΈΠΉ

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ gnu Π‘ ΠΈΠΌΠ΅Π΅Ρ‚ встроСнныС Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π²Π΅Ρ‚Π²ΠΈ условных ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΈΠ»ΠΈ Π½Π°ΠΈΠΌΠ΅Π½Π΅Π΅ вСроятны. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ эти Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ для соотвСтствСнной ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π°. Π’ ядрС эти Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ Π·Π°ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ Π² макросы likely() ΠΈ unlikely(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π»Π΅Π³ΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ. НапримСр, Ссли ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ if ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Π²ΠΈΠ΄Π°:

if (foo) {

 /* ... */

}

Ρ‚ΠΎ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ этот ΠΏΡƒΡ‚ΡŒ выполнСния ΠΊΠ°ΠΊ маловСроятный, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ:

/* прСдполагаСтся, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ foo Ρ€Π°Π²Π½ΠΎ Π½ΡƒΠ»ΡŽ ...*/

if (unlikely(foo)) {

 /* ... */

}

И Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ этот ΠΏΡƒΡ‚ΡŒ выполнСния ΠΊΠ°ΠΊ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ вСроятный

/* прСдполагаСтся, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ foo Π½Π΅ Ρ€Π°Π²Π½ΠΎ Π½ΡƒΠ»ΡŽ ...*/

if (likely(foo)) {

 /* ... * /