Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² ΠΊΠΎΡ€Π·ΠΈΠ½ΡƒΠŸΠΎΠ·Π²ΠΎΠ½ΠΈΡ‚ΡŒ
Найти Π² Π”Π·Π΅Π½Π΅
МашинноС ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅

πŸš€ Π’ Linux ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ процСсс ΠΆΠΈΠ²Ρ‘Ρ‚ Π² своСй вСрсии памяти

Π”Π²Π° Ρ€Π°Π·Π½Ρ‹Ρ… прилоТСния ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ адрСс, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ 0x555555..., Π½ΠΎ ΠΏΠΎΠΏΠ°Π΄Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ этом Π² ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Ρ€Π°Π·Π½Ρ‹Π΅ мСста физичСской RAM. ΠŸΠΎΡ‡Π΅ΠΌΡƒ Ρ‚Π°ΠΊ? ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ процСсс Π²ΠΈΠ΄ΠΈΡ‚ Π½Π΅ Π½Π°ΡΡ‚ΠΎΡΡ‰ΡƒΡŽ Ρ„ΠΈΠ·ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π° virtual address space - Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ΅ адрСсноС пространство. Когда ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄Π΅Π»Π°Π΅Ρ‚ malloc, ΠΎΠ½Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ адрСс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выглядит ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ: int *x = malloc(sizeof(int)); *x = getpid(); printf("PID %d -> virtual address: %p -> value: %d\n", getpid(), (void*)x, *x); Если Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π² Π΄Π²ΡƒΡ… Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°Ρ…, адрСс ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ. Но это Π½Π΅ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ процСссы ΠΏΠΈΡˆΡƒΡ‚ Π² ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ ΠΏΠ°ΠΌΡΡ‚ΡŒ. Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ процСсса ядро ΠΈ MMU пСрСводят Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ адрСса Π² свои физичСскиС страницы. Один ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ адрСс Π² процСссС A ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° ΠΎΠ΄ΠΈΠ½ участок RAM, Π° Π² процСссС B - Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ. ИмСнно поэтому процСссы ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π°. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄ΡƒΠΌΠ°Π΅Ρ‚: Β«Π­Ρ‚ΠΎ моя ΠΏΠ°ΠΌΡΡ‚ΡŒΒ». На самом Π΄Π΅Π»Π΅ Linux Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚: Β«Π­Ρ‚ΠΎ твоя иллюзия памя

πŸš€ Π’ Linux ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ процСсс ΠΆΠΈΠ²Ρ‘Ρ‚ Π² своСй вСрсии памяти.

Π”Π²Π° Ρ€Π°Π·Π½Ρ‹Ρ… прилоТСния ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ адрСс, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ 0x555555..., Π½ΠΎ ΠΏΠΎΠΏΠ°Π΄Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ этом Π² ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Ρ€Π°Π·Π½Ρ‹Π΅ мСста физичСской RAM.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ Ρ‚Π°ΠΊ?

ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ процСсс Π²ΠΈΠ΄ΠΈΡ‚ Π½Π΅ Π½Π°ΡΡ‚ΠΎΡΡ‰ΡƒΡŽ Ρ„ΠΈΠ·ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π° virtual address space - Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ΅ адрСсноС пространство.

Когда ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄Π΅Π»Π°Π΅Ρ‚ malloc, ΠΎΠ½Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ адрСс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выглядит ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ:

int *x = malloc(sizeof(int));

*x = getpid();

printf("PID %d -> virtual address: %p -> value: %d\n",

getpid(), (void*)x, *x);

Если Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π² Π΄Π²ΡƒΡ… Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°Ρ…, адрСс ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ.

Но это Π½Π΅ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ процСссы ΠΏΠΈΡˆΡƒΡ‚ Π² ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ ΠΏΠ°ΠΌΡΡ‚ΡŒ.

Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ процСсса ядро ΠΈ MMU пСрСводят Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ адрСса Π² свои физичСскиС страницы. Один ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ адрСс Π² процСссС A ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° ΠΎΠ΄ΠΈΠ½ участок RAM, Π° Π² процСссС B - Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ.

ИмСнно поэтому процСссы ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π°.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄ΡƒΠΌΠ°Π΅Ρ‚:

Β«Π­Ρ‚ΠΎ моя ΠΏΠ°ΠΌΡΡ‚ΡŒΒ».

На самом Π΄Π΅Π»Π΅ Linux Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚:

Β«Π­Ρ‚ΠΎ твоя иллюзия памяти. А ΠΊΡƒΠ΄Π° ΠΎΠ½Π° Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ мапится - Ρ€Π΅ΡˆΠ°ΡŽ я».

Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ ΠΏΠ°ΠΌΡΡ‚ΡŒ - ΠΎΠ΄Π½Π° ΠΈΠ· Ρ‚Π΅Ρ… ΡˆΡ‚ΡƒΠΊ, Π±Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠΉ изоляции процСссов, бСзопасного multitasking, shared libraries, fork, mmap ΠΈ соврСмСнного Linux Π² Ρ†Π΅Π»ΠΎΠΌ.