рд╣рдо рд░рд╕реНрдЯ рдкрд░ рдПрдХ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдкреЗрдЬ рдореЗрдореЛрд░реА рд▓рд╛рдЧреВ рдХрд░рдирд╛ (рдирдпрд╛)

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

рдЧрд┐рдЯрд╣рдм рдкрд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рд▓реЗрдЦреЛрдВ рдХреА рдпрд╣ рд╢реНрд░реГрдВрдЦрд▓рд╛ред рдпрджрд┐ рдЖрдкрдХреЗ рдХреЛрдИ рдкреНрд░рд╢реНрди рдпрд╛ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ, рддреЛ рд╡рд╣рд╛рдВ рд╕рдВрдмрдВрдзрд┐рдд рдЯрд┐рдХрдЯ рдЦреЛрд▓реЗрдВред рд▓реЗрдЦ рдХреЗ рд╕рднреА рд╕реНрд░реЛрдд рдЗрд╕ рд╕реВрддреНрд░ рдореЗрдВ рд╣реИрдВ ред

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

рдпрд╣рд╛рдБ рдПрдХ рдирдпрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИред рд▓реЗрдЦ рдЕрднреА рднреА рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛рдПрдВ рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдПрдХ рд╕рд░рд▓ рдФрд░ рдЕрдзрд┐рдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдХреЛ рдирд╣реАрдВ рд╣рдЯрд╛рдПрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдкреБрд░рд╛рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред

рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдк рдирдП рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЖрдирдВрдж рд▓реЗрдВрдЧреЗ!

рд╕рд╛рдордЧреНрд░реА



рдкрд░рд┐рдЪрдп


рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рд╕реЗ, рд╣рдордиреЗ рдкреЗрдЬрд┐рдВрдЧ рдореЗрдореЛрд░реА рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдФрд░ x86_64 рдкрд░ рдЪрд╛рд░-рд╕реНрддрд░реАрдп рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реАрдЦрд╛ред рд╣рдордиреЗ рдпрд╣ рднреА рдкрд╛рдпрд╛ рдХрд┐ рд▓реЛрдбрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рдорд╛рд░реЗ рдХрд░реНрдиреЗрд▓ рдХреЗ рд▓рд┐рдП рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛ рдкрджрд╛рдиреБрдХреНрд░рдо рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХрд░реНрдиреЗрд▓ рд╡рд░реНрдЪреБрдЕрд▓ рдкрддреЛрдВ рдкрд░ рдЪрд▓рддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рд╕реБрд░рдХреНрд╖рд╛ рдмрдврд╝ рдЬрд╛рддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдореГрддрд┐ рддрдХ рдЕрдирдзрд┐рдХреГрдд рдкрд╣реБрдВрдЪ рдХреЗ рдХрд╛рд░рдг рднреМрддрд┐рдХ рдореЗрдореЛрд░реА рдХреЛ рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рдмрджрд▓рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдкреГрд╖реНрда рджреЛрд╖ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд▓реЗрдЦ рд╣рдорд╛рд░реЗ рдХрд░реНрдиреЗрд▓ рд╕реЗ рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛рдУрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рднреМрддрд┐рдХ рдореЗрдореЛрд░реА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВ, рдФрд░ рдХрд░реНрдиреЗрд▓ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрднрд╛рд╕реА рдкрддреЛрдВ рдкрд░ рдЪрд▓ рд░рд╣рд╛ рд╣реИред рдпрд╣рд╛рдВ рд╣рдо рд╡рд┐рд╖рдп рдХреЛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВ рдФрд░ рдХрд░реНрдиреЗрд▓ рд╕реЗ рдкреЗрдЬ рдЯреЗрдмрд▓ рдХреЗ рдлреНрд░реЗрдо рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВред рд╣рдо рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рдлрд╛рдпрджреЗ рдФрд░ рдиреБрдХрд╕рд╛рди рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдлрд┐рд░ рд╣рдорд╛рд░реЗ рдХреЛрд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╡рд┐рдХрд▓реНрдк рдЪреБрдиреЗрдВрдЧреЗред

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

рдирд┐рд░реНрднрд░рддрд╛ рдЕрджреНрдпрддрди


рдЗрд╕ рдЖрд▓реЗрдЦ рдореЗрдВ рдЖрдкрдХреЛ bootloader рд╕рдВрд╕реНрдХрд░рдг 0.4.0 рдпрд╛ рдЙрдЪреНрдЪрддрд░ рдФрд░ x86_64 рд╕рдВрд╕реНрдХрд░рдг 0.5.2 рдпрд╛ рдЙрд╕рд╕реЗ рдЕрдзрд┐рдХ рдирд┐рд░реНрднрд░рддрд╛ рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдк Cargo.toml рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 [dependencies] bootloader = "0.4.0" x86_64 = "0.5.2" 

рдЗрди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП, рдмреВрдЯрд▓реЛрдбрд░ рд▓реЙрдЧ рдФрд░ x86_64 рд▓реЙрдЧ рджреЗрдЦреЗрдВ ред

рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛рдУрдВ рддрдХ рдкрд╣реБрдВрдЪ


рдХрд░реНрдиреЗрд▓ рд╕реЗ рдкреЗрдЬ рдЯреЗрдмрд▓ рдПрдХреНрд╕реЗрд╕ рдХрд░рдирд╛ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ рдЬрд┐рддрдирд╛ рдпрд╣ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдХреЗ рдЪрд╛рд░ рд╕реНрддрд░реАрдп рддрд╛рд▓рд┐рдХрд╛ рдкрджрд╛рдиреБрдХреНрд░рдо рдкрд░ рдПрдХ рдФрд░ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:



рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкреГрд╖реНрда рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдЕрдЧрд▓реА рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рднреМрддрд┐рдХ рдкрддрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреА рд╣реИред рдпрд╣ рдЗрди рдкрддреЛрдВ рдХреЗ рдЕрдиреБрд╡рд╛рдж рд╕реЗ рдмрдЪрддрд╛ рд╣реИ, рдЬреЛ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдВрддрд╣реАрди рдЫреЛрд░реЛрдВ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рд╕реАрдзреЗ рдХрд░реНрдиреЗрд▓ рд╕реЗ рднреМрддрд┐рдХ рдкрддреЛрдВ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдБрдЪ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд░реНрдЪреБрдЕрд▓ рдкрддреЛрдВ рдкрд░ рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рд╣рдо рдПрдбреНрд░реЗрд╕ 4 KiB , рддреЛ рд╣рдо рд╡рд░реНрдЪреБрдЕрд▓ рдПрдбреНрд░реЗрд╕ 4 KiB рддрдХ рдкрд╣реБрдВрдЪрддреЗ рд╣реИрдВ, рди рдХрд┐ рдЙрд╕ рднреМрддрд┐рдХ рдкрддреЗ рдкрд░, рдЬрд╣рд╛рдВ 4 рд╡реЗрдВ рд╕реНрддрд░ рдХреЗ рдкреЗрдЬреЛрдВ рдХреА рддрд╛рд▓рд┐рдХрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред рдпрджрд┐ рд╣рдо 4 KiB рдХреЗ рднреМрддрд┐рдХ рдкрддреЗ рддрдХ рдкрд╣реБрдВрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдХреБрдЫ рдЖрднрд╛рд╕реА рдкрддреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд рд╣реИред

рдЗрд╕рд▓рд┐рдП, рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рдлрд╝реНрд░реЗрдореЛрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрди рдлрд╝реНрд░реЗрдореЛрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╡рд░реНрдЪреБрдЕрд▓ рдкреЗрдЬреЛрдВ рдХреЛ рдореИрдк рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреА рддреБрд▓рдирд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЗ рд╣реИрдВред

рдкрд╣рдЪрд╛рди рдорд╛рдирдЪрд┐рддреНрд░рдг


рдПрдХ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рд╕рднреА рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХрд╛ рд╕рдорд╛рди рдкреНрд░рджрд░реНрд╢рди рд╣реИ ред



рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдлреНрд░реЗрдо рдХреЗ рд╕рдорд╛рди рдкреНрд░рджрд░реНрд╢рди рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВред рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рднреМрддрд┐рдХ рдкрддреЗ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдорд╛рдиреНрдп рдЖрднрд╛рд╕реА рдкрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рднреА рд╕реНрддрд░реЛрдВ рдХреЗ рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛рдУрдВ рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд░рдЬрд┐рд╕реНрдЯрд░ рд╕реАрдЖрд░ 3 рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╡рд░реНрдЪреБрдЕрд▓ рдПрдбреНрд░реЗрд╕ рд╕реНрдкреЗрд╕ рдХреЛ рдЕрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдореБрдлреНрдд рдореЗрдореЛрд░реА рдХреЗ рдмрдбрд╝реЗ рд╕рдиреНрдирд┐рд╣рд┐рдд рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдЦреЛрдЬрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдмрдирд╛рддрд╛ рд╣реИред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдЙрдкрд░реЛрдХреНрдд рдЖрдХреГрддрд┐ рдореЗрдВ 1000 KiB рд╡рд░реНрдЪреБрдЕрд▓ рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ ред рд╣рдо 28 KiB рдХреНрд╖реЗрддреНрд░ рд╕реЗ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ 1004 KiB рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореМрдЬреВрдж рдкреГрд╖реНрда рдкрд░ рдЯрд┐рдХреА рд╣реБрдИ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ рддрдм рддрдХ рдЖрдЧреЗ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рд╣рдо рдПрдХ рдЙрдкрдпреБрдХреНрдд рдмрдбрд╝реЗ рдЯреБрдХрдбрд╝реЗ рдХреЛ рди рдкрд╛ рд▓реЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 1008 KiB рд╕рд╛рдеред рдЦрдВрдбрд┐рдд рдореЗрдореЛрд░реА рдореЗрдВ рдЙрддрдиреА рд╣реА рд╡рд┐рдЦрдВрдбрди рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдирдП рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдЙрди рднреМрддрд┐рдХ рдлрд╝реНрд░реЗрдореЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рдирдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдкреГрд╖реНрда рдЕрднреА рддрдХ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реА рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ 10008 kB рд╡рд░реНрдЪреБрдЕрд▓ рдореЗрдореЛрд░реА рдХрд╛ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдЖрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдкрддрд╛ 1008 KiB ред рдЕрдм рд╣рдо 1000 KiB рдФрд░ 2008 KiB рдмреАрдЪ рднреМрддрд┐рдХ рдкрддреЗ рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА рдлреНрд░реЗрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдкрд╣рдЪрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдлрд┐рдХреНрд╕реНрдб рдСрдлрд╕реЗрдЯ рдирдХреНрд╢рд╛


рд╡рд░реНрдЪреБрдЕрд▓ рдПрдбреНрд░реЗрд╕ рд╕реНрдкреЗрд╕ рдХреЛ рдЕрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред рдЗрд╕рд▓рд┐рдП, рдореИрдкрд┐рдВрдЧ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рд╡рд░реНрдЪреБрдЕрд▓ рдПрдбреНрд░реЗрд╕ рд╕реНрдкреЗрд╕ рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдСрдлрд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдлреНрд░реЗрдо рдХреЛ рдореИрдк рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдСрдлрд╕реЗрдЯ 10 TiB рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:



рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рд╡рд░реНрдЪреБрдЕрд▓ рдореЗрдореЛрд░реА рдХреА рдЗрд╕ рд░реЗрдВрдЬ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдХреЗ, рд╣рдо рд╕рдорд╛рди рдбрд┐рд╕реНрдкреНрд▓реЗ рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдмрдЪрддреЗ рд╣реИрдВред рд╡рд░реНрдЪреБрдЕрд▓ рдПрдбреНрд░реЗрд╕ рд╕реНрдкреЗрд╕ рдХреЗ рдЗрддрдиреЗ рдмрдбрд╝реЗ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рд╕рдВрд░рдХреНрд╖рдг рдХреЗрд╡рд▓ рддрднреА рд╕рдВрднрд╡ рд╣реИ рдЬрдм рд╡рд░реНрдЪреБрдЕрд▓ рдПрдбреНрд░реЗрд╕ рд╕реНрдкреЗрд╕ рднреМрддрд┐рдХ рдореЗрдореЛрд░реА рдХреЗ рдЖрдХрд╛рд░ рд╕реЗ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реЛред x86_64 рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ 48-рдмрд┐рдЯ рдПрдбреНрд░реЗрд╕ рд╕реНрдкреЗрд╕ 256 TiB рд╣реИред

рд▓реЗрдХрд┐рди рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдиреБрдХрд╕рд╛рди рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдПрдХ рдирдИ рдореИрдкрд┐рдВрдЧ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдЕрдиреНрдп рдкрддрд╛ рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рдирдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрдирд╛рддреЗ рд╕рдордп рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред

рдкреВрд░реНрдг рднреМрддрд┐рдХ рд╕реНрдореГрддрд┐ рдорд╛рдирдЪрд┐рддреНрд░рдг


рд╣рдо рд╕рднреА рднреМрддрд┐рдХ рдореЗрдореЛрд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдХреЗ рдЗрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рди рдХрд┐ рдХреЗрд╡рд▓ рдкреЗрдЬ рдЯреЗрдмрд▓ рдлреНрд░реЗрдо:



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

рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдиреБрдХрд╕рд╛рди рдпрд╣ рд╣реИ рдХрд┐ рднреМрддрд┐рдХ рд╕реНрдореГрддрд┐ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрди рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рдХрд╣реАрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рд╡реЗ рдХреБрдЫ рднреМрддрд┐рдХ рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рдереЛрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рд░реИрдо рдХреЗ рд╕рд╛рде рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред

рд╣рд╛рд▓рд╛рдБрдХрд┐, x86_64 рдкрд░ рд╣рдо 4 KiB рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЖрдХрд╛рд░ рдХреЗ рдмрдЬрд╛рдп рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд╛рд▓ 2 MiB рдкреГрд╖реНрдареЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рднреМрддрд┐рдХ рдореЗрдореЛрд░реА рдХреЗ 32 GiB рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рддрд┐ рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХреЗрд╡рд▓ 132 KiB рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ: рдХреЗрд╡рд▓ рдПрдХ рддреГрддреАрдп-рд╕реНрддрд░реАрдп рддрд╛рд▓рд┐рдХрд╛ рдФрд░ 32 рджреНрд╡рд┐рддреАрдп-рд╕реНрддрд░реАрдп рддрд╛рд▓рд┐рдХрд╛рдПрдБред рд╡рд┐рд╢рд╛рд▓ рдкреГрд╖реНрдареЛрдВ рдХреЛ рднреА рдЕрдзрд┐рдХ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдХреИрд╢ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЧрддрд┐рд╢реАрд▓ рдЕрдиреБрд╡рд╛рдж рдмрдлрд░ (рдЯреАрдПрд▓рдмреА) рдореЗрдВ рдХрдо рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдЕрд╕реНрдерд╛рдпреА рдкреНрд░рджрд░реНрд╢рди


рдмрд╣реБрдд рдХрдо рднреМрддрд┐рдХ рдореЗрдореЛрд░реА рд╡рд╛рд▓реЗ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП, рдЖрдк рдХреЗрд╡рд▓ рдЙрди рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рдкреЗрдЬ рдЯреЗрдмрд▓ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрд╕реНрдерд╛рдпреА рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ рдкреНрд░рдердо рд╕реНрддрд░ рдХреА рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдПрдХ рд╕рдорд╛рди рдкреНрд░рджрд░реНрд╢рди рдЖрд╡рд╢реНрдпрдХ рд╣реИ:



рдЗрд╕ рдЖрдВрдХрдбрд╝реЗ рдореЗрдВ, рдПрдХ рд╕реНрддрд░ 1 рддрд╛рд▓рд┐рдХрд╛ рд╡рд░реНрдЪреБрдЕрд▓ рдПрдбреНрд░реЗрд╕ рд╕реНрдкреЗрд╕ рдХреЗ рдкрд╣рд▓реЗ 2 MiB рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддреА рд╣реИред рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ CR3 рд░рдЬрд┐рд╕реНрдЯрд░ рд╕реЗ рдкрд╣реБрдВрдЪ 4, 3 рдФрд░ 2 рдХреЗ рд╕реНрддрд░реЛрдВ рдореЗрдВ рд╢реВрдиреНрдп рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реИред рд╕реВрдЪрдХрд╛рдВрдХ 8 рд╕рд╛рде рд░рд┐рдХреЙрд░реНрдб 32 KiB рдкрд░ рдЖрднрд╛рд╕реА рдкреГрд╖реНрда рдХреЛ 32 KiB рдореЗрдВ рдПрдХ рднреМрддрд┐рдХ рдлреНрд░реЗрдо рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╕реНрддрд░ 1 рддрд╛рд▓рд┐рдХрд╛ рдХреА рдкрд╣рдЪрд╛рди рд╣реЛрддреА рд╣реИред рдЖрдХреГрддрд┐ рдореЗрдВ рдпрд╣ рдПрдХ рдХреНрд╖реИрддрд┐рдЬ рддреАрд░ рджреНрд╡рд╛рд░рд╛ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

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

  • 24 KiB рдкрд░ рдПрдХ рдлреНрд░реЗрдо рдореЗрдВ рдПрдХ рд╕реНрддрд░ 1 рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдПрдХ рд╢реВрдиреНрдп рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХрд╛ рдорд╛рдирдЪрд┐рддреНрд░рдгред рдпрд╣ рдбреЙрдЯреЗрдб рддреАрд░ рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдкреГрд╖реНрда рд╕реНрддрд░ 2 рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рднреМрддрд┐рдХ рдлреНрд░реЗрдо рдореЗрдВ 0 KiB рдкрд░ рдЖрднрд╛рд╕реА рдкреГрд╖реНрда рдХрд╛ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдорд╛рдирдЪрд┐рддреНрд░рдг рдмрдирд╛рддрд╛ рд╣реИред
  • 4 KiB рдореЗрдВ рдПрдХ рдлреНрд░реЗрдо рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрддрд░ 1 рддрд╛рд▓рд┐рдХрд╛ рдХреЗ 9 рд╡реЗрдВ рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рдорд┐рд▓рд╛рди рдХрд░реЗрдВред рдпрд╣ рдбреЙрдЯреЗрдб рдПрд░реЛ рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдкреЗрдЬ рд▓реЗрд╡рд▓ 4 рдЯреЗрдмрд▓ рдХреЗ рднреМрддрд┐рдХ рдлреНрд░реЗрдо рдореЗрдВ 36 KiB рдкрд░ рд╡рд░реНрдЪреБрдЕрд▓ рдкреЗрдЬ рдХрд╛ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдорд╛рдирдЪрд┐рддреНрд░рдг рдмрдирд╛рддрд╛ рд╣реИред

рдЕрдм рдХрд░реНрдиреЗрд▓ рдПрдХ рд╕реНрддрд░ 2 рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдЙрд╕ рдкреГрд╖реНрда рдкрд░ рд▓рд┐рдЦрдХрд░ рдПрдХреНрд╕реЗрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ 0 KiB рдкрд░ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╕реНрддрд░ 4 рддрд╛рд▓рд┐рдХрд╛ 33 KiB рдкрд░ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдкреГрд╖реНрда рдкрд░ рд▓рд┐рдЦрдХрд░ред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЕрд╕реНрдерд╛рдпреА рдореИрдкрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдПрдХ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдлреНрд░реЗрдо рддрдХ рдкрд╣реБрдВрдЪ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреНрд░рд┐рдпрд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

  • рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╕реНрддрд░ 1 рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдПрдХ рдирд┐рдГрд╢реБрд▓реНрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред
  • рдЗрд╕ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЛ рдЙрд╕ рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рднреМрддрд┐рдХ рдлрд╝реНрд░реЗрдо рдореЗрдВ рдореИрдк рдХрд░реЗрдВ рдЬрд┐рд╕реЗ рд╣рдо рдПрдХреНрд╕реЗрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
  • рдкреНрд░рд╡реЗрд╢ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реЗ рдЖрднрд╛рд╕реА рдкреГрд╖реНрда рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕ рдлреНрд░реЗрдо рддрдХ рдкрд╣реБрдВрдЪреЗрдВред
  • рдЕрдкреНрд░рдпреБрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕ рд░рд┐рдХреЙрд░реНрдб рд╕реЗрдЯ, рдЬрд┐рд╕рд╕реЗ рдЕрд╕реНрдерд╛рдпреА рдорд╛рдирдЪрд┐рддреНрд░рдг рдХреЛ рд╣рдЯрд╛рдиреЗред

рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, рдЖрднрд╛рд╕реА рдкрддрд╛ рд╕реНрдерд╛рди рд╕рд╛рдл тАЛтАЛрд░рд╣рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рдорд╛рди 512 рдЖрднрд╛рд╕реА рдкреГрд╖реНрда рд▓рдЧрд╛рддрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдиреБрдХрд╕рд╛рди рдХреБрдЫ рдмреЛрдЭрд┐рд▓ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЬрдм рд╕реЗ рдПрдХ рдирдИ рддреБрд▓рдирд╛ рдореЗрдВ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдХрдИ рд╕реНрддрд░реЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЕрд░реНрдерд╛рдд, рд╣рдореЗрдВ рдХрдИ рдмрд╛рд░ рд╡рд░реНрдгрд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рджреЛрд╣рд░рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдкреБрдирд░рд╛рд╡рд░реНрддреА рдкреГрд╖реНрда рд╕рд╛рд░рдгреА


рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЬрд┐рд╕рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рд╡рд╣ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдорд┐рд▓рд╛рди рд╣реИ ред

рд╡рд┐рдЪрд╛рд░ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдЪреМрдереЗ рд╕реНрддрд░ рдХреА рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдХреБрдЫ рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рдирд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд░реНрдЪреБрдЕрд▓ рдПрдбреНрд░реЗрд╕ рд╕реНрдкреЗрд╕ рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рдЖрд░рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рднреА рд╡рд░реНрддрдорд╛рди рдФрд░ рднрд╡рд┐рд╖реНрдп рдХреЗ рдЯреЗрдмрд▓ рдлреНрд░реЗрдо рдХреЛ рдЗрд╕ рд╕реНрдкреЗрд╕ рдореЗрдВ рдореИрдк рдХрд░рддреЗ рд╣реИрдВред

рдЖрдЗрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:



рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдПрдХрдорд╛рддреНрд░ рдЕрдВрддрд░ 4 рдЯреЗрдмрд▓ рдХреЗ рд╕реНрддрд░ рдореЗрдВ рд╕реВрдЪрдХрд╛рдВрдХ 511 рд╕рд╛рде рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд░рд┐рдХреЙрд░реНрдб рд╣реИ, рдЬрд┐рд╕реЗ рднреМрддрд┐рдХ рдлреНрд░реЗрдо 4 KiB рдореЗрдВ рдореИрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╣реА рд╕реНрдерд┐рдд рд╣реИред

