рд╣рдо L4 рдорд╛рдЗрдХреНрд░реЛрдХрд░реНрдирд▓ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ Xameleon рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП "рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб" рдПрдкреНрд▓реАрдХреЗрд╢рди рд▓рд┐рдЦрддреЗ рд╣реИрдВ

рдпрджрд┐ рдЖрдкрдиреЗ рдХрднреА рд╕реА рднрд╛рд╖рд╛ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛ рд╣реИ рдпрд╛ рдПрдХ рдирдП рд╡рд┐рдХрд╛рд╕ рдХреЗ рдорд╛рд╣реМрд▓ рдореЗрдВ рдЖрдпрд╛ рд╣реИ, рддреЛ рдЖрдкрдиреЗ рд╢рд╛рдпрдж рдХрдо рд╕реЗ рдХрдо рдПрдХ рдмрд╛рд░ "рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб" рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рд░рд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд▓рд┐рдЦрд╛ рд╣реИред рддреЛ, рд╕реА рднрд╛рд╖рд╛ рдореЗрдВ рд╕рдВрднрд╡ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ:

#include <stdio.h>
int main(int argc, char * argv[], char * envp[])
{
puts("Hello world!");
return 0;
}

рд╣рдо рдЗрд╕ рдХреЛрдб рдХреЛ "hello.c" рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВрдЧреЗ рдФрд░ gcc рд╕рдВрдХрд▓рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВрдЧреЗ:
gcc hello.c -o hello

рдирддреАрдЬрддрди, рдпрджрд┐ рдХрдВрдкрд╛рдЗрд▓рд░, рд╣реЗрдбрд░ рдлрд╛рдЗрд▓реЗрдВ рдФрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЖрдкрдХреЗ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рд╣реИрд▓реЛ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдорд┐рд▓рддрд╛ рд╣реИред рдЪрд▓реЛ рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:
./hello

рдкреНрд░рд╛рдердорд┐рдХ? рдЬрдм рддрдХ рдЖрдк рдЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдмрдирд╛рдиреЗ рдФрд░ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рдирд╣реАрдВ рд▓реЗрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд▓рд┐рдЦрд┐рдд рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВред рдЖрдЧреЗ, рдореИрдВ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдФрд░ рд╢рд░реНрдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ рдХрд┐ рд╣рд░ рдХрд┐рд╕реА рдХреЛ рд▓реЗрдЦ рдХреЛ рдЕрдВрдд рддрдХ рдкрдврд╝рдиреЗ рдХреА рддрд╛рдХрдд рдирд╣реАрдВ рдорд┐рд▓реЗрдЧреАред

рдкрд╣рд▓рд╛, рдереЛрдбрд╝рд╛ рд╕рд┐рджреНрдзрд╛рдВрдд рдФрд░ рд╕рд░рд▓ рдЪреАрдЬреЗрдВред рдЖрдЗрдП рдПрдХ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
gcc -c hello.c
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдореЗрдВ hello.o рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓ рдорд┐рд▓рддреА рд╣реИред рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреНрдпрд╛ рд╣реИ? рдЙрдирдХрд╛ рдХреЛрдб рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд╣реИ, рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдЖрдпрд╛рддрд┐рдд рдФрд░ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рдВрд╕ рдФрд░ рдЪрд░ рдХреЗ рдЯреЗрдмрд▓ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░, рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдХреЛрдб рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рдмрд╣реБрдд рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░реЛрд╕реЗрд╕рд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рд╕реЗ рдмрдВрдзрд╛ рд╣реИред рдпрд╣ рдХреНрдпреЛрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдореИрдВ рдЖрдкрдХреЛ рдмрд╛рдж рдореЗрдВ рдмрддрд╛рдКрдВрдЧрд╛, рдФрд░ рдЕрдм рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:
objdump -hxS hello.o

рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓ рд╣реИрдбрд░
hello.o: file format elf32-i386
hello.o
architecture: i386, flags 0x00000011:
HAS_RELOC, HAS_SYMS
start address 0x00000000

