рд░рд╕реНрдЯ рдкрд░ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдоред рдкреЗрдЬ рдореЗрдореЛрд░реА: рдЙрдиреНрдирдд

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

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

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


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

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

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


рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ x86_64 рд╕рдВрд╕реНрдХрд░рдг 0.4.0 рдпрд╛ рдмрд╛рдж рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ Cargo.toml рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ:

 [dependencies] x86_64 = "0.4.0" # or later 

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


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



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

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

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

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



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

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

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

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



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

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

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

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

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

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

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


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

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



рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдПрдХрдорд╛рддреНрд░ рдЕрдВрддрд░ 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-рдмрд┐рдЯ рдЗрдВрдбреЗрдХреНрд╕ рдЯреЗрдмрд▓ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рд╣реЗрдХреНрд╕рд╛рдбреЗрд╕рд┐рдорд▓ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рдЬрд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рд┐рддреНрд░ рдЪрд╛рд░ рдмрд┐рдЯреНрд╕ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред

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


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

рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдЗрд╕ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдореИрдкрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╣рд╛рд░реНрдб-рдХреЛрдбрд┐рдд рдкрддреЗ 0xffff_ffff_ffff_f000 рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрддрд░ 4 рддрд╛рд▓рд┐рдХрд╛ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдерд╛ред рдпрджрд┐ рд╣рдо рдЗрд╕ рдкрддреЗ рдХреЛ рдСрдХреНрдЯрд▓ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдКрдкрд░ рджреА рдЧрдИ рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдЗрд╕рдХреА рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдпрд╣ RRR = 0o777 , AAAA = 0 рдФрд░ рд╕рд╛рдЗрди 1 рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдмрд┐рдЯреНрд╕ рдХреЗ рд╕рд╛рде рд╕реНрддрд░ 4 рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рдХреА рд╕рдВрд░рдЪрдирд╛ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ:

  рд╕рдВрд░рдЪрдирд╛: 0o_SSSSSS_RRR_RRR_RRR_RRR_AAAA
 рдкрддрд╛: 0o_177777_777_777_777_777_0000 

рдкреБрдирд░рд╛рд╡рд░реНрддреА рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рдЬреНрдЮрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЕрдм рд╣рдо рд╕рднреА рд╕рдХреНрд░рд┐рдп рддрд╛рд▓рд┐рдХрд╛рдУрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрднрд╛рд╕реА рдкрддреЗ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдкреНрд░рд╕рд╛рд░рдг рд╕рдорд╛рд░реЛрд╣ рдмрдирд╛рддреЗ рд╣реИрдВред

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


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

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

 // in src/memory.rs use x86_64::PhysAddr; use x86_64::structures::paging::PageTable; /// Returns the physical address for the given virtual address, or `None` if the /// virtual address is not mapped. pub fn translate_addr(addr: usize) -> Option<PhysAddr> { // introduce variables for the recursive index and the sign extension bits // TODO: Don't hardcode these values 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); // check that level 4 entry is mapped let level_4_table = unsafe { &*(level_4_table_addr as *const PageTable) }; if level_4_table[l4_idx].addr().is_null() { return None; } // check that level 3 entry is mapped let level_3_table = unsafe { &*(level_3_table_addr as *const PageTable) }; if level_3_table[l3_idx].addr().is_null() { return None; } // check that level 2 entry is mapped let level_2_table = unsafe { &*(level_2_table_addr as *const PageTable) }; if level_2_table[l2_idx].addr().is_null() { return None; } // check that level 1 entry is mapped and retrieve physical address from it let level_1_table = unsafe { &*(level_1_table_addr as *const PageTable) }; let phys_addr = level_1_table[l1_idx].addr(); if phys_addr.is_null() { return None; } Some(phys_addr + page_offset) } 

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╕реВрдЪрдХрд╛рдВрдХ (511 = 0o777 ) рдФрд░ рд╕рдВрдХреЗрдд рд╡рд┐рд╕реНрддрд╛рд░ рдмрд┐рдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдЪрд░ рдкреЗрд╢ рдХрд░рддреЗ рд╣реИрдВ (рдкреНрд░рддреНрдпреЗрдХ 1 рд╣реИ)ред рддрдм рд╣рдо рдкреГрд╖реНрда рд╕рд╛рд░рдгреА рдХреЗ рдЕрдиреБрдХреНрд░рдорд┐рдд рдФрд░ рдмрд┐рдЯрд╡рд╛рдЗрдЬ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдСрдлрд╕реЗрдЯ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЪрд┐рддреНрд░рдг рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:



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