рдЬрдм рд╕реАрдкреАрдпреВ рдЗрд╕ рд░рд┐рдХреЙрд░реНрдб рдкрд░ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕реНрддрд░ 3 рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╕реЗ рд╕реНрддрд░ 4 рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдорд╛рди рд╣реИ рдЬреЛ рд╕реНрд╡рдпрдВ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдкреНрд░реЛрд╕реЗрд╕рд░ рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рд╕реНрддрд░ 4 рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд░рд┐рдХреЙрд░реНрдб рд╕реНрддрд░ 3 рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдм рдпрд╣ рд╕реНрддрд░ 4 рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рд╕реНрддрд░ 3 рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирддрд╛ рд╣реИред рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ x86_64 рдореЗрдВ рд╕рднреА рд╕реНрддрд░реЛрдВ рдХреЗ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рд╕рдорд╛рди рд╣реЛрддреА рд╣реИред

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



рдЗрд╕реА рддрд░рд╣, рд╣рдо рд░реВрдкрд╛рдВрддрд░рдг рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рджреЛ рдмрд╛рд░ рдкрд╛рд░рд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╕реНрддрд░ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХрд╛ рдкрд╛рд▓рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:



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

рд╕реНрддрд░ 3 рдФрд░ 4 рдХреА рддрд╛рд▓рд┐рдХрд╛рдПрдБ рднреА рдПрдХреНрд╕реЗрд╕ рдХреА рдЧрдИ рд╣реИрдВред рд╕реНрддрд░ 3 рдХреА рддрд╛рд▓рд┐рдХрд╛ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рддреАрди рдмрд╛рд░ рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ: рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕реЛрдЪрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрддрд░ 1 рдХреА рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╣реИ, рдФрд░ рдЕрдЧрд▓реЗ рдЪрд░рдг рдореЗрдВ рд╣рдо рд╕реНрддрд░ 3 рддрдХ рдкрд╣реБрдБрдЪрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╕реАрдкреАрдпреВ рдПрдХ рдореИрдкреНрдб рдлрд╝реНрд░реЗрдо рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрддрд╛ рд╣реИред рд╕реНрддрд░ 4 рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рд╕реНрд╡рдпрдВ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреЗрд╡рд▓ рдЪрд╛рд░ рдмрд╛рд░ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕реНрддрд░ 4 рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдПрдХ рдореИрдкреНрдб рдлрд╝реНрд░реЗрдо (рдиреАрдЪреЗ рдХреА рдЖрдХреГрддрд┐ рдореЗрдВ рдиреАрд▓рд╛) рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред



рдЕрд╡рдзрд╛рд░рдгрд╛ рдкрд╣рд▓реА рдмрд╛рд░ рдореЗрдВ рд╕рдордЭрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдкрддрд╛ рдЧрдгрдирд╛


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



рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдПрдХ рд╕реНрддрд░ 1 рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреГрд╖реНрда рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдКрдкрд░ рд╕реАрдЦрд╛ рд╣реИ, рдЖрдкрдХреЛ рдПрдХ рдмрд╛рд░ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд░рд┐рдХреЙрд░реНрдб рд╕реЗ рдЧреБрдЬрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдлрд┐рд░ 4, 3 рдФрд░ 2 рдХреЗ рд╕реНрддрд░ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рднреА рдПрдбреНрд░реЗрд╕ рдмреНрд▓реЙрдХ рдХреЛ рдПрдХ рдмреНрд▓реЙрдХ рдореЗрдВ рджрд╛рдИрдВ рдУрд░ рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд░рд┐рдХреЙрд░реНрдб рдХреЗ рдЗрдВрдбреЗрдХреНрд╕ рдХреЛ рд▓реЗрд╡рд▓ 4 рдХреЗ рд╢реБрд░реБрдЖрддреА рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рд╕реНрдерд╛рди рдкрд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ:



рдЗрд╕ рдкреГрд╖реНрда рдХреЗ рд╕реНрддрд░ 2 рддрд╛рд▓рд┐рдХрд╛ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рднреА рд╕реВрдЪрдХрд╛рдВрдХ рдЦрдВрдбреЛрдВ рдХреЛ рджреЛ рдЦрдВрдбреЛрдВ рдХреЛ рджрд╛рдИрдВ рдУрд░ рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рджреЛрдиреЛрдВ рд╕реНрд░реЛрдд рдЦрдВрдбреЛрдВ рдХреЗ рд╕реНрддрд░ рдкрд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ: рд╕реНрддрд░ 4 рдФрд░ рд╕реНрддрд░ 3:



рд╕реНрддрд░ 3 рддрд╛рд▓рд┐рдХрд╛ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдРрд╕рд╛ рд╣реА рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рдЕрднреА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддреАрди рдкрддреЗ рд╡рд╛рд▓реЗ рдмреНрд▓реЙрдХ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВред



рдЕрдВрдд рдореЗрдВ, рд╕реНрддрд░ 4 рддрд╛рд▓рд┐рдХрд╛ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЪрд╛рд░ рдмреНрд▓реЙрдХреЛрдВ рдХреЛ рджрд╛рдИрдВ рдУрд░ рд▓реЗ рдЬрд╛рдПрдВред



рдЕрдм рдЖрдк рд╕рднреА рдЪрд╛рд░ рд╕реНрддрд░реЛрдВ рдХреЗ рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЖрднрд╛рд╕реА рдкрддреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдПрдХ рдкрддреЗ рдХреА рднреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ 8 рд╕реЗ рдЧреБрдгрд╛ рдХрд░рдХреЗ, рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХрд╛ рдЖрдХрд╛рд░ред

рдиреАрдЪреЗ рджреА рдЧрдИ рддрд╛рд▓рд┐рдХрд╛ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдлрд╝реНрд░реЗрдореЛрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдкрддреЗ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рджрд░реНрд╢рд╛рддреА рд╣реИ:

рдХреЗ рд▓рд┐рдП рд╡рд░реНрдЪреБрдЕрд▓ рдПрдбреНрд░реЗрд╕рдкрддрд╛ рд╕рдВрд░рдЪрдирд╛ ( рдЕрд╖реНрдЯрд╛рдзрд╛рд░реА )
рдкреЗрдЬ0o_SSSSSS_AAA_BBB_CCC_DDD_EEEE
рд╕реНрддрд░ 1 рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдкреНрд░рд╡реЗрд╢0o_SSSSSS_RRR_AAA_BBB_CCC_DDDD
рдПрдХ рд╕реНрддрд░ 2 рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдкреНрд░рд╡реЗрд╢0o_SSSSSS_RRR_RRR_AAA_BBB_CCCC
рдПрдХ рд╕реНрддрд░ 3 рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдкреНрд░рд╡реЗрд╢0o_SSSSSS_RRR_RRR_RRR_AAA_BBBB
рд╕реНрддрд░ 4 рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдкреНрд░рд╡реЗрд╢0o_SSSSSS_RRR_RRR_RRR_RRR_AAAA

рдпрд╣рд╛рдВ рд╕реНрддрд░ 4 рд╕реВрдЪрдХрд╛рдВрдХ рд╣реИ, рд╕реНрддрд░ 3 рд╣реИ, рд╕реНрддрд░ 2 рд╣реИ, рдФрд░ DDD рдкреНрд░рджрд░реНрд╢рд┐рдд рдлреНрд░реЗрдо рдХреЗ рд▓рд┐рдП рд╕реНрддрд░ 1 рд╕реВрдЪрдХрд╛рдВрдХ рд╣реИ, EEEE рдЗрд╕рдХреА рднрд░рдкрд╛рдИ рд╣реИред RRR рдкреБрдирд░рд╛рд╡рд░реНрддреА рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рд╣реИред рдПрдХ рд╕реВрдЪрдХрд╛рдВрдХ (рддреАрди рдЕрдВрдХ) 8 (рдкреЗрдЬ рдЯреЗрдмрд▓ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЗ рдЖрдХрд╛рд░) рд╕реЗ рдЧреБрдгрд╛ рдХрд░рдХреЗ рдПрдХ рдСрдлрд╕реЗрдЯ (рдЪрд╛рд░ рдЕрдВрдХ) рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдСрдлрд╕реЗрдЯ рдХреЗ рд╕рд╛рде, рдкрд░рд┐рдгрд╛рдореА рдкрддрд╛ рд╕реАрдзреЗ рд╕рдВрдмрдВрдзрд┐рдд рддрд╛рд▓рд┐рдХрд╛ рддрд╛рд▓рд┐рдХрд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред

SSSS рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдЕрдВрдХ рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдмрд┐рдЯреНрд╕ рд╣реИрдВ, SSSS , рд╡реЗ рд╕рднреА рдмрд┐рдЯ 47 рдХреА рдкреНрд░рддрд┐рдпрд╛рдВ рд╣реИрдВред рдпрд╣ x86_64 рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдореЗрдВ рдорд╛рдиреНрдп рдкрддреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреА рд╣рдордиреЗ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдереАред

рдкрддреЗ рдСрдХреНрдЯрд▓ рд╣реИрдВ , рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдСрдХреНрдЯрд▓ рдЪрд░рд┐рддреНрд░ рддреАрди рдмрд┐рдЯреНрд╕ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реНрддрд░реЛрдВ рдкрд░ 9-рдмрд┐рдЯ рдЗрдВрдбреЗрдХреНрд╕ рдЯреЗрдмрд▓ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рд╣реЗрдХреНрд╕рд╛рдбреЗрд╕рд┐рдорд▓ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рдЬрд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рд┐рддреНрд░ рдЪрд╛рд░ рдмрд┐рдЯреНрд╕ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред

рд░рд╕реНрдЯ рдХреЛрдб


рдЖрдк рдмрд┐рдЯ рдХреЛрдб рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░рд╕реНрдЯ рдХреЛрдб рдореЗрдВ рдРрд╕реЗ рдкрддреЗ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:

 // the virtual address whose corresponding page tables you want to access let addr: usize = [тАж]; let r = 0o777; // recursive index let sign = 0o177777 << 48; // sign extension // retrieve the page table indices of the address that we want to translate let l4_idx = (addr >> 39) & 0o777; // level 4 index let l3_idx = (addr >> 30) & 0o777; // level 3 index let l2_idx = (addr >> 21) & 0o777; // level 2 index let l1_idx = (addr >> 12) & 0o777; // level 1 index let page_offset = addr & 0o7777; // calculate the table addresses let level_4_table_addr = sign | (r << 39) | (r << 30) | (r << 21) | (r << 12); let level_3_table_addr = sign | (r << 39) | (r << 30) | (r << 21) | (l4_idx << 12); let level_2_table_addr = sign | (r << 39) | (r << 30) | (l4_idx << 21) | (l3_idx << 12); let level_1_table_addr = sign | (r << 39) | (l4_idx << 30) | (l3_idx << 21) | (l2_idx << 12); 

рдпрд╣ рдХреЛрдб рдЗрдВрдбреЗрдХреНрд╕ 0o777 (511) рдХреЗ рд╕рд╛рде рдкрд┐рдЫрд▓реЗ рд╕реНрддрд░ 4 рд░рд┐рдХреЙрд░реНрдб рдХреЗ рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдорд╛рдирдЪрд┐рддреНрд░рдг рдХрд╛ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдорд┐рд▓рд╛рди рдХрд░рддрд╛ рд╣реИред рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЛрдб рдЕрднреА рддрдХ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рд▓реЛрдбрд░ рдХреЛ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдореИрдкрд┐рдВрдЧ рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рджреЗрдЦреЗрдВред

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

 // in src/memory.rs use x86_64::structures::paging::{Mapper, Page, PageTable, RecursivePageTable}; use x86_64::{VirtAddr, PhysAddr}; /// Creates a RecursivePageTable instance from the level 4 address. let level_4_table_addr = [тАж]; let level_4_table_ptr = level_4_table_addr as *mut PageTable; let recursive_page_table = unsafe { let level_4_table = &mut *level_4_table_ptr; RecursivePageTable::new(level_4_table).unwrap(); } /// Retrieve the physical address for the given virtual address let addr: u64 = [тАж] let addr = VirtAddr::new(addr); let page: Page = Page::containing_address(addr); // perform the translation let frame = recursive_page_table.translate_page(page); frame.map(|frame| frame.start_address() + u64::from(addr.page_offset())) 