рдкреНрд░рдпреБрдХреНрдд рдЕрдиреБрднрд╛рдЧ рдФрд░ рдЙрдирдХреЗ рдЖрдХрд╛рд░
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 0000002e 00000000 00000000 00000034 2**2
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
1 .data 00000000 00000000 00000000 00000064 2**2
CONTENTS, ALLOC, LOAD, DATA
2 .bss 00000000 00000000 00000000 00000064 2**2
ALLOC
3 .rodata 0000000d 00000000 00000000 00000064 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
4 .comment 00000012 00000000 00000000 00000071 2**0
CONTENTS, READONLY
5 .note.GNU-stack 00000000 00000000 00000000 00000083 2**0
CONTENTS, READONLY

.Text рд╕реЗрдХреНрд╢рди рдореЗрдВ рд╣реИрд▓реЛ рдореБрдЦреНрдп рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдХреЛрдб рдХреЛрдб рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЙрджрд╛рд╣рд░рдг рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛрдб рдХрд╛ рдЖрдХрд╛рд░ 46 рдмрд╛рдЗрдЯреНрд╕ (0x24) рд╣реИ рддрд┐рдерд┐ рдЦрдВрдб рдЦрд╛рд▓реА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░рд╛ рдЙрджрд╛рд╣рд░рдг рд╕реНрдерд┐рд░ рдФрд░ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рдЦрдВрдб рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрдВрдЧреЗред рдЕрдВрдд рдореЗрдВ, 13-рдмрд╛рдЗрдЯ (0xd) .рд░реЛрдбрд╛рдЯрд╛ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ "рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб!" рд╣реИред

рдирд┐рд░реНрдпрд╛рдд рдФрд░ рдЖрдпрд╛рддрд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреА рддрд╛рд▓рд┐рдХрд╛
SYMBOL TABLE:
00000000 l df *ABS* 00000000 hello.c
00000000 ld .text 00000000 .text
00000000 ld .data 00000000 .data
00000000 ld .bss 00000000 .bss
00000000 ld .rodata 00000000 .rodata
00000000 ld .note.GNU-stack 00000000 .note.GNU-stack
00000000 ld .comment 00000000 .comment
00000000 g F .text 0000002e main
00000000 *UND* 00000000 puts

рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ, рд╣рдо рдЕрдВрддрд┐рдо рджреЛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ - рдореБрдЦреНрдп рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╡рд░реНрдгрди, рдЬреЛ рд╣рдорд╛рд░реЗ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдмрд╛рд╣рд░реА рдкреБрдЯ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╡рд░реНрдгрди, рдЬрд┐рд╕реЗ рдХрд╣реАрдВ рдФрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдпрджрд┐ рдЖрдк рд▓рд┐рдирдХреНрд╕ рдХреЗ рддрд╣рдд рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓ FreeBSD рдХреЗ рддрд╣рдд рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рддреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рд╕рддреНрдп рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрддред рдЕрдм рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдХреЛрдб рдХреЛрдб рдХреЛ рджреЗрдЦреЗрдВ hello.c

рдЦрдВрдб рдХреА рд╕рдорд╛рдкреНрддрд┐
00000000 <main>:
0: 8d 4c 24 04 lea 0x4(%esp),%ecx
4: 83 e4 f0 and $0xfffffff0,%esp
7: ff 71 fc pushl -0x4(%ecx)
a: 55 push %ebp
b: 89 e5 mov %esp,%ebp
d: 51 push %ecx
e: 83 ec 04 sub $0x4,%esp
11: 83 ec 0c sub $0xc,%esp
14: 68 00 00 00 00 push $0x0
15: R_386_32 .rodata
19: e8 fc ff ff ff call 1a <main+0x1a>
1a: R_386_PC32 puts
1e: 83 c4 10 add $0x10,%esp
21: b8 00 00 00 00 mov $0x0,%eax
26: 8b 4d fc mov -0x4(%ebp),%ecx
29: c9 leave
2a: 8d 61 fc lea -0x4(%ecx),%esp
2d: c3 ret


* This source code was highlighted with Source Code Highlighter .
рджрд░рдЕрд╕рд▓, рдпрд╣ рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдХреЛрдб рдХреЛрдб рд╣реИред рд╡реИрд╕реЗ, рдПрдЯреА рдПрдВрдб рдЯреА рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╢реИрд▓реА рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ :)