рдкрддреЗ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЗрдВрдбреЗрдХреНрд╕рд┐рдВрдЧ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рд░рд┐рдХреЙрд░реНрдб 4 рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╕реНрддрд░ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдпрд╣ рд░рд┐рдХреЙрд░реНрдб рд╢реВрдиреНрдп рд╣реИ, рддреЛ рдЗрд╕ рд╕реНрддрд░ 4 рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕реНрддрд░ 3 рддрд╛рд▓рд┐рдХрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ addr рдХрд┐рд╕реА рднреА рднреМрддрд┐рдХ рдореЗрдореЛрд░реА рдореЗрдВ рдореИрдк рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рд╣рдо None рд▓реМрдЯрд╛рддреЗред рдЕрдиреНрдпрдерд╛, рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рд╕реНрддрд░ 3 рддрд╛рд▓рд┐рдХрд╛ рдореМрдЬреВрдж рд╣реИред рдлрд┐рд░ рд╣рдо рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рджреЛрд╣рд░рд╛рддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдкрд┐рдЫрд▓реЗ рд╕реНрддрд░ рдкрд░ рд╣реИред

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

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

рдХреЛрд╢рд┐рд╢


рдЖрдЗрдП рд╣рдорд╛рд░реЗ _start рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╡рд░реНрдЪреБрдЕрд▓ рдкрддреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд╡рд╛рдж рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:

 // in src/main.rs #[cfg(not(test))] #[no_mangle] pub extern "C" fn _start() -> ! { [тАж] // initialize GDT, IDT, PICS use blog_os::memory::translate_addr; // the identity-mapped vga buffer page println!("0xb8000 -> {:?}", translate_addr(0xb8000)); // some code page println!("0x20010a -> {:?}", translate_addr(0x20010a)); // some stack page println!("0x57ac001ffe48 -> {:?}", translate_addr(0x57ac001ffe48)); println!("It did not crash!"); blog_os::hlt_loop(); } 


рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рдгрд╛рдо рджреЗрдЦрддреЗ рд╣реИрдВ:



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

RecursivePageTable


x86_64 рдПрдХ RecursivePageTable рдкреНрд░рдХрд╛рд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рд╕реБрд░рдХреНрд╖рд┐рдд рд╕рд╛рд░ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЖрдк translate_addr рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрдзрд┐рдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 // 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. /// /// This function is unsafe because it can break memory safety if an invalid /// address is passed. pub unsafe fn init(level_4_table_addr: usize) -> RecursivePageTable<'static> { let level_4_table_ptr = level_4_table_addr as *mut PageTable; let level_4_table = &mut *level_4_table_ptr; RecursivePageTable::new(level_4_table).unwrap() } /// Returns the physical address for the given virtual address, or `None` if /// the virtual address is not mapped. pub fn translate_addr(addr: u64, recursive_page_table: &RecursivePageTable) -> Option<PhysAddr> { 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())) } 

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

