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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ для Linux. ΠŸΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 49

Автор ΠœΠ°Ρ€ΠΊ ΠœΠΈΡ‚Ρ‡Π΅Π»Π»

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ bsrl вычисляСт мСстополоТСниС ΡΡ‚Π°Ρ€ΡˆΠ΅Π³ΠΎ Π·Π½Π°Ρ‡Π°Ρ‰Π΅Π³ΠΎ Π±ΠΈΡ‚Π° Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π΅ ΠΈ записываСт Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ (Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ начиная с нуля) Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄. НапримСр, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ number ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ position:

asm("bsrl %1, %0" : "=r" (position) : "r" (number)};

Π•ΠΉ соотвСтствуСт Ρ‚Π°ΠΊΠΎΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ Π½Π° языкС Π‘:

long i;

for (i = (number >> 1), position = 0; i != 0; ++position)

 i >>= 1;

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ выполнСния Π΄Π²ΡƒΡ… Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ², ΠΌΡ‹ помСстили ΠΈΡ… Π² Ρ†ΠΈΠΊΠ», Π³Π΄Π΅ пСрСбираСтся большоС количСство чисСл. Π’ листингС 9.1 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° рСализация Π½Π° языкС Π‘. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Π΅Ρ‚ значСния ΠΎΡ‚ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ Π΄ΠΎ числа, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС. Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ number вычисляСтся позиция ΡΡ‚Π°Ρ€ΡˆΠ΅Π³ΠΎ Π·Π½Π°Ρ‡Π°Ρ‰Π΅Π³ΠΎ Π±ΠΈΡ‚Π°. Π’ листингС 9.2 ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚ΠΎ ΠΆΠ΅ самоС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ассСмблСрной вставки. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π² ΠΎΠ±ΠΎΠΈΡ… случаях Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ вычислСний заносится Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ result, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½ΡƒΡŽ со спСцификатором volatile. Π­Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для подавлСния ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ со стороны компилятора, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠ΄Π°Π»ΠΈΡ‚ вСсь Π±Π»ΠΎΠΊ вычислСний, Ссли ΠΈΡ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΈΠ»ΠΈ Π½Π΅ заносятся Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ.

Листинг 9.1. (bit-pos-loop.c) НахоТдСниС ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΡΡ‚Π°Ρ€ΡˆΠ΅Π³ΠΎ Π·Π½Π°Ρ‡Π°Ρ‰Π΅Π³ΠΎ Π±ΠΈΡ‚Π° Π² Ρ†ΠΈΠΊΠ»Π΅

#include <stdio.h>

#include <stdlib.h>


int main(int argc, char* argv[]) {

 long max = atoi(argv[1]);

 long number;

 long i;

 unsigned position;

 volatile unsigned result;


 /* ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΡΠ΅ΠΌ вычислСния для большого количСства чисСл. */

 for (number = 1; number <= max; ++number) {

  /* Π‘Π΄Π²ΠΈΠ³Π°Π΅ΠΌ число Π²ΠΏΡ€Π°Π²ΠΎ, ΠΏΠΎΠΊΠ° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π½Π΅ станСт

     Ρ€Π°Π²Π½Ρ‹ΠΌ Π½ΡƒΠ»ΡŽ.

     Π—Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌ количСство ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ сдвига. */

 for (i = (number >> 1), position = 0; i != 0; ++position)

  i >>= 1;

  /* ΠŸΠΎΠ·ΠΈΡ†ΠΈΡ ΡΡ‚Π°Ρ€ΡˆΠ΅Π³ΠΎ Π·Π½Π°Ρ‡Π°Ρ‰Π΅Π³ΠΎ Π±ΠΈΡ‚Π° β€” это ΠΎΠ±Ρ‰Π΅Π΅ число

     ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ сдвига, ΠΊΡ€ΠΎΠΌΠ΅ ΠΏΠ΅Ρ€Π²ΠΎΠΉ. */

  result = position;

 }

 return 0;

}