рдпрд╣ рд╕рд░рд▓ рдерд╛, рдФрд░ рдЕрдм рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЪреАрдЬреЛрдВ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред рд▓реЗрдЦ рдореЗрдВ рдмрд╣реБрдд рдкрд╣рд▓рд╛ рдЙрджрд╛рд╣рд░рдг рдЖрдкрдХреЗ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдЧрд╛ред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕реНрд▓реИрдХрд╡реЗрдпрд░ рд▓рд┐рдирдХреНрд╕ред рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдкреНрд░реЛрд╕реЗрд╕рд░ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдереЛрдбрд╝рд╛ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИред рдкрд░рд┐рдгрд╛рдореА рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓ рд╕реЗ Xameleon рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдХреИрд╕реЗ рдмрдирд╛рдПрдВ? рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЧрд┐рд░рдЧрд┐рдЯ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд▓рд┐рдВрдХ (рдХреНрд▓рд┐рдХ) рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, stdio.h рд╢реАрд░реНрд╖ рд▓реЗрдЦ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреБрдЯ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреБрдЯреНрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреНрдпрд╛ рд╣реИ? рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдПрдХ рд▓рд╛рдЗрди рдФрд░ рдПрдХ рдорд╛рдирдХ рдлрд╝реАрдб рдХреЛ рдПрдХ рдЖрдЙрдЯрдкреБрдЯ рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреБрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

int puts(char * str)
{
int status, len;

len = strlen(str); //
status = write( 1, str, len ); //
if( status == len ) status = write( 1, "\n", 1 ); // ,
if( status ==1 ) status += len;
return status;
}

рдЖрдк "рдЕрдВрддрд╣реАрди рд░реВрдк рд╕реЗ" рдорд╛рдирд╣рд╛рдирд┐ рдХреЗ рдЬрдВрдЧрд▓ рдореЗрдВ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд▓реЗрдЦ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдпрд╣ рджрд┐рдЦрд╛рдирд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЧрд┐рд░рдЧрд┐рдЯ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╡реИрд╕реЗ, рдкреБрдЯреНрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдЗрд╖реНрдЯрддрдо рд╣реЛрдиреЗ рдХрд╛ рджрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рддрд╛ рд╣реИред рдЖрдк рдХреЗрд╡рд▓ рдЗрд╕ рдмрд╛рдд рдкрд░ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЧрд┐рд░рдЧрд┐рдЯ рдХреЗ рдкрд░рд┐рд╡рд╛рдж рдХреЛ рдЕрдзрд┐рдХ рдЖрд╢рд╛ рдХреЗ рд╕рд╛рде рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдо рдХрд╣рд╛рдиреА рдХреЗ рд╡рд┐рд╖рдп рд╕реЗ рд╣рдЯрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╡реНрдпрд╡рд╕рд╛рдп рдкрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯрддреЗ рд╣реИрдВ рдФрд░ рд▓реЗрдЦрди рд╕рдорд╛рд░реЛрд╣ рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди POSIX рдорд╛рдирдХ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╡рд╣ рд╣реИ рдЬреЛ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдЕрдкрдиреА рдореЗрдореЛрд░реА рдХреЛ рд░рд┐рдлреНрд░реЗрд╢ рдХрд░реЗрдВ: рдЖрджрдореА 2 рд▓рд┐рдЦрддрд╛ рд╣реИ

#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);

рд╣рдорд╛рд░рд╛ рдЙрджрд╛рд╣рд░рдг рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдирдВрдмрд░ 1 рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрддрд╛ рд╣реИ, рдЬреЛ рдорд╛рдирдХ рд╕реЗ рдорд╛рдирдХ рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд▓рд┐рдП рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реИред Bf рдкреИрд░рд╛рдореАрдЯрд░ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд╡рд╛рд▓реЗ рдореЗрдореЛрд░реА рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реИ (рд╣рд╛рдВ, рд╕реНрдЯреНрд░рд┐рдВрдЧ "рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб") рдХрд╛ рдкрддрд╛ рд╣реЛрдЧрд╛ред рддреАрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдЖрдЙрдЯрдкреБрдЯ рдбреЗрдЯрд╛ рдХрд╛ рдЖрдХрд╛рд░ рд╣реИред

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдХреНрдпрд╛ рдЕрд▓рдЧ рдмрдирд╛рддрд╛ рд╣реИ?
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╣реЗрдЧрд╛: "рд▓реЗрдЦрди рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдЦреБрд▓реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдбреЗрдЯрд╛ рдХреА рдПрдХ рд╕рд░рдгреА рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддрд╛ рд╣реИред" рд╕рд┐рд╕реНрдЯрдо рдЬрд╡рд╛рдм рджреЗрдЧрд╛: "рд▓реЗрдЦрди рдлрд╝рдВрдХреНрд╢рди рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдлрд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░, рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИред" рджреЛрдиреЛрдВ рд╕рд╣реА рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕ рдмреНрд▓реЙрдЧ рдХреЛ рдХреНрдпрд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред :)