рд╣рдорд╛рд░реЗ _start рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкреБрди: рд╕рд╛рдЗрди рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

 // in src/main.rs #[cfg(not(test))] #[no_mangle] pub extern "C" fn _start() -> ! { [тАж] // initialize GDT, IDT, PICS use blog_os::memory::{self, translate_addr}; const LEVEL_4_TABLE_ADDR: usize = 0o_177777_777_777_777_777_0000; let recursive_page_table = unsafe { memory::init(LEVEL_4_TABLE_ADDR) }; // the identity-mapped vga buffer page println!("0xb8000 -> {:?}", translate_addr(0xb8000, &recursive_page_table)); // some code page println!("0x20010a -> {:?}", translate_addr(0x20010a, &recursive_page_table)); // some stack page println!("0x57ac001ffe48 -> {:?}", translate_addr(0x57ac001ffe48, &recursive_page_table)); println!("It did not crash!"); blog_os::hlt_loop(); } 

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

рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрд┐рдд рдореВрд▓ рдЕрдиреБрд╡рд╛рдж рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдорд╛рди рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИред

рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рдмрдирд╛рдирд╛


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

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

 pub unsafe fn init(level_4_table_addr: usize) -> RecursivePageTable<'static> { let level_4_table_ptr = level_4_table_addr as *mut PageTable; let level_4_table = &mut *level_4_table_ptr; // <- this operation is unsafe RecursivePageTable::new(level_4_table).unwrap() } 

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рддреБрд░рдВрдд рдпрд╣ рдирд╣реАрдВ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕реЗ рд╣рд┐рд╕реНрд╕реЗ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рджреЗрдЦреЗ рдмрд┐рдирд╛ ,RecursivePageTable::new рд╣рдо рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд╕рдХрддреЗ рдХрд┐ рдпрд╣ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЗрд╕рд▓рд┐рдП рдЧрд▓рддреА рд╕реЗ рдХреБрдЫ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдЫреЛрдбрд╝рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред

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

 // in src/memory.rs pub unsafe fn init(level_4_table_addr: usize) -> RecursivePageTable<'static> { /// Rust currently treats the whole body of unsafe functions as an unsafe /// block, which makes it difficult to see which operations are unsafe. To /// limit the scope of unsafe we use a safe inner function. fn init_inner(level_4_table_addr: usize) -> RecursivePageTable<'static> { let level_4_table_ptr = level_4_table_addr as *mut PageTable; let level_4_table = unsafe { &mut *level_4_table_ptr }; RecursivePageTable::new(level_4_table).unwrap() } init_inner(level_4_table_addr) } 

рдЕрдм unsafeрдбреЗрд░реЗрдлреЗрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдмреНрд▓реЙрдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рд╣реИ level_4_table_ptr, рдФрд░ рд╣рдо рддреБрд░рдВрдд рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпреЗ рдХреЗрд╡рд▓ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдСрдкрд░реЗрд╢рди рд╣реИрдВред рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЗрд╕ рдЕрд╕рдлрд▓ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП RFC рдЦреБрд▓рд╛ рд╣реИред

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


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

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

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

рд╣рдо рдЗрд╕реЗ create_mapingрдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдПрдХ рдирдП рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ memory:

 // in src/memory.rs use x86_64::structures::paging::{FrameAllocator, PhysFrame, Size4KiB}; pub fn create_example_mapping( recursive_page_table: &mut RecursivePageTable, frame_allocator: &mut impl FrameAllocator<Size4KiB>, ) { use x86_64::structures::paging::PageTableFlags as Flags; let page: Page = Page::containing_address(VirtAddr::new(0x1000)); let frame = PhysFrame::containing_address(PhysAddr::new(0xb8000)); let flags = Flags::PRESENT | Flags::WRITABLE; let map_to_result = unsafe { recursive_page_table.map_to(page, frame, flags, frame_allocator) }; map_to_result.expect("map_to failed").flush(); } 

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

pageframemap_toPRESENTWRITABLE

FrameAllocatormap_toрдХреНрдпреЛрдВрдХрд┐ рдирдП рдкреЗрдЬ рдЯреЗрдмрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкреНрд░рдпреБрдХреНрдд рдлреНрд░реЗрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рддрд░реНрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ Size4KiBрдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ, PageрдФрд░ PhysFrameрдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд▓рд┐рдП PageSize, рдорд╛рдирдХ 4 KiB рдкреГрд╖реНрдареЛрдВ рдХреЗ рд╕рд╛рде рдФрд░ рднрд╛рд░реА рдкреГрд╖реНрдареЛрдВ 2 MiB / 1 GiB рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ред

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

