рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕рд░реНрд╡рд╡реНрдпрд╛рдкреА "рдЖрдВрдЦреЛрдВ" рд╕реЗ рдХрд░реНрдиреЗрд▓ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдореЗрдВ рдХрдИ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд▓реЗрдЦ
рдбреАрдХреЗрдУрдПрдо (рдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░реНрдиреЗрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдореИрдирд┐рдкреБрд▓реЗрд╢рди) рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реИ - рдПрдХ рдРрд╕реА рддрдХрдиреАрдХ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдХрд░реНрдиреЗрд▓ рдХреА рдЖрдВрддрд░рд┐рдХ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдХреЗ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред
рдЕрдЧрд▓рд╛, рд╣рдо рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рджреГрд╢реНрдп рд╕рдВрдХреЗрддреЛрдВ рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрдХрдиреАрдХ рдХреЗ рдЖрд╡реЗрджрди рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдФрд░, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЗрд╕реЗ рдЙрддрд╛рд░рдиреЗ рдХреА рдЕрд╕рдВрднрд╡рддрд╛ред
рдЬреИрд╕рд╛ рдХрд┐ рдирд╛рдо рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ, DKOM рдХрд╛ рдЖрдзрд╛рд░ рдХрд░реНрдиреЗрд▓ рдХреА рдЖрдВрддрд░рд┐рдХ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рджреМрд░ рд╕реЗ рдЧреБрдЬрд░рдиреЗ рд╡рд╛рд▓реА рд╕рдВрд░рдЪрдирд╛
рдореЙрдбреНрдпреВрд▓ рдХреА рдПрдХ рдЖрдВрддрд░рд┐рдХ
рд╕реВрдЪреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд▓реЛрдб рд╕рднреА
рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдВрдХ рд╣реЛрддреЗ рд╣реИрдВред
рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдХреА рдкреНрд░рд╕реНрддреБрддрд┐
рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдореЙрдбреНрдпреВрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╕рдВрд░рдЪрдирд╛ рдЙрд╕реА рдирд╛рдо рдХреА рд╕рдВрд░рдЪрдирд╛ рд╣реИ, рдЬрд┐рд╕реЗ
рд▓рд┐рдирдХреНрд╕ / рдореЙрдбреНрдпреВрд▓.рдПрдЪ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
223 struct module 224 { 225 enum module_state state; 226 227 228 struct list_head list; 229 230 231 char name[MODULE_NAME_LEN]; ... 378 };
рдЕрдиреНрдп рдмрд╛рддреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ
list
рдлрд╝реАрд▓реНрдб рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬреЛ рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪреА рдХрд╛ рдПрдХ рддрддреНрд╡ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдпрд╣ рдореЙрдбреНрдпреВрд▓ рдХрд░реНрдиреЗрд▓ рдореЙрдбреНрдпреВрд▓ рдХреА рд╕рд╛рдорд╛рдиреНрдп рд╕реВрдЪреА рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рдЙрддреНрддрд░рд╛рд░реНрджреНрдз, рдмрджрд▓реЗ рдореЗрдВ,
рдХрд░реНрдиреЗрд▓ / рдореЙрдбреНрдпреВрд▓ред рд╕реАред рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдШреЛрд╖рд┐рдд рдПрдХ рдЖрдВрддрд░рд┐рдХ рдЧреИрд░-рдирд┐рд░реНрдпрд╛рдд рд╕реВрдЪреА рд╣реИ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд (рдирд┐рд░реНрдпрд╛рдд)
mxx рджреНрд╡рд╛рд░рд╛ рд╕рдВрд░рдХреНрд╖рд┐рдд рд╣реИ:
103 DEFINE_MUTEX(module_mutex); 104 EXPORT_SYMBOL_GPL(module_mutex); 105 static LIST_HEAD(modules);
рдореЙрдбреНрдпреВрд▓ рд▓реЛрдб рдХрд░рддреЗ рд╕рдордп, рдХрд░реНрдиреЗрд▓ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЕрдкрдиреА рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЬрдм рдЙрддрд╛рд░рдирд╛ - рдмрд╛рд╣рд░ рдХрд░рдирд╛ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЗрд╕ рддрд░рд╣ рдХреА рдЖрдВрддрд░рд┐рдХ рд╕реВрдЪреА рдХреЗ рдХрд░реНрдиреЗрд▓ рджреНрд╡рд╛рд░рд╛ рдПрдХ рддрд░рд╣ рд╕реЗ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рд▓реЛрдб рдХрд┐рдП рдЧрдП рдореЙрдбреНрдпреВрд▓ рдХреА рдЧрдгрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╡рд╛рд▓реЗ рд╕рднреА рдСрдкрд░реЗрд╢рдиред
рд▓реЛрдб рдХрд┐рдП рдЧрдП рдореЙрдбреНрдпреВрд▓ рдХреА рдЧрдгрдирд╛
рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд▓реЛрдб рдХрд┐рдП рдЧрдП рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣
THIS_MODULE
рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЙрдбреНрдпреВрд▓ рдХреЗ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред рдкрд╣рд▓реЗ рдорд╛рдирд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛
list
рдХреНрд╖реЗрддреНрд░, рдХрд░реНрдиреЗрд▓ рдХреЗ рдЖрдВрддреНрд░ рдореЗрдВ рдХрд╣реАрдВ рд╕реНрдерд┐рдд рд╣реЗрдб рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЗ рд╕рд╛рде рдореЙрдбреНрдпреВрд▓ рдХреА рд╕рд╛рдорд╛рдиреНрдп рд╕реВрдЪреА рдХрд╛ рдПрдХ рддрддреНрд╡ рд╣реЛрдЧрд╛ред рддреЛ, рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд▓реЛрдб рдХрд┐рдП рдЧрдП рдореЙрдбреНрдпреВрд▓ рдХреА рд╕реВрдЪреА рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп
рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ :
static void list_modules(void) { struct module * mod; struct list_head * pos; while(!mutex_trylock(&module_mutex)) cpu_relax(); debug("List of available modules:\n"); list_for_each(pos, &THIS_MODULE->list) { bool head = (unsigned long)pos >= MODULES_VADDR; mod = container_of(pos, struct module, list); debug(" pos:%pK mod:%pK [%s]\n", pos, \ head ? mod : 0, head ? mod->name : "<- looking for"); } mutex_unlock(&module_mutex); }
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕рдВрдмрдВрдзрд┐рдд рдореНрдпреВрдЯреЗрдХреНрд╕ рдХреЛ рдкрдХрдбрд╝рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рддрд╛рдХрд┐ рдЕрдЧрд░ рдХрд┐рд╕реА рдореЙрдбреНрдпреВрд▓ рдХреЗ рдХрд┐рд╕реА рдПрдХ рдХреЛ рдЙрддрд╛рд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рди рд╣реЛред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЧрдгрдирд╛ рдореЗрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рд╕реВрдЪреА рдХреЗ рдкреНрд░рдореБрдЦ -
рдореЙрдбреНрдпреВрд▓ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдкрддреЗ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рд╣реИред рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреА рдЦрд╝рд╛рд╕рд┐рдпрдд рдХреЗ рдХрд╛рд░рдг, рд╕рд┐рд░ рдХрд┐рд╕реА рднреА рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдЬреБрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреЗ рдмрд╛рдж рд╕реЗ рдпрджрд┐ рдореЙрдбреНрдпреВрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЛ рдореЙрдбреНрдпреВрд▓ рд░реЗрдВрдЬ (
MODULES_VADDR -
MODULES_END ) рдХреЗ рдкрддреЗ рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдХрд┐ рдХреНрдпрд╛ рдкрддрд╛ рдЗрд╕ рд╕реАрдорд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рддреБрдЪреНрдЫ рд╣реИред рдЗрд╕ рдХрд╛рд░реНрдп рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдорд╢реАрдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдкрд░:
[11025.656372] [findme] List of available modules: [11025.656377] [findme] pos:ffffffffa02a7388 mod:ffffffffa02a7380 [ipheth] [11025.656380] [findme] pos:ffffffffa02b9108 mod:ffffffffa02b9100 [pci_stub] [11025.656382] [findme] pos:ffffffffa01e7028 mod:ffffffffa01e7020 [vboxpci] [11025.656385] [findme] pos:ffffffffa01dd148 mod:ffffffffa01dd140 [vboxnetadp] [11025.656387] [findme] pos:ffffffffa01d4028 mod:ffffffffa01d4020 [vboxnetflt] ... [11025.656477] [findme] pos:ffffffffa00205c8 mod:ffffffffa00205c0 [3c59x] [11025.656480] [findme] pos:ffffffffa000c108 mod:ffffffffa000c100 [r8169] [11025.656483] [findme] pos:ffffffff81c2daf0 mod:0000000000000000 [<- looking for]
рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ рд╡рд╛рдВрдЫрд┐рдд рд╕рдВрд░рдЪрдирд╛
ffffffff81c2daf0
рдкрд░ рд╕реНрдерд┐рдд рд╣реИ, рдЬрд┐рд╕реЗ
ffffffff81c2daf0
рджреНрд╡рд╛рд░рд╛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХрд┐рд╕реА рднреА рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ, рд╕реВрдЪреА рдЖрдЗрдЯрдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЫрдВрдЯрдиреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдореВрд▓ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЙрдбреНрдпреВрд▓ (
ffffffff81xxxxxx
рдмрдирд╛рдо
ffffffffa0xxxxxx
) рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдкрддрд╛ рд╣реЛрдЧреА, рдЬрд┐рд╕рдХрд╛
рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
struct list_head * get_modules_head(void) { struct list_head * pos; while(!mutex_trylock(&module_mutex)) cpu_relax(); list_for_each(pos, &THIS_MODULE->list) { if ((unsigned long)pos < MODULES_VADDR) { break; } } mutex_unlock(&module_mutex); if (pos) { debug("Found \"modules\" head @ %pK\n", pos); } else { debug("Can't find \"modules\" head, aborting\n"); } return pos; }
рдореЙрдбреНрдпреВрд▓ рд╕реВрдЪреА рд╣реЗрд░рдлреЗрд░
рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдХреА рдЪрд┐рдВрддрд╛, рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕реВрдЪреА рд╕реЗ рдХрд┐рд╕реА рдЖрдЗрдЯрдо рдХреЛ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдЗрд╕ рдЖрдЗрдЯрдо рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдЪреАрдЬ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдкреБрдирд░реНрд╕реНрдерд╛рдкрдирд╛ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдореМрдЬреВрджрд╛ рд╕реВрдЪреА рдЖрдЗрдЯрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдореВрд▓ рддрддреНрд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЫрд┐рдкрд╛рдирд╛ рдФрд░ рдлрд┐рд░ рд╕реЗ рдЬреЛрдбрд╝рдирд╛
рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ :
static void hide_or_show(int new) { while(!mutex_trylock(&module_mutex)) cpu_relax(); if (new == 1) { list_del(&THIS_MODULE->list); debug("Module \"%s\" unlinked\n", THIS_MODULE->name); } else { list_add(&THIS_MODULE->list, p_modules); debug("Module \"%s\" linked again\n", THIS_MODULE->name); } mutex_unlock(&module_mutex); }
рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЙрдирдХреА рд╕реВрдЪреА рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
list_del рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рджреВрд╕рд░реЗ рдореЗрдВ,
list_add ред рд╕рдВрдмрдВрдзрд┐рдд рдореНрдпреВрдЯреЗрдХреНрд╕ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░рдХреЗ рджреЛрдиреЛрдВ рд╕рдВрдЪрд╛рд▓рди рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИрдВред
рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╣рд┐рд╕реНрд╕рд╛
рддреИрдпрд╛рд░
рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдХреЛрдб рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдорд╛рд╕реНрдХрд┐рдВрдЧ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрд╕реЗ
make
рдФрд░
insmod
рдорд╛рдзреНрдпрдо рд╕реЗ рдорд╛рдирдХ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рд▓реЛрдб рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж, рдореЙрдбреНрдпреВрд▓
lsmod
рдпрд╛
lsmod
рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛ред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдорд╛рд╕реНрдХрд┐рдВрдЧ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдПрдХ рдХреНрд░рдо рд╣реИ:
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдореВрд▓ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЪреБрднрддреА рдЖрдВрдЦреЛрдВ рд╕реЗ рдмрд╕ рдЫрд┐рдкрд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИред рдкреНрд░рд╕реНрддреБрдд
рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХреЛрдб рд╣реИред
рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП
1.
рдкреНрд░рддреНрдпрдХреНрд╖ рдХрд░реНрдиреЗрд▓ рд╡рд╕реНрддреБ рд╣реЗрд░рдлреЗрд░2.
рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рд▓рд┐рдВрдХреНрдб рд╕реВрдЪреА рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛3.
рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрди - рднрд╛рдЧ 2