Листинг 9.2. (bit-pos-asm.c) НахоТдСниС ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΡΡ‚Π°Ρ€ΡˆΠ΅Π³ΠΎ Π·Π½Π°Ρ‡Π°Ρ‰Π΅Π³ΠΎ Π±ΠΈΡ‚Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ инструкции bsrl

#include <stdio.h>

#include <stdlib.h>


int main(int argc, char* argv[]) {

 long max = atoi(argv[1]);

 long number;

 unsigned position;

 volatile unsigned result;


 /* ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΡΠ΅ΠΌ вычислСния для большого количСства чисСл. */

 for (number = 1; number <= max; ++number) {

  /* ВычисляСм ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ ΡΡ‚Π°Ρ€ΡˆΠ΅Π³ΠΎ Π·Π½Π°Ρ‡Π°Ρ‰Π΅Π³ΠΎ Π±ΠΈΡ‚Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ

     ассСмблСрной инструкции bsrl. */

  asm("bsrl %1, %0" : "=r" (position) : "r" (number));

  result = position;

 }

 return 0;

}

Π‘ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌ ΠΎΠ±Π΅ вСрсии ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ:

% cc -O2 -ΠΎ bit-pos-loop bit-pos-loop.c

% cc -O2 -ΠΎ bit-pos-asm bit-pos-asm.c

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

% time ./bit-pos-loop 250000000

19.51user 0.00system 0:20.40elapsed 95%CPU (0avgtext+0avgdata

0maxresident)k0inputs+0outputs (73major+11minor)pagefaults 0swaps

% time ./bit-pos-asm 250000000

3.19user 0.00system 0:03.32elapsed 95%CPU (0avgtext+0avgdata

0maxresident)k0inputs+0outputs (73major+11minor)pagefaults 0swaps

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Π² зависимости ΠΎΡ‚ загруТСнности систСмы, Π½ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΎ Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ ассСмблСрная вСрсия выполняСтся Π³ΠΎΡ€Π°Π·Π΄ΠΎ быстрСС.

9.5. Вопросы ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ

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

ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ asm() ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ компилятор Π½Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚ сСмантику ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π² Π½Π΅ΠΉ ассСмблСрных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ. ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅ ΠΎΠ± этом!

9.6. Вопросы сопровоТдСния ΠΈ пСрСносимости

Если Π²Ρ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π½ΠΎ-зависимыС ассСмблСрныС вставки. помСститС ΠΈΡ… Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ макросы ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎ ΠΎΠ±Π»Π΅Π³Ρ‡ΠΈΡ‚ сопровоТдСниС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Когда всС макросы находятся Π² ΠΎΠ΄Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ ΠΈ Π·Π°Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π»Π΅Π³Ρ‡Π΅ Π±ΡƒΠ΄Π΅Ρ‚ пСрСнСсти Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ систСму, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ придСтся ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½-СдинствСнный Ρ„Π°ΠΉΠ». НапримСр, Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² asm() Π² исходных тСкстах Linux сгруппировано Π² Ρ„Π°ΠΉΠ»Π°Ρ… /usr/src/linux/include/asm ΠΈ /usr/src/linux/include/asm-i386.

Π“Π»Π°Π²Π° 10

Π‘Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ

Одним ΠΈΠ· основных достоинств Linux являСтся ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, Π² Ρ‚ΠΎΠΌ числС ΠΏΠΎ сСти. Но Ρƒ всякой ΠΌΠ΅Π΄Π°Π»ΠΈ Π΅ΡΡ‚ΡŒ обратная сторона. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС β€” это ΡƒΠ³Ρ€ΠΎΠ·Ρ‹ бСзопасности, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰ΠΈΠ΅, ΠΊΠΎΠ³Π΄Π° систСма ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Π° ΠΊ Internet. ΠŸΡ€ΠΈ благоприятном стСчСнии ΠΎΠ±ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΡΡ‚Π² Ρ…Π°ΠΊΠ΅Ρ€ смоТСт Π²ΠΎΠΉΡ‚ΠΈ Π² систСму ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ хранящиСся Π² Π½Π΅ΠΉ Ρ„Π°ΠΉΠ»Ρ‹. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, сами ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ систСмы ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ нСсанкционированный доступ ΠΊ Ρ‡ΡƒΠΆΠΈΠΌ Ρ„Π°ΠΉΠ»Π°ΠΌ.