рдлрд┐рд░ рд╕реЗ, рдЗрд╕ рдХреЛрдб рдХреЛ рдПрдХ рд╕рд╣реА рдкреБрдирд░рд╛рд╡рд░реНрддреА рдорд╛рдирдЪрд┐рддреНрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕ рдореИрдкрд┐рдВрдЧ рдХреЗ рд╕рд╛рде, рдЕрдиреБрдкрд▓рдмреНрдз level_4_table_addr рдЧрдгрдирд╛ рдкрд╣рд▓реЗ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХреА рдЬрд╛рддреА рд╣реИред



рд░рд┐рдХрд░реНрд╕рд┐рд╡ рдореИрдкрд┐рдВрдЧ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ рдпрд╣ рдмрддрд╛рддреА рд╣реИ рдХрд┐ рдПрдХрд▓ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рддрдирд╛ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдорд┐рд▓рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЖрд╕рд╛рди рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдиреНрдпреВрдирддрдо рд╕реЗрдЯрдЕрдк (рдХреЗрд╡рд▓ рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдкрд╣рд▓реЗ рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИред

рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдХреБрдЫ рдиреБрдХрд╕рд╛рди рднреА рд╣реИрдВ:

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

рдмреВрдЯрд▓реЛрдбрд░ рд╕рдорд░реНрдерди


рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╕рднреА рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреЛ рдкреЗрдЬ рдЯреЗрдмрд▓ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рднреМрддрд┐рдХ рд╕реНрдореГрддрд┐ рдХреЛ рдкрд╣рдЪрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛ рдЪрддреБрд░реНрде-рд╕реНрддрд░реАрдп рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд░рд┐рдХреЙрд░реНрдб рдХреЛ рдкреБрди: рдореИрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдкреЗрдЬ рдЯреЗрдмрд▓ рддрдХ рдкрд╣реБрдБрдЪ рдХреЗ рдмрд┐рдирд╛ рдпреЗ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред

рдЗрд╕рд▓рд┐рдП, рдореБрдЭреЗ рдмреВрдЯрд▓реЛрдбрд░ рдХреА рдорджрдж рдЪрд╛рд╣рд┐рдПред рдЙрд╕рдХреЗ рдкрд╛рд╕ рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛рдУрдВ рддрдХ рдкрд╣реБрдВрдЪ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡рд╣ рдХрд┐рд╕реА рднреА рдбрд┐рд╕реНрдкреНрд▓реЗ рдХреЛ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрдкрдиреЗ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, bootloader рдХреНрд░реЗрдЯ рдХрд╛рд░реНрдЧреЛ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдкрд░реЛрдХреНрдд рджреЛрдиреЛрдВ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ :

  • map_physical_memory рдлрд╝рдВрдХреНрд╢рди рд╡рд░реНрдЪреБрдЕрд▓ рдПрдбреНрд░реЗрд╕ рд╕реНрдкреЗрд╕ рдореЗрдВ рдкреВрд░реА рднреМрддрд┐рдХ рдореЗрдореЛрд░реА рдХреЛ рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдореИрдк рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХрд░реНрдиреЗрд▓ рд╕рднреА рднреМрддрд┐рдХ рдореЗрдореЛрд░реА рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреВрд░реНрдг рднреМрддрд┐рдХ рдореЗрдореЛрд░реА рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
  • recursive_page_table рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд▓реЛрдбрд░ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд░реВрдк рд╕реЗ рдПрдХ рдЪреМрдереЗ-рд╕реНрддрд░реАрдп рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХрд░реНрдиреЗрд▓ рдХреЛ "рдкреБрдирд░рд╛рд╡рд░реНрддреА рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛рдУрдВ" рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╡рд┐рдзрд┐ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

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

 [dependencies] bootloader = { version = "0.4.0", features = ["map_physical_memory"]} 

рдпрджрд┐ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рд╕рдХреНрд╖рдо рд╣реИ, рддреЛ рдмреВрдЯрд▓реЛрдбрд░ рдкреВрд░реА рднреМрддрд┐рдХ рдореЗрдореЛрд░реА рдХреЛ рд╡рд░реНрдЪреБрдЕрд▓ рдкрддреЗ рдХреЗ рдХреБрдЫ рдЕрдкреНрд░рдпреБрдХреНрдд рд╢реНрд░реЗрдгреА рдореЗрдВ рдореИрдк рдХрд░рддрд╛ рд╣реИред рдХрд░реНрдиреЗрд▓ рдХреЗ рд▓рд┐рдП рдХрдИ рд╡рд░реНрдЪреБрдЕрд▓ рдкрддреЛрдВ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмреВрдЯрд▓реЛрдбрд░ рдмреВрдЯ рд╕реВрдЪрдирд╛ рдХреА рд╕рдВрд░рдЪрдирд╛ рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИ ред

рдмреВрдЯ рдЬрд╛рдирдХрд╛рд░реА


рдЯреЛрдХрд░рд╛ рдХрд░реНрдиреЗрд▓ рдХреЛ рдкрд╛рд░рд┐рдд рдХреА рдЧрдИ рд╕рднреА рд╕реВрдЪрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде BootInfobootloader рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ ред рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЕрднреА рднреА рдЕрдВрддрд┐рдо рд░реВрдк рджрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрдЧреНрд░реЗрдб рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рджреМрд░рд╛рди рдХреБрдЫ рд╡рд┐рдлрд▓рддрд╛рдПрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рдЬреЛ рдХрд┐ рд╕реЗрд╡рд░ рдХреЗ рд╕рд╛рде рдЕрд╕рдВрдЧрдд рд╣реИрдВ ред рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рд╕рдВрд░рдЪрдирд╛ рдХреЗ рджреЛ рдХреНрд╖реЗрддреНрд░ рд╣реИрдВ: рдФрд░ :memory_mapphysical_memory_offset

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

рд▓реЛрдбрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП BootInfoрддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░реНрдиреЗрд▓ рдХреЗ рд▓рд┐рдП рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдкрд╛рд╕ &'static BootInfoрдХрд░рддрд╛ рд╣реИ _startред рдЗрд╕реЗ рдЬреЛрдбрд╝реЗрдВ:

 // in src/main.rs use bootloader::BootInfo; #[cfg(not(test))] #[no_mangle] pub extern "C" fn _start(boot_info: &'static BootInfo) -> ! { // new argument [тАж] } 

рд╕рд╣реА рддрд░реНрдХ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рд╣рдорд╛рд░реЗ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╣реА рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИред

рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдореИрдХреНрд░реЛ


рдЪреВрдВрдХрд┐ рдлрд╝рдВрдХреНрд╢рди _startрд▓реЛрдбрд░ рд╕реЗ рдмрд╛рд╣рд░реА рд░реВрдк рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕реЗ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдордирдорд╛рдиреА рддрд░реНрдХ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдкрд╡рд╛рд╣рд┐рдд рд░рдирдЯрд╛рдЗрдо рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдХреНрд░реИрд╢ рдпрд╛ рдХрд╛рд░рдг рджреЗрдЧрд╛ред

рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╣рдореЗрд╢рд╛ рд╕рд╣реА рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реИрдВ, рдЯреЛрдХрд░рд╛ bootloaderрдПрдХ рдореИрдХреНрд░реЛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ entry_pointред рд╣рдо рдЗрд╕ рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

 // in src/main.rs use bootloader::{BootInfo, entry_point}; entry_point!(kernel_main); #[cfg(not(test))] fn kernel_main(boot_info: &'static BootInfo) -> ! { [тАж] } 

рдЕрдм рдЖрдкрдХреЛ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ extern "C"рдпрд╛ no_mangle, рдЪреВрдВрдХрд┐ рдореИрдХреНрд░реЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдирд┐рдЪрд▓реЗ рд╕реНрддрд░ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ _startред рдлрд╝рдВрдХреНрд╢рди kernel_mainрдЕрдм рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд░рд╕реНрдЯ рдлрд╝рдВрдХреНрд╢рди рдмрди рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдордирдорд╛рдирд╛ рдирд╛рдо рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВред рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рдХрд╛рд░ рджреНрд╡рд╛рд░рд╛ рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдЧрд▓рдд рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рддрд░реНрдХ рдЬреЛрдбрд╝рдХрд░ рдпрд╛ рдЙрд╕рдХрд╛ рдкреНрд░рдХрд╛рд░ рдмрджрд▓рдХрд░, рдПрдХ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рд╣реЛрдЧреА

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рднреМрддрд┐рдХ рдореЗрдореЛрд░реА рддрдХ рдкрд╣реБрдВрдЪ рд╣реИ, рдФрд░ рд╣рдо рдЕрдВрддрддрдГ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╡рд░реНрддрдорд╛рди рд╕рдХреНрд░рд┐рдп рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдЬрд┐рд╕ рдкрд░ рдХрд░реНрдиреЗрд▓ рдЪрд▓рддрд╛ рд╣реИред рджреВрд╕рд░реЗ рдЪрд░рдг рдореЗрдВ, рдПрдХ рдЯреНрд░рд╛рдВрд╕рд▓реЗрд╢рди рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдПрдВ рдЬреЛ рднреМрддрд┐рдХ рдкрддреЗ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдпрд╣ рд╡рд░реНрдЪреБрдЕрд▓ рдкрддрд╛ рдореИрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдВрддрд┐рдо рдЪрд░рдг рдореЗрдВ, рд╣рдо рдирдпрд╛ рдорд╛рдирдЪрд┐рддреНрд░рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХреЛрдб рдореЗрдВ рдПрдХ рдирдпрд╛ рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдПрдВ memory:

 // in src/lib.rs pub mod memory; 

рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЦрд╛рд▓реА рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВ src/memory.rsред

рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛рдУрдВ рддрдХ рдкрд╣реБрдВрдЪ


рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ , рд╣рдордиреЗ рдЙрди рдкреГрд╖реНрдареЛрдВ рдХреА рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд┐рди рдкрд░ рдХрд░реНрдиреЗрд▓ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд░рдЬрд┐рд╕реНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдмрддрд╛рдП рдЧрдП рднреМрддрд┐рдХ рдлреНрд░реЗрдо рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рд╕рдХрддрд╛ рд╣реИ CR3ред рдЕрдм рд╣рдо рдЗрд╕ рдЬрдЧрд╣ рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ: рдлрд╝рдВрдХреНрд╢рди active_level_4_tableрдЪреМрдереЗ рд╕реНрддрд░ рдХреЗ рдкреГрд╖реНрдареЛрдВ рдХреА рд╕рдХреНрд░рд┐рдп рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рд▓рд┐рдВрдХ рд▓реМрдЯрд╛ рджреЗрдЧрд╛:

 // in src/memory.rs use x86_64::structures::paging::PageTable; /// Returns a mutable reference to the active level 4 table. /// /// This function is unsafe because the caller must guarantee that the /// complete physical memory is mapped to virtual memory at the passed /// `physical_memory_offset`. Also, this function must be only called once /// to avoid aliasing `&mut` references (which is undefined behavior). pub unsafe fn active_level_4_table(physical_memory_offset: u64) -> &'static mut PageTable { use x86_64::{registers::control::Cr3, VirtAddr}; let (level_4_table_frame, _) = Cr3::read(); let phys = level_4_table_frame.start_address(); let virt = VirtAddr::new(phys.as_u64() + physical_memory_offset); let page_table_ptr: *mut PageTable = virt.as_mut_ptr(); &mut *page_table_ptr // unsafe } 

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдордиреЗ рд░рдЬрд┐рд╕реНрдЯрд░ рд╕реЗ рдЪреМрдереЗ рд╕реНрддрд░ рдХреА рд╕рдХреНрд░рд┐рдп рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рднреМрддрд┐рдХ рдлреНрд░реЗрдо рдХреЛ рдкрдврд╝рд╛ CR3ред рдлрд┐рд░ рд╣рдо рдЗрд╕рдХрд╛ рднреМрддрд┐рдХ рдЖрд░рдВрднрд┐рдХ рдкрддрд╛ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЬреЛрдбрд╝рдХрд░ рдЖрднрд╛рд╕реА рдкрддреЗ рдореЗрдВ рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВ physical_memory_offsetред рдЕрдВрдд рдореЗрдВ, рдкрддреЗ рдХреЛ *mut PageTableрд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдХрдЪреНрдЪреЗ рдкреЙрдЗрдВрдЯрд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░реЗрдВ as_mut_ptr, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рдЗрд╕рд╕реЗ рдЕрдирдЬрд╛рдиреЗ рдореЗрдВ рд▓рд┐рдВрдХ рдмрдирд╛рдПрдВ &mut PageTableред рд╣рдо &mutрдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд▓рд┐рдВрдХ рдмрдирд╛рддреЗ рд╣реИрдВ &, рдХреНрдпреЛрдВрдХрд┐ рдмрд╛рдж рдореЗрдВ рд▓реЗрдЦ рдореЗрдВ рд╣рдо рдЗрди рдкреЗрдЬ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВрдЧреЗред

рдпрд╣рд╛рдВ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдмреНрд▓реЙрдХ рдбрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд░рд╕реНрдЯ рдкреВрд░реЗ рд╢рд░реАрд░ unsafe fnрдХреЛ рдПрдХ рдмрдбрд╝реЗ, рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдмреНрд▓реЙрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирддрд╛ рд╣реИ ред рдЗрд╕рд╕реЗ рдЬреЛрдЦрд┐рдо рдмрдврд╝ рдЬрд╛рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдкрд┐рдЫрд▓реА рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рдЧрд▓рддреА рд╕реЗ рдПрдХ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдСрдкрд░реЗрд╢рди рд╢реБрд░реВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред рдЗрд╕рд╕реЗ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рднреА рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред Rust рдХреЗ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ RFC рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ ред

рдЕрдм рд╣рдо рдЪреМрдереЗ рд╕реНрддрд░ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд░рд┐рдХреЙрд░реНрдб рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 // in src/main.rs #[cfg(not(test))] fn kernel_main(boot_info: &'static BootInfo) -> ! { [тАж] // initialize GDT, IDT, PICS use blog_os::memory::active_level_4_table; let l4_table = unsafe { active_level_4_table(boot_info.physical_memory_offset) }; for (i, entry) in l4_table.iter().enumerate() { if !entry.is_unused() { println!("L4 Entry {}: {:?}", i, entry); } } println!("It did not crash!"); blog_os::hlt_loop(); } 

рд╣рдо physical_memory_offsetрд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ BootInfoред рдлрд┐рд░ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдореЗрдВ рдПрдХ рд╕реВрдЪрдХрд╛рдВрдХ рдЬреЛрдбрд╝рдиреЗ рдХреЗ iterрд▓рд┐рдП рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдФрд░ рдПрдХ рд╕рдВрдпреЛрдЬрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдХреЗрд╡рд▓ рдЧреИрд░-рд░рд┐рдХреНрдд рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╕рднреА 512 рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ рд╕реНрдХреНрд░реАрди рдкрд░ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛрдВрдЧреАред рдЬрдм рд╣рдо рдХреЛрдб рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕ рдкрд░рд┐рдгрд╛рдо рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ: рд╣рдо рдХрдИ рдЧреИрд░-рдЦрд╛рд▓реА рд░рд┐рдХреЙрд░реНрдб рджреЗрдЦрддреЗ рд╣реИрдВ рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рддреГрддреАрдп-рд╕реНрддрд░реАрдп рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдореЗрдВ рдореИрдк рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдХрдИ рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХрд░реНрдиреЗрд▓ рдХреЛрдб, рдХрд░реНрдиреЗрд▓ рд╕реНрдЯреИрдХ, рднреМрддрд┐рдХ рдореЗрдореЛрд░реА рдЕрдиреБрд╡рд╛рдж рдФрд░ рдмреВрдЯ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рддреАрд╕рд░реЗ рд╕реНрддрд░ рдХреА рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдлрд┐рд░ рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдлреНрд░реЗрдо рдХреЛ рдЖрднрд╛рд╕реА рдкрддреЗ рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ:enumeratei









 // in the for loop in src/main.rs use x86_64::{structures::paging::PageTable, VirtAddr}; if !entry.is_unused() { println!("L4 Entry {}: {:?}", i, entry); // get the physical address from the entry and convert it let phys = entry.frame().unwrap().start_address(); let virt = phys.as_u64() + boot_info.physical_memory_offset; let ptr = VirtAddr::new(virt).as_mut_ptr(); let l3_table: &PageTable = unsafe { &*ptr }; // print non-empty entries of the level 3 table for (i, entry) in l3_table.iter().enumerate() { if !entry.is_unused() { println!(" L3 Entry {}: {:?}", i, entry); } } } 

рджреВрд╕рд░реЗ рдФрд░ рдкрд╣рд▓реЗ рд╕реНрддрд░реЛрдВ рдХреА рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдХреНрд░рдорд╢рдГ рддреАрд╕рд░реЗ рдФрд░ рджреВрд╕рд░реЗ рд╕реНрддрд░ рдХреЗ рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рджреЛрд╣рд░рд╛рдПрдВред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреЛрдб рдХреА рдорд╛рддреНрд░рд╛ рдмрд╣реБрдд рддреЗрдЬрд╝реА рд╕реЗ рдмрдврд╝ рд░рд╣реА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдкреВрд░реА рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдкреНрд░рдХрд╛рд╢рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред

рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЯреНрд░реИрд╡рд░реНрд╕рд┐рдВрдЧ рдЯреЗрдмрд▓ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреИрд╕реЗ рдкрддреЗ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЖрдорддреМрд░ рдкрд░ рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд░реНрдЪреБрдЕрд▓ рдкрддреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рднреМрддрд┐рдХ рдкрддрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЪрд▓рд┐рдП рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рддреЗ рд╣реИрдВред

рдкрддрд╛ рдЕрдиреБрд╡рд╛рдж


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

 // in src/memory.rs use x86_64::{PhysAddr, VirtAddr}; /// Translates the given virtual address to the mapped physical address, or /// `None` if the address is not mapped. /// /// This function is unsafe because the caller must guarantee that the /// complete physical memory is mapped to virtual memory at the passed /// `physical_memory_offset`. pub unsafe fn translate_addr(addr: VirtAddr, physical_memory_offset: u64) -> Option<PhysAddr> { translate_addr_inner(addr, physical_memory_offset) } 

рд╣рдо translate_addr_innerрдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддреЗ рд╣реИрдВ ред рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрдВрдЧ рдкреВрд░реЗ рд╢рд░реАрд░ unsafe fnрдХреЛ рдПрдХ рдмрдбрд╝реЗ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдмреНрд▓реЙрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирддрд╛ рд╣реИ ред рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдХреЗ, рд╣рдо рдлрд┐рд░ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдСрдкрд░реЗрд╢рди рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ unsafeред

рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЖрдВрддрд░рд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣реЛрддреА рд╣реИ:

 // in src/memory.rs /// Private function that is called by `translate_addr`. /// /// This function is safe to limit the scope of `unsafe` because Rust treats /// the whole body of unsafe functions as an unsafe block. This function must /// only be reachable through `unsafe fn` from outside of this module. fn translate_addr_inner(addr: VirtAddr, physical_memory_offset: u64) -> Option<PhysAddr> { use x86_64::structures::paging::page_table::FrameError; use x86_64::registers::control::Cr3; // read the active level 4 frame from the CR3 register let (level_4_table_frame, _) = Cr3::read(); let table_indexes = [ addr.p4_index(), addr.p3_index(), addr.p2_index(), addr.p1_index() ]; let mut frame = level_4_table_frame; // traverse the multi-level page table for &index in &table_indexes { // convert the frame into a page table reference let virt = frame.start_address().as_u64() + physical_memory_offset; let table_ptr: *const PageTable = VirtAddr::new(virt).as_ptr(); let table = unsafe {&*table_ptr}; // read the page table entry and update `frame` let entry = &table[index]; frame = match entry.frame() { Ok(frame) => frame, Err(FrameError::FrameNotPresent) => return None, Err(FrameError::HugeFrame) => panic!("huge pages not supported"), }; } // calculate the physical address by adding the page offset Some(frame.start_address() + u64::from(addr.page_offset())) } 

рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, active_level_4_tableрд╣рдордиреЗ рд░рдЬрд┐рд╕реНрдЯрд░ рд╕реЗ рдЪреМрдереЗ рд╕реНрддрд░ рдХреЗ рдлреНрд░реЗрдо рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрдврд╝рд╛ CR3, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИред рдЪрд┐рдВрддрд╛ рди рдХрд░реЗрдВ, рд╣рдо рдЬрд▓реНрдж рд╣реА рд╕рдорд╛рдзрд╛рди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░реЗрдВрдЧреЗред

рд╕рдВрд░рдЪрдирд╛ VirtAddrрдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЪрд╛рд░ рд╕реНрддрд░реЛрдВ рдХреЗ рдкреГрд╖реНрдареЛрдВ рдХреА рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИред рд╣рдо рдЗрди рдЕрдиреБрдХреНрд░рдореЛрдВ рдХреЛ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рд╕рд░рдгреА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдкрдХреЛ рд╕рднреА рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реВрдк рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ forред рд▓реВрдк рдХреЗ рдмрд╛рд╣рд░, рд╣рдореЗрдВ рдпрд╛рдж рд╣реИ рдХрд┐ рдЖрдЦрд┐рд░реА рдлреНрд░реЗрдо рдмрд╛рдж рдореЗрдВ рднреМрддрд┐рдХ рдкрддреЗ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреМрд░рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред frameрдкреГрд╖реНрда рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рджреМрд░рд╛рди рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдлрд╝реНрд░реЗрдореЛрдВ рдФрд░ рдЕрдВрддрд┐рдо рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рдмрд╛рдж рд╕рдВрдмрджреНрдз рдлрд╝реНрд░реЗрдо рдкрд░, рдЬреЛ рдХрд┐ рд╕реНрддрд░ 1 рд░рд┐рдХреЙрд░реНрдб рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред

рд▓реВрдк рдХреЗ рдЕрдВрджрд░, рд╣рдо рдлрд┐рд░ рд╕реЗ рдЖрд╡реЗрджрди рдХрд░рддреЗ рд╣реИрдВредphysical_memory_offsetрдлрд╝реНрд░реЗрдо рдХреЛ рдкреЗрдЬ рдЯреЗрдмрд▓ рд▓рд┐рдВрдХ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдПред рдлрд┐рд░ рд╣рдо рд╡рд░реНрддрдорд╛рди рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рд░рд┐рдХреЙрд░реНрдб рдкрдврд╝рддреЗ рд╣реИрдВ рдФрд░ PageTableEntry::frameрдорд┐рд▓рд╛рди рдХрд┐рдП рдЧрдП рдлреНрд░реЗрдо рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ ред рдпрджрд┐ рд░рд┐рдХреЙрд░реНрдб рдлрд╝реНрд░реЗрдо рдореЗрдВ рдореИрдк рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╡рд╛рдкрд╕ рд▓реМрдЯреЗрдВ Noneред рдпрджрд┐ рд░рд┐рдХреЙрд░реНрдб 2 MiB рдпрд╛ 1 GiB рдХреЗ рд╡рд┐рд╢рд╛рд▓ рдкреГрд╖реНрда рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЕрдм рддрдХ рд╣рдореЗрдВ рдШрдмрд░рд╛рд╣рдЯ рд╣реЛрдЧреАред

рддреЛ, рдХреБрдЫ рдкрддреЗ рдкрд░ рдЕрдиреБрд╡рд╛рдж рд╕рдорд╛рд░реЛрд╣ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:

 // in src/main.rs #[cfg(not(test))] fn kernel_main(boot_info: &'static BootInfo) -> ! { [тАж] // initialize GDT, IDT, PICS use blog_os::memory::translate_addr; use x86_64::VirtAddr; let addresses = [ // the identity-mapped vga buffer page 0xb8000, // some code page 0x20010a, // some stack page 0x57ac_001f_fe48, // virtual address mapped to physical address 0 boot_info.physical_memory_offset, ]; for &address in &addresses { let virt = VirtAddr::new(address); let phys = unsafe { translate_addr(virt, boot_info.physical_memory_offset) }; println!("{:?} -> {:?}", virt, phys); } println!("It did not crash!"); blog_os::hlt_loop(); } 

рдЬрдм рд╣рдо рдХреЛрдб рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдирд┐рдореНрди рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддреЗ рд╣реИрдВ:



рдЬреИрд╕рд╛ рдХрд┐ рдЕрдкреЗрдХреНрд╖рд┐рдд рдерд╛, рдПрдХ рд╕рдорд╛рди рдорд╛рдирдЪрд┐рддреНрд░рдг рдХреЗ рд╕рд╛рде, рдкрддрд╛ 0xb8000рдЙрд╕реА рднреМрддрд┐рдХ рдкрддреЗ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдХреЛрдб рдкреГрд╖реНрда рдФрд░ рд╕реНрдЯреИрдХ рдкреГрд╖реНрда рдХреЛ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рднреМрддрд┐рдХ рдкрддреЗ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд▓реЛрдбрд░ рдиреЗ рд╣рдорд╛рд░реА рдХрд░реНрдиреЗрд▓ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореИрдкрд┐рдВрдЧ рдХреИрд╕реЗ рдмрдирд╛рдИред рдореИрдкрд┐рдВрдЧ physical_memory_offsetрдХреЛ рднреМрддрд┐рдХ рдкрддреЗ рдкрд░ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП 0, рд▓реЗрдХрд┐рди рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреБрд╡рд╛рдж рджрдХреНрд╖рддрд╛ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд╛рд▓ рдкреГрд╖реНрдареЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдмреВрдЯрд▓реЛрдбрд░ рдХрд╛ рднрд╛рд╡реА рд╕рдВрд╕реНрдХрд░рдг рдХрд░реНрдиреЗрд▓ рдФрд░ рд╕реНрдЯреИрдХ рдкреГрд╖реНрдареЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдЕрдиреБрдХреВрд▓рди рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

MappedPageTable рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


рднреМрддрд┐рдХ рдкрддреЛрдВ рдореЗрдВ рдЖрднрд╛рд╕реА рдкрддреЛрдВ рдХрд╛ рдЕрдиреБрд╡рд╛рдж OS рдХрд░реНрдиреЗрд▓ рдХрд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдп рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЯреЛрдХрд░рд╛ рдЗрд╕рдХреЗ x86_64рд▓рд┐рдП рдПрдХ рдЕрдореВрд░реНрддрддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд┐рд╢рд╛рд▓ рдкреГрд╖реНрдареЛрдВ рдФрд░ рдХрдИ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ translate_addr, рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдмрдбрд╝реЗ рдкреГрд╖реНрдареЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдЕрдореВрд░реНрддрддрд╛ рдХрд╛ рдЖрдзрд╛рд░ рджреЛ рд▓рдХреНрд╖рдг рд╣реИрдВ рдЬреЛ рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдЕрдиреБрд╡рд╛рдж рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

  • рд▓рдХреНрд╖рдг MapperрдкреГрд╖реНрдареЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдп рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, translate_pageрдЗрд╕ рдкреГрд╖реНрда рдХреЛ рдЙрд╕реА рдЖрдХрд╛рд░ рдХреЗ рдлреНрд░реЗрдо рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рд╛рде рд╣реА map_toрддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдПрдХ рдирдпрд╛ рдорд╛рдирдЪрд┐рддреНрд░рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдПред
  • рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ MapperAllSizesрддрд╛рддреНрдкрд░реНрдп Mapperрд╕рднреА рдкреГрд╖реНрда рдЖрдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрди рд╕реЗ рд╣реИ ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдРрд╕реЗ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рдЖрдХрд╛рд░реЛрдВ рдХреЗ рдкреГрд╖реНрдареЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ translate_addrрдпрд╛ рд╕рд╛рдорд╛рдиреНрдп рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ translateред

рд▓рдХреНрд╖рдг рдХреЗрд╡рд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЛрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЕрдм рдЯреЛрдХрд░рд╛ x86_64рджреЛ рдкреНрд░рдХрд╛рд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд▓рдХреНрд╖рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ: MappedPageTableрдФрд░ RecursivePageTableред рдкрд╣рд▓реЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рдлреНрд░реЗрдо рдХрд╣реАрдВ рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдСрдлрд╝рд╕реЗрдЯ рдХреЗ рд╕рд╛рде)ред рджреВрд╕рд░реЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдЪреМрдереЗ рд╕реНрддрд░ рдХреА рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдкреБрди: рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рднреА рднреМрддрд┐рдХ рдореЗрдореЛрд░реА рдореИрдк рдХреА рдЧрдИ рд╣реИрдВ physical_memory_offset, рдЗрд╕рд▓рд┐рдП рдЖрдк рдореИрдкреНрдбрдкреЗрдЬреЗрдЬ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕реЗ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, initрдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдПрдХ рдирдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдПрдВ memory:

 use x86_64::structures::paging::{PhysFrame, MapperAllSizes, MappedPageTable}; use x86_64::PhysAddr; /// Initialize a new MappedPageTable. /// /// This function is unsafe because the caller must guarantee that the /// complete physical memory is mapped to virtual memory at the passed /// `physical_memory_offset`. Also, this function must be only called once /// to avoid aliasing `&mut` references (which is undefined behavior). pub unsafe fn init(physical_memory_offset: u64) -> impl MapperAllSizes { let level_4_table = active_level_4_table(physical_memory_offset); let phys_to_virt = move |frame: PhysFrame| -> *mut PageTable { let phys = frame.start_address().as_u64(); let virt = VirtAddr::new(phys + physical_memory_offset); virt.as_mut_ptr() }; MappedPageTable::new(level_4_table, phys_to_virt) } // make private unsafe fn active_level_4_table(physical_memory_offset: u64) -> &'static mut PageTable {тАж} 