рдЗрд╕рд▓рд┐рдП, рд╣рдо рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдлрд╝рдВрдХреНрд╢рди рд░рд╛рдЗрдЯрд┐рдВрдЧ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдХрд░реНрдиреЗрд▓ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд╣реЛрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдЧрд┐рд░рдЧрд┐рдЯ рдкреНрд░рдгрд╛рд▓реА рдХреЛ L4 рдкрд┐рд╕реНрддрд╛ рдорд╛рдЗрдХреНрд░реЛрдХреНрд░рд╛рдЗрди рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рджреЛ рдЪрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ IPC рд╣реИ:
  1. рдЯреНрд░рд╛рдВрд╕рдлрд░ рдЪрд░рдг - рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рд╕реЗрд╡рд╛ рдореЗрдВ рдЯреНрд░рд╛рдВрд╕рдлрд░ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рд░рд╛рдЗрдЯ рдлрд╝рдВрдХреНрд╢рди, рдлрд╝рд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдФрд░ рдПрд▓ 4 рд▓рд╛рдЗрди - рдПрдХ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬреЛ рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред
  2. рд░рд┐рд╕реЗрдкреНрд╢рди рдЪрд░рдг - рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рд╕реЗрд╡рд╛ рд╕реЗ рдСрдкрд░реЗрд╢рди рдХреА рд╕реНрдерд┐рддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред


рдЧрд┐рд░рдЧрд┐рдЯ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ, рд▓реЗрдЦрди рдкреНрд░рдгрд╛рд▓реА рдХреЙрд▓ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╡рд░реНрдгрд┐рдд рд╣реИред

рдЗрд╕ рддрд░рд╣, POSIX рд╕рд┐рд╕реНрдЯрдо IPC рдХреЛ рдХреЙрд▓ рдЯреНрд░рд╛рдВрд╕рд▓реЗрдЯ рд▓рд┐рдЦрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рджрд┐рдП рдЧрдП рдЪрд┐рддреНрд░ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб, рдЬреЛ рдПрдХ рддрд░рдл, POSIX рд░рд╛рдЗрдЯ () рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рджреВрд╕рд░реА рдУрд░, рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдХрд░реНрдиреЗрд▓ рдХреЗ рд╕рд╛рде рд╕рд╣рднрд╛рдЧрд┐рддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:

ssize_t write(
int nFileDescriptor,
const void * pBuffer,
size_t nBytesWrite )
{
int nStatus;
int nChunk;
int nTotalSent;
char * pPointer;

L4_MsgTag_t tag;
L4_Msg_t msg;
L4_StringItem_t SendString;

nStatus = nTotalSent = 0;
pPointer = ( char *) pBuffer;

while ( nBytesWrite )
{
nChunk = (nBytesWrite > 4096) ? 4096 : nBytesWrite;
SendString = L4_StringItem ( nChunk, ( void *) pPointer );

L4_Clear( &msg );
L4_Set_Label( &msg, fsWriteFile );
L4_Append( &msg, nFileDescriptor );
L4_Append( &msg, &SendString );
L4_Load( &msg );
tag = L4_Call( fs_service_id );
if ( L4_IpcFailed(tag) )
{
nStatus = nTotalSent ? nTotalSent : XAM_EINTR;
break ;
}
else
{
L4_Store( tag, &msg );
nStatus = L4_Get( &msg, 0 );
if ( nStatus < 0 ) break;
nTotalSent += nStatus;
}

pPointer += nChunk;
nBytesWrite -= nChunk;
}

// POSIX workaround
if ( nStatus < 0 )
{
errno = nStatus;
nStatus = -1;
}
else
{
nStatus = nTotalSent;
}

return nStatus;
}


* This source code was highlighted with Source Code Highlighter .