Π’ ядрС Linux Π΅ΡΡ‚ΡŒ мноТСство срСдств, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΡ… ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ события. Но Π·Π°Ρ‰ΠΈΡ‰Π°Ρ‚ΡŒ слСдуСт ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ прилоТСния. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Ρ‡Ρ‚ΠΎ разрабатываСтся бухгалтСрская ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°. Π›ΡŽΠ±ΠΎΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΎΡ‚Ρ‡Π΅Ρ‚ ΠΎ расходах, Π½ΠΎ Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΡ€Π°Π²ΠΎ ΡƒΡ‚Π²Π΅Ρ€Π΄ΠΈΡ‚ΡŒ этот ΠΎΡ‚Ρ‡Π΅Ρ‚. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ своих Π·Π°Ρ€ΠΏΠ»Π°Ρ‚Π°Ρ…, Π½ΠΎ, СстСствСнно, Π½Π΅ ΠΎ Π·Π°Ρ€ΠΏΠ»Π°Ρ‚Π°Ρ… своих ΠΊΠΎΠ»Π»Π΅Π³. ΠœΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎ Π·Π°Ρ€ΠΏΠ»Π°Ρ‚Π°Ρ… слуТащих ΠΈΡ… ΠΎΡ‚Π΄Π΅Π»ΠΎΠ², Π½ΠΎ Π½Π΅ слуТащих Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΡ‚Π΄Π΅Π»ΠΎΠ².

ВсС эти ΠΌΠ΅Ρ€Ρ‹ прСдостороТности Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ особого внимания. ΠžΡ‡Π΅Π½ΡŒ Π»Π΅Π³ΠΊΠΎ Π΄ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ, ΠΈΠ·-Π·Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ смогут Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΈΠΌ Π½Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π»ΡƒΡ‡ΡˆΠ΅ всСго Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ экспСртов ΠΏΠΎ систСмам бСзопасности. Но Π±Π°Π·ΠΎΠ²Ρ‹ΠΌΠΈ знаниями Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Π»Π°Π΄Π΅Ρ‚ΡŒ любой Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния.

10.1. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΈ Π³Ρ€ΡƒΠΏΠΏΡ‹

Π’ Linux ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ назначаСтся ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π½ΠΎΠΌΠ΅Ρ€, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ Π΅Π³ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ (UID, user identifier). ΠŸΡ€ΠΈ рСгистрации Π² систСмС, СстСствСнно, вводится имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Π° Π½Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€. БистСма ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ Π²Π²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ имя Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΈ дальшС Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с Π½ΠΈΠΌ.

Π‘ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ связано нСсколько ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΈΠΌΠ΅Π½. Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния систСмы это Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ значСния ΠΈ Π½Π΅ прСдставляСт для Π½Π΅Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹: ΠΎΠ½Π° ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ ΠΈΠΌΠ΅Π½Π° ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Ρ€Π°Π²Π½ΠΎΠΏΡ€Π°Π²Π½Ρ‹, Ссли ΠΈΠΌ соотвСтствуСт ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€.

Доступ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ рСсурсу контролируСтся ΠΏΡƒΡ‚Π΅ΠΌ закрСплСния Π·Π° Π½ΠΈΠΌ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Волько ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ с этим ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ доступ ΠΊ рСсурсу. НапримСр, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ для чтСния лишь Π΅Π³ΠΎ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Ρƒ, Π»ΠΈΠ±ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π»Π°Π΄Π΅Π»Π΅Ρ† смоТСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹. Π­Ρ‚ΠΎ самыС простыС способы Π·Π°Ρ‰ΠΈΡ‚Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ….