рд╣рдо рд╕реАрдзреЗ MappedPageTableрдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдирд╣реАрдВ рд▓реМрдЯ рд╕рдХрддреЗ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдХреНрд▓реЛрдЬрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╣реИред рд╣рдо рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдПрдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ impl Traitред рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк RecursivePageTableрдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдмрджрд▓реЗ рдмрд┐рдирд╛ рдХрд░реНрдиреЗрд▓ рдХреЛ рд╕реНрд╡рд┐рдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред

рдлрд╝рдВрдХреНрд╢рди MappedPageTable::newрджреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реИ: рд╕реНрддрд░ 4 рдХреЗ рдкреЗрдЬ рдЯреЗрдмрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░рд╕реНрдкрд░ рд▓рд┐рдВрдХ рдФрд░ рдПрдХ рдмрдВрдж phys_to_virtрдЬреЛ рдкреЗрдЬ рдлреНрд░реЗрдо рдкреЙрдЗрдВрдЯрд░ рдореЗрдВ рднреМрддрд┐рдХ рдлреНрд░реЗрдо рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ *mut PageTableред рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП, рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ active_level_4_tableред рджреВрд╕рд░реЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдХреНрд▓реЛрдЬрд░ рдмрдирд╛рддреЗ physical_memory_offsetрд╣реИрдВ рдЬреЛ рд░реВрдкрд╛рдВрддрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рд╣рдо рдЗрд╕реЗ рдПрдХ active_level_4_tableрдирд┐рдЬреА рд╕рдорд╛рд░реЛрд╣ рднреА рдмрдирд╛рддреЗ рд╣реИрдВ , рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рд╕реЗ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ initред

рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПMapperAllSizes::translate_addrрдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХрд╛рд░реНрдп рдХреЗ рдмрдЬрд╛рдп memory::translate_addr, рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ kernel_main:

 // in src/main.rs #[cfg(not(test))] fn kernel_main(boot_info: &'static BootInfo) -> ! { [тАж] // initialize GDT, IDT, PICS // new: different imports use blog_os::memory; use x86_64::{structures::paging::MapperAllSizes, VirtAddr}; // new: initialize a mapper let mapper = unsafe { memory::init(boot_info.physical_memory_offset) }; let addresses = [тАж]; // same as before for &address in &addresses { let virt = VirtAddr::new(address); // new: use the `mapper.translate_addr` method let phys = mapper.translate_addr(virt); println!("{:?} -> {:?}", virt, phys); } println!("It did not crash!"); blog_os::hlt_loop(); } 

рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдкрд╣рд▓реЗ рдЬреИрд╕реЗ рд╣реА рдЕрдиреБрд╡рд╛рдж рдкрд░рд┐рдгрд╛рдо рджреЗрдЦрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдм рдХреЗрд╡рд▓ рд╡рд┐рд╢рд╛рд▓ рдкреГрд╖реНрда рднреА рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ:



рдЬреИрд╕рд╛ рдХрд┐ рдЕрдкреЗрдХреНрд╖рд┐рдд рдерд╛, рдЖрднрд╛рд╕реА рдкрддреЗ рдХреЛ physical_memory_offsetрднреМрддрд┐рдХ рдкрддреЗ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ 0x0ред рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд╡рд╛рдж рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП MappedPageTable, рд╣рдо рд╡рд┐рд╢рд╛рд▓ рдкреГрд╖реНрдареЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдиреНрдп рдкреГрд╖реНрда рдХрд╛рд░реНрдпреЛрдВ рддрдХ рднреА рдкрд╣реБрдВрдЪ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ map_toрд╣рдо рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рд╕реНрддрд░ рдкрд░, рд╣рдореЗрдВ рдЕрдм рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ memory::translate_addr, рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ рдЗрд╕реЗ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдПрдХ рдирдИ рдореИрдкрд┐рдВрдЧ рдмрдирд╛рдПрдВ


рдЕрдм рддрдХ, рд╣рдордиреЗ рдХреЗрд╡рд▓ рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рджреЗрдЦрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИред рдкрд╣рд▓реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рди рдХрд┐рдП рдЧрдП рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдорд╛рдирдЪрд┐рддреНрд░рдг рдмрдирд╛рддреЗ рд╣реИрдВред

рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ map_toрд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реЗ рдХрд░реЗрдВрдЧреЗ Mapper, рдЗрд╕рд▓рд┐рдП рдкрд╣рд▓реЗ рд╣рдо рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред рдкреНрд░рд▓реЗрдЦрди рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЪрд╛рд░ рддрд░реНрдХ рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ: рд╡рд╣ рдкреГрд╖реНрда рдЬрд┐рд╕реЗ рд╣рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ; рдЬрд┐рд╕ рдлрд╝реНрд░реЗрдо рдХреЛ рдкреГрд╖реНрда рдореИрдк рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛ рдФрд░ рдлреНрд░реЗрдо рд╡рд┐рддрд░рдХ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЭрдВрдбреЗ рдХрд╛ рд╕реЗрдЯ frame_allocatorред рдПрдХ рдлреНрд░реЗрдо рдПрд▓реЛрдХреЗрдЯрд░ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдкреГрд╖реНрда рдХреЛ рдореИрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдмреИрдХрдЕрдк рд╕реНрдЯреЛрд░реЗрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкреНрд░рдпреБрдХреНрдд рдлрд╝реНрд░реЗрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рд╕рдорд╛рд░реЛрд╣ create_example_mapping


рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдкрд╣рд▓рд╛ рдХрджрдо рдПрдХ рдирдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдирд╛ рд╣реИ create_example_mappingрдЬреЛ рдЗрд╕ рдкреГрд╖реНрда рдХреЛ 0xb8000рд╡реАрдЬреАрдП рдЯреЗрдХреНрд╕реНрдЯ рдмрдлрд░ рдХреЗ рднреМрддрд┐рдХ рдлреНрд░реЗрдо рдореЗрдВ рдореИрдк рдХрд░рддрд╛ рд╣реИ ред рд╣рдо рдЗрд╕ рдлреНрд░реЗрдо рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдбрд┐рд╕реНрдкреНрд▓реЗ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдмрдирд╛рдИ рдЧрдИ рдереА: рд╣рдореЗрдВ рдмрд╕ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдкреЗрдЬ рдкрд░ рд▓рд┐рдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╕реНрдХреНрд░реАрди рдкрд░ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред

рдлрд╝рдВрдХреНрд╢рди create_example_mappingрдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 // in src/memory.rs use x86_64::structures::paging::{Page, Size4KiB, Mapper, FrameAllocator}; /// Creates an example mapping for the given page to frame `0xb8000`. pub fn create_example_mapping( page: Page, mapper: &mut impl Mapper<Size4KiB>, frame_allocator: &mut impl FrameAllocator<Size4KiB>, ) { use x86_64::structures::paging::PageTableFlags as Flags; let frame = PhysFrame::containing_address(PhysAddr::new(0xb8000)); let flags = Flags::PRESENT | Flags::WRITABLE; let map_to_result = unsafe { mapper.map_to(page, frame, flags, frame_allocator) }; map_to_result.expect("map_to failed").flush(); } 

рдкреЗрдЬ рдХреЗ рдЕрд▓рд╛рд╡рд╛ pageрд╣реИ рдХрд┐ рдЖрдк рд╕рдВрдмрджреНрдз рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╕рдорд╛рд░реЛрд╣ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреА рдЙрдореНрдореАрдж рд╣реИ mapperрдФрд░ frame_allocatorред рдкреНрд░рдХрд╛рд░ mapperрдЙрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ Mapper<Size4KiB>рд╣реИ рдЬреЛ рд╡рд┐рдзрд┐ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ map_toред рдЖрдо рдкреИрд░рд╛рдореАрдЯрд░ Size4KiBрдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛ Mapperрд╣реИ рдЖрдо рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд▓рд┐рдП PageSizeрдорд╛рдирдХ 4 KiB рдкреГрд╖реНрдареЛрдВ рдХреЗ рд╕рд╛рде рдФрд░ рднрд╛рд░реА рдкреГрд╖реНрдареЛрдВ 2 рдФрд░ MiB 1 GiB рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛,ред рд╣рдо рдХреЗрд╡рд▓ 4 KiB рдкреЗрдЬ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо Mapper<Size4KiB>рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрдЬрд╛рдп рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ MapperAllSizesред

рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП, рдзреНрд╡рдЬ рдХреЛ рд╕реЗрдЯ рдХрд░реЗрдВ PRESENT, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рднреА рдорд╛рдиреНрдп рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдФрд░ рдзреНрд╡рдЬ WRITABLEрдкреГрд╖реНрда рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдПред рдХреЙрд▓map_toрдЕрд╕реБрд░рдХреНрд╖рд┐рдд: рдЖрдк рдЕрдорд╛рдиреНрдп рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рд╕реНрдореГрддрд┐ рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдПрдХ рдмреНрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ unsafeред рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдЭрдВрдбреЛрдВ рдХреА рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП, рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдХрд╛ "рдкреЗрдЬ рдЯреЗрдмрд▓ рдкреНрд░рд╛рд░реВрдк" рдЕрдиреБрднрд╛рдЧ рджреЗрдЦреЗрдВ ред