рдЪреВрдВрдХрд┐ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдкрддреЗ 0x1000рдХреЛ рдирдП рдкреЗрдЬ рдЯреЗрдмрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣ FrameAllocatorрд╣рдореЗрд╢рд╛ рд╡рд╛рдкрд╕ рдЖ рд╕рдХрддрд╛ рд╣реИ 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 } } 

(рдпрджрд┐ рддреНрд░реБрдЯрд┐ 'рд╡рд┐рдзрд┐ allocate_frameрд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рд╕рджрд╕реНрдп рдирд╣реАрдВ рд╣реИ FrameAllocator' рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ , рддреЛ рдЖрдкрдХреЛ x86_64рд╕рдВрд╕реНрдХрд░рдг 0.4.0 рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ред)

рдЕрдм рд╣рдо рдирдП рдЕрдиреБрд╡рд╛рдж рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 // in src/main.rs #[cfg(not(test))] #[no_mangle] pub extern "C" fn _start() -> ! { [тАж] // initialize GDT, IDT, PICS use blog_os::memory::{create_example_mapping, EmptyFrameAllocator}; const LEVEL_4_TABLE_ADDR: usize = 0o_177777_777_777_777_777_0000; let mut recursive_page_table = unsafe { memory::init(LEVEL_4_TABLE_ADDR) }; create_example_mapping(&mut recursive_page_table, &mut EmptyFrameAllocator); unsafe { (0x1900 as *mut u64).write_volatile(0xf021f077f065f04e)}; println!("It did not crash!"); blog_os::hlt_loop(); } 

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

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

рдЬрдм рд╣рдо рдЗрд╕реЗ QEMU рдореЗрдВ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ:



рд╕реНрдХреНрд░реАрди рдкрд░ рд╢рд┐рд▓рд╛рд▓реЗрдЦред

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

 // in src/memory.rs pub fn create_example_mapping(тАж) { [тАж] let page: Page = Page::containing_address(VirtAddr::new(0xdeadbeaf000)); [тАж] } // in src/main.rs #[no_mangle] pub extern "C" fn _start() -> ! { [тАж] unsafe { (0xdeadbeaf900 as *mut u64).write_volatile(0xf021f077f065f04e)}; [тАж] } 

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

 'map_to рдореЗрдВ рд╡рд┐рдлрд▓: рдлрд╝реНрд░реЗрдордЕрд▓реЛрдХреЗрд╢рди рдлрд╝реЗрд▓реНрдб', /.../result.rs:999pes 

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

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


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

рдУрдПрд╕ рдХреЗ рдХрд░реНрдиреЗрд▓ рдХреЛ рдЬрд╛рдирдХрд╛рд░реА рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдлрд╝рдВрдХреНрд╢рди _startрдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЛрдбрд░ рдмреВрдЯ рдХреА рд╕реВрдЪрдирд╛ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд▓рд┐рдВрдХ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рддрд░реНрдХ рдХреЛ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдп рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:

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

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

  • рдлрд╝реАрд▓реНрдб p4_table_addrрдореЗрдВ рд╕реНрддрд░ 4 рдкреГрд╖реНрдареЛрдВ рдХреА рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╡рд░реНрдЪреБрдЕрд▓ рдкрддрд╛ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдкрддреЗ рдХреЛ рдореБрд╢реНрдХрд┐рд▓ рд╕реЗ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ 0o_177777_777_777_777_777_0000ред
  • рдХреНрд╖реЗрддреНрд░ memory_mapрд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд░реБрдЪрд┐ рдХрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рд╕рднреА рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░реЛрдВ рдФрд░ рдЙрдирдХреЗ рдкреНрд░рдХрд╛рд░ (рдЕрдкреНрд░рдпреБрдХреНрдд, рдЖрд░рдХреНрд╖рд┐рдд рдпрд╛ рдЕрдиреНрдп) рдХреА рдПрдХ рд╕реВрдЪреА рд╢рд╛рдорд┐рд▓ рд╣реИред
  • рдлрд╝реАрд▓реНрдб packageрд▓реЛрдбрд░ рдХреЗ рд╕рд╛рде рдЕрддрд┐рд░рд┐рдХреНрдд рдбреЗрдЯрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдлрд╝рдВрдХреНрд╢рди рд╣реИред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдЕрднреА рдХреЗ рд▓рд┐рдП рдЕрдирджреЗрдЦрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