рдпрд╣ рд▓рд╛рд▓рдЪреА рдЧрд┐рд░рдЧрд┐рдЯ рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╕реЗ рдХреБрдЫ рдирдпрд╛ рд▓рдЧрддрд╛ рд╣реИред рдЖрдЗрдП рдХреЛрдб рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рд╕реЗ WriteFile рдХреЙрд▓ рд╕реЗ рдХреИрд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред рдЖрдкрдХреА рдЖрдВрдЦ рдХреЛ рдкрдХрдбрд╝рдиреЗ рд╡рд╛рд▓реА рдкрд╣рд▓реА рдЪреАрдЬ рдмрдлрд░ рдЖрдХрд╛рд░ рдХреА рд╕реАрдорд╛ 4 рдХрд┐рд▓реЛрдмрд╛рдЗрдЯ рд╣реИред рдпрд╣ рдкреНрд░рддрд┐рдмрдВрдз рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдореЙрдбреНрдпреВрд▓ рдХреЛ рдбрд┐рдЬрд╛рдЗрди рдХрд░рдиреЗ рдХреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ - рдпрд╣ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдбреЗрдЯрд╛ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдЬреЛ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рд╕реЗрд╡рд╛ рдХреЗ рдкрддрд╛ рд╕реНрдерд╛рди рдореЗрдВ рдЕрдиреБрд░реЛрдз рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдкреГрд╖реНрдареЛрдВ рдХрд╛ рдЕрд╕реНрдерд╛рдпреА рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рд╕рд░рд▓ рд╣реИрд▓реЛ рджреБрдирд┐рдпрд╛ рд╕реЗ рдмрд╣реБрдд рдЖрдЧреЗ рдЬрд╛рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред
рдирд┐рдореНрди рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╕рдВрджреЗрд╢ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ L4 рдкрд┐рд╕реНрддрд╛ рдорд╛рдЗрдХреНрд░реЛрдЗрдХреНрдпреБрд▓рд░ рд╕рдВрд░рдЪрдирд╛рдПрдВ рд╣реИрдВ

рдЗрди рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рд╕рдВрджреЗрд╢ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓, L4 рдкрд┐рд╕реНрддрд╛ рдорд╛рдЗрдХреНрд░реЛ-рдХрд░реНрдиреЗрд▓ред

рдирд┐рдореНрди рдХреЛрдб рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рд╕реЗрд╡рд╛ рдореЗрдВ рд╕рдВрдЪрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрджреЗрд╢ рддреИрдпрд╛рд░ рдХрд░рддрд╛ рд╣реИ:
SendString = L4_StringItem ( nChunk, (void*) pPointer ); //
L4_Clear( &msg ); //
L4_Set_Label( &msg, fsWriteFile ); //
L4_Append( &msg, nFileDescriptor ); //
L4_Append( &msg, &SendString ); //
L4_Load( &msg ); //


рдЗрд╕рдХреЗ рдмрд╛рдж рдорд╛рдЗрдХреНрд░реЛрдХрд░реНрдирд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдЖрддрд╛ рд╣реИ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрдВрдЯрд░ рдкреНрд░реЛрд╕реЗрд╕ рдХрдореНрдпреБрдирд┐рдХреЗрд╢рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ

tag = L4_Call( fs_service_id );

рдЬрд╣рд╛рдБ fs_service_id L4_ThreadId_t рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдЪрд░ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рд╕реЗрд╡рд╛ рдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕реЗ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рдиреАрдЪреЗ рдмрддрд╛рдКрдВрдЧрд╛, рдЬрдм рд╣рдо рд╕реАрдЖрд░рдЯреА (рд╕реА рд░рдирдЯрд╛рдЗрдо рдХреЛрдб) рдХреЗ рдЬрд╛рджреВ рдХреА рдУрд░ рдмрдврд╝рддреЗ рд╣реИрдВред рдЕрдм рдЙрд╕ рдХреЛрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рдЬреЛ рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рд╕реЗрд╡рд╛ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддрд╛ рд╣реИ:

if ( L4_IpcFailed(tag) )
{
nStatus = nTotalSent ? nTotalSent : XAM_EINTR;
break;
}
else
{
L4_Store( tag, &msg );
nStatus = L4_Get( &msg, 0 );
if( nStatus < 0 ) break;
nTotalSent += nStatus;
}