рдлрд╝рдВрдХреНрд╢рди map_toрд╡рд┐рдлрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИ Resultред рдЪреВрдВрдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдХреЛрдб рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬреЛ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣рдо рдмрд╕ expectрдПрдХ рддреНрд░реБрдЯрд┐ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдШрдмрд░рд╛рд╣рдЯ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ ред рдпрджрд┐ рд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдкреНрд░рдХрд╛рд░ рджреЗрддрд╛ рд╣реИ MapperFlushрдЬреЛ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧрддрд┐рд╢реАрд▓ рдЕрдиреБрд╡рд╛рдж рдмрдлрд░ (рдЯреАрдПрд▓рдмреА) рд╕реЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдкреГрд╖реНрда рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ flushред рдЬреИрд╕реЗ Result, рдпрд╣ рдкреНрд░рдХрд╛рд░ [ #[must_use]] рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИрдЪреЗрддрд╛рд╡рдиреА рдЬрд╛рд░реА рдХрд░рдирд╛ рдЕрдЧрд░ рд╣рдо рдЧрд▓рддреА рд╕реЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ ред

рдХрд╛рд▓реНрдкрдирд┐рдХ FrameAllocator


рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП create_example_mapping, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ FrameAllocatorред рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдПрдХ рдирдпрд╛ рдкреНрд░рджрд░реНрд╢рди рдмрдирд╛рдиреЗ рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдЙрд╕ рдЖрднрд╛рд╕реА рдкреГрд╖реНрда рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рд╕рд░рд▓ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрддрд░ 1 рддрд╛рд▓рд┐рдХрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореМрдЬреВрдж рд╣реИ, рдФрд░ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд░рд┐рдХреЙрд░реНрдб рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдХрдард┐рди рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреГрд╖реНрда рдПрдХ рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╕реНрддрд░ 3 рдЕрднреА рддрдХ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рд╕реНрддрд░ 3, 2 рдФрд░ 1. рдХреЗ рдкреЗрдЬ рдЯреЗрдмрд▓ рдмрдирд╛рдиреЗ рд╣реЛрдВрдЧреЗред

рдЖрдЗрдП рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХреЗрд╕ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдкрдХреЛ рдирдпрд╛ рдкреЗрдЬ рдЯреЗрдмрд▓ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдПрдХ рдлреНрд░реЗрдо рд╡рд┐рддрд░рдХ рдЬреЛ рд╣рдореЗрд╢рд╛ рд░рд┐рдЯрд░реНрди рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ Noneред рд╣рдо EmptyFrameAllocatorрдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдкреНрд░рджрд░реНрд╢рди рд╕рдорд╛рд░реЛрд╣ рдмрдирд╛рддреЗ рд╣реИрдВ :

 // in src/memory.rs /// A FrameAllocator that always returns `None`. pub struct EmptyFrameAllocator; impl FrameAllocator<Size4KiB> for EmptyFrameAllocator { fn allocate_frame(&mut self) -> Option<PhysFrame> { None } } 

рдЕрдм рдЖрдкрдХреЛ рдПрдХ рдкреГрд╖реНрда рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдирдП рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рдмрдирд╛рдП рдмрд┐рдирд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЛрдбрд░ рдХреЛ рд╡рд░реНрдЪреБрдЕрд▓ рдПрдбреНрд░реЗрд╕ рд╕реНрдкреЗрд╕ рдХреЗ рдкрд╣рд▓реЗ рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рдиреНрдп рд╕реНрддрд░ 1 рддрд╛рд▓рд┐рдХрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕ рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдХрд┐рд╕реА рднреА рдЕрдкреНрд░рдпреБрдХреНрдд рдкреГрд╖реНрда рдХрд╛ рдЪрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрддреЗ рдкрд░ рдкреЗрдЬ 0x1000ред

рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкрд╣рд▓реЗ рдкреГрд╖реНрда 0x1000рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдореЗрдореЛрд░реА рдХреА рд╕рд╛рдордЧреНрд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

 // in src/main.rs #[cfg(not(test))] fn kernel_main(boot_info: &'static BootInfo) -> ! { [тАж] // initialize GDT, IDT, PICS use blog_os::memory; use x86_64::{structures::paging::Page, VirtAddr}; let mut mapper = unsafe { memory::init(boot_info.physical_memory_offset) }; let mut frame_allocator = memory::EmptyFrameAllocator; // map a previously unmapped page let page = Page::containing_address(VirtAddr::new(0x1000)); memory::create_example_mapping(page, &mut mapper, &mut frame_allocator); // write the string `New!` to the screen through the new mapping let page_ptr: *mut u64 = page.start_address().as_mut_ptr(); unsafe { page_ptr.offset(400).write_volatile(0x_f021_f077_f065_f04e)}; println!("It did not crash!"); blog_os::hlt_loop(); } 

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдкреЗрдЬ рдХреЗ рд▓рд┐рдП рдПрдХ рдореИрдкрд┐рдВрдЧ рдмрдирд╛рддреЗ рд╣реИрдВ 0x1000, рдЬреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди create_example_mappingрдХреЛ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░рд╕реНрдкрд░ рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рдмреБрд▓рд╛рддрд╛ рд╣реИ mapperрдФрд░ frame_allocatorред рдпрд╣ рдкреГрд╖реНрда 0x1000рдХреЛ рд╡реАрдЬреАрдП рдЯреЗрдХреНрд╕реНрдЯ рдмрдлрд░ рдлреНрд░реЗрдо рдореЗрдВ рдореИрдк рдХрд░рддрд╛ рд╣реИ , рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдпрд╣ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕реНрдХреНрд░реАрди рдкрд░ рд╡рд╣рд╛рдВ рдХреНрдпрд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред

рдлрд┐рд░ рдкреГрд╖реНрда рдХреЛ рдХрдЪреНрдЪреЗ рд╕реВрдЪрдХ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░реЗрдВ рдФрд░ рдСрдлрд╝рд╕реЗрдЯ рдХреЛ рдорд╛рди рд▓рд┐рдЦреЗрдВ 400ред рд╣рдо рдкреГрд╖реНрда рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдирд╣реАрдВ рд▓рд┐рдЦрддреЗ рдХреНрдпреЛрдВрдХрд┐ рд╡реАрдЬреАрдП рдмрдлрд░ рдХреА рд╢реАрд░реНрд╖ рдкрдВрдХреНрддрд┐ рд╕реАрдзреЗ рд╕реНрдХреНрд░реАрди рд╕реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ printlnред рдорд╛рди рд▓рд┐рдЦреЗрдВ рдЬреЛ 0x_f021_f077_f065_f04eрд╕реНрдЯреНрд░рд┐рдВрдЧ "рдирдпрд╛!" рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ рдПрдХ рд╕рдлреЗрдж рдкреГрд╖реНрдарднреВрдорд┐ рдкрд░ред рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рд▓реЗрдЦ "рд╡реАрдЬреАрдП рдЯреЗрдХреНрд╕реНрдЯ рдореЛрдб" рдореЗрдВ рд╕реАрдЦрд╛ рд╣реИ , рд╡реАрдЬреАрдП рдмрдлрд░ рдХреЛ рд▓рд┐рдЦрдирд╛ рдЕрд╕реНрдерд┐рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ write_volatileред

рдЬрдм рд╣рдо QEMU рдореЗрдВ рдХреЛрдб рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдирд┐рдореНрди рдкрд░рд┐рдгрд╛рдо рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ:



рдкреЗрдЬ рдкрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж 0x1000, рд╢рд┐рд▓рд╛рд▓реЗрдЦ "рдирдпрд╛!" редрдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рдкреЗрдЬ рдЯреЗрдмрд▓ рдореЗрдВ рдПрдХ рдирдпрд╛ рдореИрдкрд┐рдВрдЧ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдмрдирд╛рдпрд╛ рд╣реИред

рдЗрд╕ рдЯрдХрд░рд╛рд╡ рдиреЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЯрдХрд░рд╛рд╡ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╕реНрддрд░ 1 рдЯреЗрдмрд▓ рдерд╛ 0x1000ред рдЬрдм рд╣рдо рдХрд┐рд╕реА рдРрд╕реЗ рдкреГрд╖реНрда рдХреЛ рдореИрдк рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрддрд░ 1 рддрд╛рд▓рд┐рдХрд╛ рдЕрднреА рддрдХ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рддреЛ рдлрд╝рдВрдХреНрд╢рди map_toрд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ EmptyFrameAllocatorрдирдП рдЯреЗрдмрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝реНрд░реЗрдо рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ ред рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдРрд╕рд╛ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рд╣рдо 0xdeadbeaf000рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдкреГрд╖реНрда рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ 0x1000:

 // in src/main.rs #[cfg(not(test))] fn kernel_main(boot_info: &'static BootInfo) -> ! { [тАж] let page = Page::containing_address(VirtAddr::new(0xdeadbeaf000)); [тАж] } 

рдпрджрд┐ рдЗрд╕реЗ рдкреНрд░рд╛рд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдирд┐рдореНрди рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рдПрдХ рдШрдмрд░рд╛рд╣рдЯ рд╣реЛрддреА рд╣реИ:

 panicked at 'map_to failed: FrameAllocationFailed', /тАж/result.rs:999:5 

рдЙрди рдкреГрд╖реНрдареЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдЕрднреА рддрдХ рдкреГрд╖реНрда рд╕реНрддрд░ 1 рддрд╛рд▓рд┐рдХрд╛ рдирд╣реАрдВ рд╣реИ, рдЖрдкрдХреЛ рд╕рд╣реА рдПрдХ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ FrameAllocatorред рд▓реЗрдХрд┐рди рдЖрдк рдХреИрд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕реЗ рдлреНрд░реЗрдо рдореБрдлреНрдд рд╣реИрдВ рдФрд░ рдХрд┐рддрдиреА рднреМрддрд┐рдХ рдореЗрдореЛрд░реА рдЙрдкрд▓рдмреНрдз рд╣реИ?

рдлреНрд░реЗрдо рдЪрдпрди


рдирдП рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕рд╣реА рдлреНрд░реЗрдо рд╡рд┐рддрд░рдХ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдЗрдП рд╕рд╛рдорд╛рдиреНрдп рдХрдВрдХрд╛рд▓ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВ:

 // in src/memory.rs pub struct BootInfoFrameAllocator<I> where I: Iterator<Item = PhysFrame> { frames: I, } impl<I> FrameAllocator<Size4KiB> for BootInfoFrameAllocator<I> where I: Iterator<Item = PhysFrame> { fn allocate_frame(&mut self) -> Option<PhysFrame> { self.frames.next() } } 

рдХреНрд╖реЗрддреНрд░ framesрдХреЛ рдПрдХ рдордирдорд╛рдирд╛ рдлреНрд░реЗрдо рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде рдЖрд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЖрдкрдХреЛ allocрд╡рд┐рдзрд┐ рдХреЛ рдХреЗрд╡рд▓ рдХреЙрд▓ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ Iterator::nextред

рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо BootInfoFrameAllocatorрдореЗрдореЛрд░реА рдХрд╛рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ memory_mapрдЬреЛ рдмреВрдЯрд▓реЛрдбрд░ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ BootInfoред рдЬреИрд╕рд╛ рдХрд┐ рдмреВрдЯ рд╕реВрдЪрдирд╛ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ , рдореЗрдореЛрд░реА рдХрд╛рд░реНрдб BIOS / UEFI рдлрд░реНрдорд╡реЗрдпрд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдмреВрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╣реА рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдмреВрдЯрд▓реЛрдбрд░ рдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдп рдХрд╣рд╛ рд╣реИред

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

рдкреНрд░рд╛рд░рдВрднрд┐рдХ BootInfoFrameAllocatorрдХрд╛рд░реНрдп рдПрдХ рдирдП рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ init_frame_allocator:

 // in src/memory.rs use bootloader::bootinfo::{MemoryMap, MemoryRegionType}; /// Create a FrameAllocator from the passed memory map pub fn init_frame_allocator( memory_map: &'static MemoryMap, ) -> BootInfoFrameAllocator<impl Iterator<Item = PhysFrame>> { // get usable regions from memory map let regions = memory_map .iter() .filter(|r| r.region_type == MemoryRegionType::Usable); // map each region to its address range let addr_ranges = regions.map(|r| r.range.start_addr()..r.range.end_addr()); // transform to an iterator of frame start addresses let frame_addresses = addr_ranges.flat_map(|r| r.step_by(4096)); // create `PhysFrame` types from the start addresses let frames = frame_addresses.map(|addr| { PhysFrame::containing_address(PhysAddr::new(addr)) }); BootInfoFrameAllocator { frames } } 

рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдЙрдкрдпреЛрдЧ MemoryMapрдХрд┐рдП рдЧрдП рднреМрддрд┐рдХ рдлрд╝реНрд░реЗрдореЛрдВ рдХреЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореЗрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдирдХреНрд╢реЗ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдпреЛрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ :

  • рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо iterрдореЗрдореЛрд░реА рдХрд╛рд░реНрдб рдХреЛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ рдХрд╣рддреЗ рд╣реИрдВ MemoryRegionред рддрдм рд╣рдо filterрдЖрд░рдХреНрд╖рд┐рдд рдпрд╛ рджреБрд░реНрдЧрдо рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд▓реЛрдбрд░ рдЕрдкрдиреЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рд╕рднреА рдореИрдкрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдХрд╛рд░реНрдб рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХрд░реНрдиреЗрд▓ (рдХреЛрдб, рдбреЗрдЯрд╛ рдпрд╛ рд╕реНрдЯреИрдХ) рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝реНрд░реЗрдо рдпрд╛ рдмреВрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА InUseрдпрд╛ рдЗрд╕реА рддрд░рд╣ рд╕реЗ рдЪрд┐рд╣реНрдирд┐рдд рд╣реИрдВ ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдлрд╝реНрд░реЗрдо рдХрд╛ UsableрдЙрдкрдпреЛрдЧ рдХрд╣реАрдВ рдФрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред
  • map range Rust .
  • : into_iter , 4096- step_by . 4096 (= 4 ) тАФ , . , . flat_map map , Iterator<Item = u64> Iterator<Item = Iterator<Item = u64>> .
  • PhysFrame , Iterator<Item = PhysFrame> . BootInfoFrameAllocator .

рдЕрдм рд╣рдо рдЗрд╕рдХреЗ рдмрдЬрд╛рдп kernel_mainрдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рдлрд╝рдВрдХреНрд╢рди рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ :BootInfoFrameAllocatorEmptyFrameAllocator

 // in src/main.rs #[cfg(not(test))] fn kernel_main(boot_info: &'static BootInfo) -> ! { [тАж] let mut frame_allocator = memory::init_frame_allocator(&boot_info.memory_map); [тАж] } 

рдЗрд╕ рдмрд╛рд░ рдкрддрд╛ рдорд╛рдирдЪрд┐рддреНрд░рдг рд╕рдлрд▓ рд░рд╣рд╛ рдФрд░ рд╣рдо рдлрд┐рд░ рд╕реЗ "рдирдпрд╛!" редрджреГрд╢реНрдпреЛрдВ рдХреЗ рдкреАрдЫреЗ, рд╡рд┐рдзрд┐ map_toрдЕрдиреБрдкрд▓рдмреНрдз рдкреЗрдЬ рдЯреЗрдмрд▓ рдмрдирд╛рддреА рд╣реИ:

  • рдкреНрд░реЗрд╖рд┐рдд рдПрдХ рд╕реЗ рдЕрдкреНрд░рдпреБрдХреНрдд рдлреНрд░реЗрдо рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ frame_allocatorред
  • рдПрдХ рдирдпрд╛ рдЦрд╛рд▓реА рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реВрдиреНрдп рдлреНрд░реЗрдоред
  • рдЗрд╕ рдлрд╝реНрд░реЗрдо рдореЗрдВ рдЙрдЪреНрдЪ рд╕реНрддрд░реАрдп рддрд╛рд▓рд┐рдХрд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЛ рдореИрдк рдХрд░реЗрдВред
  • рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдЕрдЧрд▓реЗ рд╕реНрддрд░ рдкрд░ рдЬрд╛рдПрдВред

рдпрджреНрдпрдкрд┐ рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдп create_example_mappingрдХреЗрд╡рд▓ рдирдореВрдирд╛ рдХреЛрдб рд╣реИ, рд╣рдо рдЕрдм рдордирдорд╛рдиреЗ рдкрдиреНрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдирдП рдорд╛рдирдЪрд┐рддреНрд░рдг рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╕реНрдореГрддрд┐ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдФрд░ рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓реЗрдЦреЛрдВ рдореЗрдВ рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ред

рд╕рд╛рд░рд╛рдВрд╢


рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рднреМрддрд┐рдХ рдлрд╝реНрд░реЗрдореЛрдВ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реАрдЦрд╛, рдЬрд┐рд╕рдореЗрдВ рдкрд╣рдЪрд╛рди рдорд╛рдирдЪрд┐рддреНрд░рдг, рдкреВрд░реНрдг рднреМрддрд┐рдХ рд╕реНрдореГрддрд┐ рдореИрдкрд┐рдВрдЧ, рдЕрд╕реНрдерд╛рдпреА рдорд╛рдирдЪрд┐рддреНрд░рдг рдФрд░ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рд╣рдордиреЗ рдкреВрд░реНрдг рднреМрддрд┐рдХ рд╕реНрдореГрддрд┐ рдХреЛ рдПрдХ рд╕рд░рд▓ рдФрд░ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╡рд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪреБрдирд╛ред

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

рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП, рд╣рдо рдкрд╣рд▓реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЧрдП, рдПрдХ рдЕрдиреБрд╡рд╛рдж рдХрд╛рд░реНрдп рдХрд┐рдпрд╛, рдФрд░ рдлрд┐рд░ MappedPageTableрдЯреЛрдХрд░рд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛x86_64ред рд╣рдордиреЗ рдпрд╣ рднреА рд╕реАрдЦрд╛ рдХрд┐ рдкреЗрдЬ рдЯреЗрдмрд▓ рдореЗрдВ рдирдП рдореИрдкрд┐рдВрдЧ рдХреИрд╕реЗ рдмрдирд╛рдПрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ FrameAllocatorрдмреВрдЯрд▓реЛрдбрд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд░реЗрд╖рд┐рдд рдореЗрдореЛрд░реА рдХрд╛рд░реНрдб рдкрд░ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдП ред

рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реИ?


рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдЕрдкрдиреЗ рдХрд░реНрдиреЗрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдвреЗрд░ рд╕реНрдореГрддрд┐ рдХреНрд╖реЗрддреНрд░ рдмрдирд╛рдПрдВрдЧреЗ, рдЬреЛ рд╣рдореЗрдВ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ ред

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


All Articles