memory_mapрд╕рд╣реА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝реАрд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ FrameAllocator, рд╣рдо рд╕рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ boot_infoред

рдореИрдХреНрд░реЛ entry_point


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

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

 // in src/main.rs use bootloader::{bootinfo::BootInfo, entry_point}; entry_point!(kernel_main); #[cfg(not(test))] fn kernel_main(boot_info: &'static BootInfo) -> ! { [тАж] // initialize GDT, IDT, PICS let mut recursive_page_table = unsafe { memory::init(boot_info.p4_table_addr as usize) }; [тАж] // create and test example mapping println!("It did not crash!"); blog_os::hlt_loop(); } 

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

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЕрдм рд╣рдо рдПрдХ memory::initрд╣рд╛рд░реНрдб-рдХреЛрдбреЗрдб рдкрддреЗ рдкрд░ рднреЗрдЬ рд░рд╣реЗ рд╣реИрдВ , рд▓реЗрдХрд┐рди boot_info.p4_table_addrред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХреЛрдб рдХрд╛рдо рдХрд░реЗрдЧрд╛ рднрд▓реЗ рд╣реА рдмреВрдЯрд▓реЛрдбрд░ рдХрд╛ рднрд╡рд┐рд╖реНрдп рд╕рдВрд╕реНрдХрд░рдг рдкреБрдирд░рд╛рд╡рд░реНрддреА рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдкреГрд╖реНрда рд╕реНрддрд░ 4 рддрд╛рд▓рд┐рдХрд╛ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдПрдХ рдФрд░ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИред

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


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

 // 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рдПрдХ рдордирдорд╛рдирд╛ рдлреНрд░реЗрдо рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рджреНрд╡рд╛рд░рд╛ рдЖрд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред рдпрд╣ рдЖрдкрдХреЛ Iteratoralloc рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ :: рдЕрдЧрд▓реА рд╡рд┐рдзрд┐ ред

рдкреНрд░рд╛рд░рдВрднрд┐рдХ 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.into_iter().step_by(4096)); // create `PhysFrame` types from the start addresses let frames = frame_addresses.map(|addr| { PhysFrame::containing_address(PhysAddr::new(addr)) }); BootInfoFrameAllocator { frames } } 

рдпрд╣ рдлрд╝рдВрдХреНрд╢рди, рдПрдХ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдореВрд▓ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рдорд╛рдирдЪрд┐рддреНрд░ рдХреЛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рднреМрддрд┐рдХ рдлрд╝реНрд░реЗрдореЛрдВ рдХреЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ:

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

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

 // in src/main.rs #[cfg(not(test))] fn kernel_main(boot_info: &'static BootInfo) -> ! { [тАж] // initialize GDT, IDT, PICS use x86_64::structures::paging::{PageTable, RecursivePageTable}; let mut recursive_page_table = unsafe { memory::init(boot_info.p4_table_addr as usize) }; // new let mut frame_allocator = memory::init_frame_allocator(&boot_info.memory_map); blog_os::memory::create_mapping(&mut recursive_page_table, &mut frame_allocator); unsafe { (0xdeadbeaf900 as *mut u64).write_volatile(0xf021f077f065f04e)}; println!("It did not crash!"); blog_os::hlt_loop(); } 

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

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

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

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


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

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

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


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

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


All Articles