рдпрджрд┐ IPC рдЯреВрдЯ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдбреЗрдЯрд╛ рдкрд┐рдЫрд▓реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рд░рд┐рдЯрд░реНрди рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рдЕрдЧрд░ IPC рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдкреВрд░рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╣рдо рд░рд┐рдЯрд░реНрди рдХреЛрдб рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рддреЗ рд╣реИрдВред
L4_ рдЙрдкрд╕рд░реНрдЧ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг L4 рдкрд┐рд╕реНрддрд╛ рдорд╛рдЗрдХреНрд░реЛ-рдХрд░реНрдиреЗрд▓ рдХреА рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ? рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рджреВ рдФрд░ рдмрд╛рдЗрдЯреЗрдХреНрд╕ рдХреЗ рдХрд░реАрдм рд╣реИрдВред Fs_service_id рдЪрд░ рдХреЛ рдзреНрдпрд╛рди рд╕реЗ рджреЗрдЦрдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред рдЧрд┐рд░рдЧрд┐рдЯ рдкреНрд░рдгрд╛рд▓реА рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╢реБрд░реВ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рд╕реЗрд╡рд╛ рдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдирд╣реАрдВ рдкрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдХрд┐рд╕реА рддрд░рд╣ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдереНрд░реЗрдбреНрд╕ (рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдзрд╛рдЧреЗ) рдФрд░ рдореЗрдореЛрд░реА рд╕рд╣рд┐рдд рд╕рднреА рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рд╡рд┐рддрд░рдг рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд╣реИред рдЙрдирдХреА рдПрдХ рдкреНрд░рдгрд╛рд▓реА рдХреЙрд▓ рдЖрдкрдХреЛ рдЙрдирдХреЗ рдирд╛рдо рд╕реЗ рд╕реЗрд╡рд╛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рд╕рд╣рднрд╛рдЧрд┐рддрд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ libc рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЖрд░рдВрднреАрдХрд░рдг рдХреЛрдб рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:

static const char szServiceName[3] = "fs" ; //

L4_ThreadId_t fs_service_id = L4_nilthread;

extern "C" int xam_filesystem_init( void )
{
fs_service_id = GetDeviceHandle(szServiceName);
return L4_IsNilThread(fs_service_id) ? XAM_ENODEV : 0;
}


* This source code was highlighted with Source Code Highlighter .


рдЖрдЗрдП рдХреЛрдб рдореЗрдВ рдФрд░ рднреА рдЧрд╣рд░рд╛рдИ рддрдХ рдЬрд╛рдПрдВ рдФрд░ GetDeviceHandle рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджреЗрдЦреЗрдВ, рдЬреЛ рдЕрдиреБрд░реЛрдзрд┐рдд рд╕реЗрд╡рд╛ рдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред

extern L4_ThreadId_t rootserver_id; // Supervisor'

L4_ThreadId_t GetDeviceHandle( const char * szDeviceName)
{
L4_MsgTag_t tag;
L4_Msg_t msg;
L4_ThreadId_t Handle;

Handle = L4_nilthread;

do {

L4_Clear(&msg);
L4_Set_Label(&msg, cmdGetDeviceHandle );
L4_Append(&msg, L4_StringItem( 1+strlen(szDeviceName), ( void *) szDeviceName) );
L4_Load(&msg);
tag = L4_Call( rootserver_id );
if ( L4_IpcFailed(tag) ) break ;
L4_Store( tag, &msg );
Handle.raw = L4_Get(&msg, 1);

} while ( false );

return Handle;
}

* This source code was highlighted with Source Code Highlighter .


рдЖрдк рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рджреГрд╢реНрдп рдЖрдХрд░реНрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдПрдХ рдЕрдВрддрд░ рд╣реИ - рдпрд╣ рдЪрд░ rootserver_id рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рдХреА рдкрд╣рдЪрд╛рди рд╣реЛрддреА рд╣реИред рдЪреВрдВрдХрд┐ рдХрд╛рд░реНрдпреЛрдВ xam_filesystem_init рдФрд░ GetDeviceHandle рдХреЛ CRT рд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдЖрд░рдВрдн рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдПрдХ рдЖрд╡реЗрджрди рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рдЖрдИрдбреА рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ? рд╣рдо рдмрд╛рдпрдЯреЗрдХреНрд╕ рдХреЗ рдмрд╣реБрдд рдХрд░реАрдм рдЖ рдЧрдП рд╣реИрдВ, рддреЛ рдЖрдЗрдП рдХрд░реНрдиреЗрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреЗрдЬ (KIP) рдирд╛рдордХ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рджреЗрдЦреЗрдВред рдпрд╣ рд╕рдВрд░рдЪрдирд╛ L4 рдкрд┐рд╕реНрддрд╛ рдорд╛рдЗрдХреНрд░реЛрдбреНрд░рд╛рдлреНрдЯ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:


рдЪреВрдВрдХрд┐ рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рдорд╛рдЗрдХреНрд░реЛрдХрд░реНрдирд▓ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдкрд╣рд▓реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ KIP рд╕реЗ рдереНрд░реЗрдбрдЗрдиреНрдлреЛ рдлрд╝реАрд▓реНрдб рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреЗрдЖрдИрдкреА рдХреА рдЦрд╝рд╛рд╕рд┐рдпрдд рдпрд╣ рд╣реИ рдХрд┐ рдорд╛рдЗрдХреНрд░реЛрдХрд░реНрдирд▓ рдЗрд╕ рдкреГрд╖реНрда рдХреЛ рдПрдХ рд╣реА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдореЗрдВ рд░рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдкрддреЗ рд╕реНрдерд╛рди рдкрд░ рдореИрдк рдХрд░рддрд╛ рд╣реИред KIP рдкрддрд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдХрдорд╛рдВрдб рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреНрд░рдо рдХреЛ рдЪрд▓рд╛рдирд╛ рд╣реЛрдЧрд╛:

lock; nop
mov %eax, kip


рдЕрд╕реЗрдВрдмрд▓рд░ рд▓реЙрдХ рдФрд░ рдПрдирдУрдкреА рдХрдорд╛рдВрдб рдХрд╛ рдЕрдиреБрдХреНрд░рдо рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдмрдврд╝рд╛рдПрдЧрд╛ рдЬреЛ рдЕрдкрд╡рд╛рдж рд╕реЗ рд▓реМрдЯрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдИрдПрдПрдХреНрд╕ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдорд╛рдЗрдХреНрд░реЛ рдХрд░реНрдиреЗрд▓ рдХреЛ рдкрдХрдбрд╝ рд▓реЗрдЧрд╛ рдФрд░ рдХрд░реНрдиреЗрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреГрд╖реНрда рдкрддреЗ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рджреЗрдЧрд╛ред

рдЕрдВрдд рдореЗрдВ, рдЕрдВрддрд┐рдо рд╕реНрдкрд░реНрд╢ рдХрд░реНрдиреЗрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреГрд╖реНрда рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдЖрдВрдХрдбрд╝реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рд╕реЗрд╡рд╛рд░рдд рдзрд╛рд░рд╛ рдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдвреВрдВрдв рд░рд╣рд╛ рд╣реИред

mov kip, %eax
movw 198(%eax), %ax
shrw $4, %ax
movzwl %ax, %eax
addl $2, %eax
sall $14, %eax
orl $1, %eax
movl %eax, rootserver_id


рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд╕рдордп CRT0 рдореЙрдбреНрдпреВрд▓ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдЖрд░рдВрдн рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЧрд┐рд░рдЧрд┐рдЯ рдкреНрд░рдгрд╛рд▓реА рдХреА рд╡рд┐рднрд┐рдиреНрди рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рдирд┐рдордп рдХрд░рддрд╛ рд╣реИред

рдкреНрд░рд┐рдп рдкрд╛рдардХреЛрдВ, рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдЖрд╢реНрдЪрд░реНрдп рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдПрдХ рд╕рдкрдирд╛ рдирд╣реАрдВ рдорд┐рд▓рд╛, рдХрд┐ рдЖрдкрдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡рд┐рдВрдбреЛ рдХреЛ рдмрдВрдж рдирд╣реАрдВ рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕ рдЬрдЧрд╣ рдкрд░ рдкрдврд╝рдиреЗ рдХреА рддрд╛рдХрдд рдорд┐рд▓реАред рдЖрдкрдХреЛ рд╢рд╛рдпрдж Xameleon рд╕рд┐рд╕реНрдЯрдо рдбреЗрд╡рд▓рдкрд░ рдЯреВрд▓рдХрд┐рдЯ рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдХреЛ "рд╕реНрдкрд░реНрд╢" рдХрд░рдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд╣реЛрдЧреАред

рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

Source: https://habr.com/ru/post/In122216/


All Articles