Иногда трСбуСтся Π΄Π΅Π»ΠΈΡ‚ΡŒ рСсурсы с нСсколькими ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΈ. К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ», ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ для чтСния Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π°ΠΌΠΈ, Π½ΠΎ Π½Π΅ рядовыми слуТащими. ОБ Linux Π½Π΅ позволяСт Π·Π°ΠΊΡ€Π΅ΠΏΠ»ΡΡ‚ΡŒ Π·Π° Ρ„Π°ΠΉΠ»ΠΎΠΌ нСсколько ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ², поэтому нСльзя Π·Π°Π΄Π°Ρ‚ΡŒ список Π»ΠΈΡ†, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ… доступ ΠΊ Π΄Π°Π½Π½ΠΎΠΌΡƒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌΡƒ Ρ„Π°ΠΉΠ»Ρƒ.

Но Π²Ρ‹Ρ…ΠΎΠ΄ всС ΠΆΠ΅ Π΅ΡΡ‚ΡŒ β€” это созданиС Π³Ρ€ΡƒΠΏΠΏΡ‹. Π•ΠΉ Ρ‚Π°ΠΊΠΆΠ΅ назначаСтся ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π½ΠΎΠΌΠ΅Ρ€, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ Π³Ρ€ΡƒΠΏΠΏΡ‹ (GID, group identifier). Π’ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Π³Ρ€ΡƒΠΏΠΏΡƒ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ нСсколько ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ. Один ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‡Π»Π΅Π½ΠΎΠΌ мноТСства Π³Ρ€ΡƒΠΏΠΏ, Π½ΠΎ Ρ‡Π»Π΅Π½Π°ΠΌΠΈ Π³Ρ€ΡƒΠΏΠΏ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π³Ρ€ΡƒΠΏΠΏΡ‹. Π£ Π³Ρ€ΡƒΠΏΠΏ, ΠΊΠ°ΠΊ ΠΈ Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, Π΅ΡΡ‚ΡŒ ΠΈΠΌΠ΅Π½Π°, Π½ΠΎ ΠΎΠ½ΠΈ Π½Π΅ ΠΈΠ³Ρ€Π°ΡŽΡ‚ практичСски Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Ρ€ΠΎΠ»ΠΈ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ систСма Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°ΠΌΠΈ Π³Ρ€ΡƒΠΏΠΏ.

НапримСр, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π³Ρ€ΡƒΠΏΠΏΡƒ managers ΠΈ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π² Π½Π΅Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ всСх ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠ² ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ. Π’ΠΎΠ³Π΄Π° любой Ρ„Π°ΠΉΠ», ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΠΉ этой Π³Ρ€ΡƒΠΏΠΏΠ΅, Π±ΡƒΠ΄Π΅Ρ‚ доступСн Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π°ΠΌ ΠΈ Π½ΠΈΠΊΠΎΠΌΡƒ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ. Всякому систСмному рСсурсу соотвСтствуСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Π° Π³Ρ€ΡƒΠΏΠΏΠ°.

Команда id позволяСт ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ Π³Ρ€ΡƒΠΏΠΏΡ‹, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ Π²Ρ…ΠΎΠ΄ΠΈΡ‚:

% id

uid=501(mitchell) gid=501(mitchell) groups=501(mitchell), 503(csl)

Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΉ части Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΡƒΠΊΠ°Π·Π°Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Ρ€Π°Π²Π΅Π½ 501. Π’ скобках ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ этому ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρƒ имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Как слСдуСт ΠΈΠ· Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ mitchell Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² Π΄Π²Π΅ Π³Ρ€ΡƒΠΏΠΏΡ‹: с Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ 501 (mitchell) ΠΈ с Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ 503 (csl). Π§ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡƒΠ΄ΠΈΠ²Π»Π΅Π½Ρ‹ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π³Ρ€ΡƒΠΏΠΏΠ° 501 появляСтся Π΄Π²Π°ΠΆΠ΄Ρ‹: Π² ΠΏΠΎΠ»Π΅ gid ΠΈ Π² ΠΏΠΎΠ»Π΅ groups. ОбъяснСниС этому Ρ„Π°ΠΊΡ‚Ρƒ Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π°Π½ΠΎ ΠΏΠΎΠ·ΠΆΠ΅.