OS1: x86 рдХреЗ рд▓рд┐рдП рдЬрдВрдЧ рдкрд░ рдПрдХ рдЖрджрд┐рдо рдХрд░реНрдиреЗрд▓ред рднрд╛рдЧ 2. рд╡реАрдЬреАрдП, рдЬреАрдбреАрдЯреА, рдЖрдИрдбреАрдЯреА

рдкрд╣рд▓рд╛ рднрд╛рдЧ


рдкрд╣рд▓реЗ рд▓реЗрдЦ рдХреЗ рдкрд╛рд╕ рдЕрднреА рддрдХ рдардВрдбрд╛ рд╣реЛрдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдкреЗрдЪреАрджрд╛ рди рд░рдЦреЗрдВ рдФрд░ рдЕрдЧрд▓реА рдХрдбрд╝реА рд▓рд┐рдЦреЗрдВред


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


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


рдЬрдВрдЧ рд╕реЗрдЯрдЕрдк


рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХреБрдЫ рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдЖрдк рдлрд┐рд▓рд┐рдк рдмреНрд▓реЙрдЧ рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рд░реБрдХреВрдВрдЧрд╛ред


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


rustup override add nightly-YYYY-MM-DD 

рддрдВрддреНрд░ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП, рдХреГрдкрдпрд╛ рдпрд╣рд╛рдВ рд╕рдВрдкрд░реНрдХ рдХрд░реЗрдВ ред


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


 { "llvm-target": "i686-unknown-none", "data-layout": "em:ep:32:32-f64:32:64-f80:32-n8:16:32-S128", "arch": "x86", "target-endian": "little", "target-pointer-width": "32", "target-c-int-width": "32", "os": "none", "executables": true, "linker-flavor": "ld.lld", "linker": "rust-lld", "panic-strategy": "abort", "disable-redzone": true, "features": "-mmx,-sse,+soft-float" } 

рдпрд╣рд╛рдВ рд╕рдмрд╕реЗ рдХрдард┐рди рд╣рд┐рд╕реНрд╕рд╛ " рдбреЗрдЯрд╛-рд▓реЗрдЖрдЙрдЯ " рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИред LLVM рдкреНрд░рд▓реЗрдЦрди рд╣рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдпреЗ "-" рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рд▓реЗрдЖрдЙрдЯ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред рдмрд╣реБрдд рдкрд╣рд▓реЗ "рдИ" рдЪрд░рд┐рддреНрд░ рднрд╛рд░рддреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ - рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдереЛрдбрд╝рд╛-рд╕рд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдордВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рджреВрд╕рд░рд╛ рдЪрд░рд┐рддреНрд░ рд╣реИ, "рд╡рд┐рдХреГрддрд┐"ред рд▓реЗрдЖрдЙрдЯ рдХреЗ рджреМрд░рд╛рди рдЪрд░рд┐рддреНрд░ рдХреЗ рдирд╛рдо рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ред рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░рд╛ рдЖрдЙрдЯрдкреБрдЯ рд╕реНрд╡рд░реВрдк ELF рд╣реЛрдЧрд╛ (рдирд┐рд░реНрдорд╛рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреЗрдЦреЗрдВ), рд╣рдо "m: e" рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВред рддреАрд╕рд░рд╛ рдЪрд░рд┐рддреНрд░ рдмрд┐рдЯреНрд╕ рдФрд░ рдПрдмреАрдЖрдИ (рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрд╛рдЗрдирд░реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕) рдореЗрдВ рд╕реВрдЪрдХ рдХрд╛ рдЖрдХрд╛рд░ рд╣реИред рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 32 рдмрд┐рдЯреНрд╕ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕рд╛рд╣рд╕рдкреВрд░реНрд╡рдХ "рдкреА: 32: 32" рдбрд╛рд▓рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдмрд╛рдж рдлреНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рдирдВрдмрд░ рд╣реИрдВред рд╣рдо рд░рд┐рдкреЛрд░реНрдЯ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдПрд▓рд╛рдЗрди 32 рдХреЗ рдЕрдиреБрд╕рд╛рд░ 64-рдмрд┐рдЯ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕рдВрд░реЗрдЦрдг 64 рдХреЗ рд╕рд╛рде рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ - "f64: 32: 64", рд╕рд╛рде рд╣реА рд╕рд╛рде рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрд░реЗрдЦрдг рдХреЗ рд╕рд╛рде 80-рдмрд┐рдЯ рд╕рдВрдЦреНрдпрд╛ - "f80: 32"ред рдЕрдЧрд▓рд╛ рддрддреНрд╡ рдкреВрд░реНрдгрд╛рдВрдХ рд╣реИред рд╣рдо 8 рдмрд┐рдЯреНрд╕ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреА рдЕрдзрд┐рдХрддрдо 32 рдмрд┐рдЯреНрд╕ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ - "n8: 16: 32"ред рдЕрдВрддрд┐рдо рд╕реНрдЯреИрдХ рд╕рдВрд░реЗрдЦрдг рд╣реИред рдореБрдЭреЗ 128 рдмрд┐рдЯ рдкреВрд░реНрдгрд╛рдВрдХ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ S128 рд╣реЛрдиреЗ рджреЗрдВред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрд▓рдПрд▓рд╡реАрдПрдо рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рд╣рдорд╛рд░реА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реИред


рд╢реЗрд╖ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдЖрдк рдлрд┐рд▓рд┐рдк рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд╣ рд╕рдм рдХреБрдЫ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдордЭрд╛рддрд╛ рд╣реИред


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


 cargo install cargo-xbuild 

рд╣рдо рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдПрдХрддреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗред


 cargo xbuild -Z unstable-options --manifest-path=kernel/Cargo.toml --target kernel/targets/$(ARCH).json --out-dir=build/lib 

рдореБрдЭреЗ рдореЗрдХ рдХреЗ рд╕рд╣реА рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдПрдХ рдореИрдирд┐рдлрд╝реЗрд╕реНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд░реВрдЯ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдХрд░реНрдиреЗрд▓ рдХрд░реНрдиреЗрд▓ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реЛрддрд╛ рд╣реИред


рдореИрдирд┐рдлрд╝реЗрд╕реНрдЯ рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдореЗрдВ, рдореИрдВ рдХреЗрд╡рд▓ рдЯреЛрдХрд░рд╛-рдкреНрд░рдХрд╛рд░ = ["рд╕реНрдЯреЗрдЯрд▓рд┐рдм"] рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдЬреЛ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рджреЗрддрд╛ рд╣реИред рд╣рдо рдЙрд╕реЗ рдПрд▓рдПрд▓рдбреА рдореЗрдВ рдЦрд┐рд▓рд╛рдПрдВрдЧреЗред


kmain рдФрд░ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реЗрдЯрдЕрдк


рд░рд╕реНрдЯ рд╕рдореНрдореЗрд▓рдиреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдпрджрд┐ рд╣рдо рдПрдХ рд╕реНрдерд┐рд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп (рдпрд╛ "рдлреНрд▓реИрдЯ" рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓) рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдЯреЛрдХрд░реЗ рдХреА рдЬрдбрд╝ рдореЗрдВ рдлрд╝рд╛рдЗрд▓ lib.rs рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдХрд┐ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рд╣реИред рдЗрд╕рдореЗрдВ, рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рдорджрдж рд╕реЗ, рднрд╛рд╖рд╛ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рд╕рд╛рде рд╣реА рдХрд╝реАрдорддреА kmain рд╕реНрдерд┐рдд рд╣реИред


рддреЛ, рдкрд╣рд▓реЗ рдЪрд░рдг рдореЗрдВ рд╣рдореЗрдВ рдПрд╕рдЯреАрдбреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдПрдХ рдореИрдХреНрд░реЛ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


 #![no_std] 

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


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


 #![no_std] #[macro_use] pub mod debug; #[cfg(target_arch = "x86")] #[path = "arch/i686/mod.rs"] pub mod arch; #[no_mangle] extern "C" fn kmain(pd: usize, mb_pointer: usize, mb_magic: usize) { arch::arch_init(pd); ...... } #[panic_handler] fn panic(_info: &PanicInfo) -> ! { println!("{}", _info); loop {} } 

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


рдореИрдВрдиреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░рд╛рдЗрдорд░реА рдкреИрдирд┐рдХ рд╣реИрдВрдбрд▓рд░ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛, рдЬрд┐рд╕реЗ рд░рд╕реНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдлрд┐рд░ рдЗрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред


kmain рддреАрди рддрд░реНрдХреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ C рдиреЛрдЯреЗрд╢рди рдореЗрдВ рдирд╛рдо рд╡рд┐рд░реВрдкрдг рдХреЗ рдмрд┐рдирд╛ рднреА рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рд▓рд┐рдВрдХрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ _loader рд╕реЗ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝ рд╕рдХреЗ, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдерд╛ред рдкрд╣рд▓рд╛ рддрд░реНрдХ PD рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдкрддрд╛ рд╣реИ, рджреВрд╕рд░рд╛ GRUB рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рднреМрддрд┐рдХ рдкрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд╕реЗ рд╣рдореЗрдВ рдореЗрдореЛрд░реА рдХрд╛рд░реНрдб рдорд┐рд▓реЗрдЧрд╛, рддреАрд╕рд░рд╛ рдореИрдЬрд┐рдХ рдирдВрдмрд░ рд╣реИред рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдореИрдВ рдорд▓реНрдЯреАрдмреВрдЯ 2 рд╕рдорд░реНрдерди рдФрд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдмреВрдЯрд▓реЛрдбрд░ рджреЛрдиреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдмреВрдЯ рд╡рд┐рдзрд┐ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдореИрдЬрд┐рдХ рдирдВрдмрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред


рдкрд╣рд▓рд╛ kmain рдХреЙрд▓ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рд╣реИред рд╣рдо рдЕрдВрджрд░ рдЬрд╛рддреЗ рд╣реИрдВред Arch_init рдлрд╝рдВрдХреНрд╢рди рдлрд╝рд╛рдЗрд▓ рдЖрд░реНрдХ / i686 / mod.rs рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ, рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╣реИ, 32-рдмрд┐рдЯ x86- рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ, рдФрд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:


 pub fn arch_init(pd: usize) { unsafe { vga::VGA_WRITER.lock().init(); gdt::setup_gdt(); idt::init_idt(); paging::setup_pd(pd); } } 

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


рд╡реАрдЬреАрдП рдЖрд░рдВрднреАрдХрд░рдг


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


 use lazy_static::lazy_static; use spin::Mutex; lazy_static! { pub static ref VGA_WRITER : Mutex<Writer> = Mutex::new(Writer { cursor_position: 0, vga_color: ColorCode::new(Color::LightGray, Color::Black), buffer: unsafe { &mut *(0xC00B8000 as *mut VgaBuffer) } }); } 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рд╕реНрдХреНрд░реАрди рдмрдлрд░ рднреМрддрд┐рдХ рдкрддреЗ 0xB8000 рдкрд░ рд╕реНрдерд┐рдд рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЖрдХрд╛рд░ 80x25x2 рдмрд╛рдЗрдЯреНрд╕ (рд╕реНрдХреНрд░реАрди рдХреА рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдВрдЪрд╛рдИ, рдкреНрд░рддрд┐ рдЪрд░рд┐рддреНрд░ рдмрд╛рдЗрдЯ рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ: рд░рдВрдЧ, рдЭрд┐рд▓рдорд┐рд▓рд╛рд╣рдЯ) рд╣реИред рдЪреВрдВрдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд░реНрдЪреБрдЕрд▓ рдореЗрдореЛрд░реА рдХреЛ рд╕рдХреНрд╖рдо рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдкрддреЗ рддрдХ рдкрд╣реБрдВрдЪ рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рдПрдЧреА, рдЗрд╕рд▓рд┐рдП рд╣рдо 3 рдЬреАрдмреА рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рд╣рдо рдПрдХ рдХрдЪреНрдЪреЗ рд╕реВрдЪрдХ рдХреЛ рднреА рд░реЛрдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ - рд▓реЗрдХрд┐рди рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдХреНрдпрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдк рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реЗ, рд╢рд╛рдпрдж, рдХреЗрд╡рд▓ рд░рд╛рдЗрдЯрд░ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ, рдЬреЛ рди рдХреЗрд╡рд▓ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдкрд╛рддреНрд░реЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рдиреЗ, рд╕реНрдХреНрд░реАрди рдкрд░ рдХрд┐рд╕реА рднреА рд╕реНрдерд╛рди рдкрд░ рдЬрд╛рдиреЗ рдФрд░ рдЕрдиреНрдп рд╕реБрдЦрдж рдЯреНрд░рд┐рдлрд╝рд▓ рдХреЗ рд▓рд┐рдП рднреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред


рд╡рд╛рдЧрд╛ рд▓реЗрдЦрдХ
 pub struct Writer { cursor_position: usize, vga_color: ColorCode, buffer: &'static mut VgaBuffer, } impl Writer { pub fn init(&mut self) { let vga_color = self.vga_color; for y in 0..(VGA_HEIGHT - 1) { for x in 0..VGA_WIDTH { self.buffer.chars[y * VGA_WIDTH + x] = ScreenChar { ascii_character: b' ', color_code: vga_color, } } } self.set_cursor_abs(0); } fn set_cursor_abs(&mut self, position: usize) { unsafe { outb(0x3D4, 0x0F); outb(0x3D5, (position & 0xFF) as u8); outb(0x3D4, 0x0E); outb(0x3D4, ((position >> 8) & 0xFF) as u8); } self.cursor_position = position; } pub fn set_cursor(&mut self, x: usize, y: usize) { self.set_cursor_abs(y * VGA_WIDTH + x); } pub fn move_cursor(&mut self, offset: usize) { self.cursor_position = self.cursor_position + offset; self.set_cursor_abs(self.cursor_position); } pub fn get_x(&mut self) -> u8 { (self.cursor_position % VGA_WIDTH) as u8 } pub fn get_y(&mut self) -> u8 { (self.cursor_position / VGA_WIDTH) as u8 } pub fn scroll(&mut self) { for y in 0..(VGA_HEIGHT - 1) { for x in 0..VGA_WIDTH { self.buffer.chars[y * VGA_WIDTH + x] = self.buffer.chars[(y + 1) * VGA_WIDTH + x] } } for x in 0..VGA_WIDTH { let color_code = self.vga_color; self.buffer.chars[(VGA_HEIGHT - 1) * VGA_WIDTH + x] = ScreenChar { ascii_character: b' ', color_code } } } pub fn ln(&mut self) { let next_line = self.get_y() as usize + 1; if next_line >= VGA_HEIGHT { self.scroll(); self.set_cursor(0, VGA_HEIGHT - 1); } else { self.set_cursor(0, next_line) } } pub fn write_byte_at_xy(&mut self, byte: u8, color: ColorCode, x: usize, y: usize) { self.buffer.chars[y * VGA_WIDTH + x] = ScreenChar { ascii_character: byte, color_code: color } } pub fn write_byte_at_pos(&mut self, byte: u8, color: ColorCode, position: usize) { self.buffer.chars[position] = ScreenChar { ascii_character: byte, color_code: color } } pub fn write_byte(&mut self, byte: u8) { if self.cursor_position >= VGA_WIDTH * VGA_HEIGHT { self.scroll(); self.set_cursor(0, VGA_HEIGHT - 1); } self.write_byte_at_pos(byte, self.vga_color, self.cursor_position); self.move_cursor(1); } pub fn write_string(&mut self, s: &str) { for byte in s.bytes() { match byte { 0x20...0xFF => self.write_byte(byte), b'\n' => self.ln(), _ => self.write_byte(0xfe), } } } } 

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


  • рдкреВрд░реНрдг рдХрд░реНрд╕рд░ рдСрдлрд╕реЗрдЯ, рд╕рдордиреНрд╡рдп рдирд╣реАрдВ, рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИред
  • рдЖрдк рдПрдХ рдмрд╛рд░ рдореЗрдВ рдПрдХ рдмрд╛рдЗрдЯ рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
  • рдПрдХ рдмрд╛рдЗрдЯ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рджреЛ рдХрдорд╛рдВрдб рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ - рдкрд╣рд▓реЗ рд╣рдо рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЛ рдХрдорд╛рдВрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдлрд┐рд░ рдбреЗрдЯрд╛ рдХреЛред
  • рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдП рдкреЛрд░реНрдЯ 0x3D4 рд╣реИ, рдбреЗрдЯрд╛ рдкреЛрд░реНрдЯ 0x3D5 рд╣реИ
  • рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, 0x0F рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рддрд┐ рдХреЗ рдирд┐рдЪрд▓реЗ рдмрд╛рдЗрдЯ рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВ, рдлрд┐рд░ рдХрдорд╛рдВрдб 0x0E рдХреЗ рд╕рд╛рде рд╢реАрд░реНрд╖

out.asm

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


 global writeb global writew global writed section .text writeb: push ebp mov ebp, esp mov edx, [ebp + 8] ;port in stack: 8 = 4 (push ebp) + 4 (parameter port length is 2 bytes but stack aligned 4 bytes) mov eax, [ebp + 8 + 4] ;value in stack - 8 = see ^, 4 = 1 byte value aligned 4 bytes out dx, al ;write byte by port number an dx - value in al mov esp, ebp pop ebp ret writew: push ebp mov ebp, esp mov edx, [ebp + 8] ;port in stack: 8 = 4 (push ebp) + 4 (parameter port length is 2 bytes but stack aligned 4 bytes) mov eax, [ebp + 8 + 4] ;value in stack - 8 = see ^, 4 = 1 word value aligned 4 bytes out dx, ax ;write word by port number an dx - value in ax mov esp, ebp pop ebp ret writed: push ebp mov ebp, esp mov edx, [ebp + 8] ;port in stack: 8 = 4 (push ebp) + 4 (parameter port length is 2 bytes but stack aligned 4 bytes) mov eax, [ebp + 8 + 4] ;value in stack - 8 = see ^, 4 = 1 double word value aligned 4 bytes out dx, eax ;write double word by port number an dx - value in eax mov esp, ebp pop ebp ret 

рд╕реЗрдЧрдореЗрдВрдЯ рд╕реЗрдЯрдЕрдк


рд╣рдо рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╣реИрд░рд╛рди рдереЗ, рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╡рд┐рд╖рдпред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдХрд╣рд╛ рдерд╛, рд╕реНрдореГрддрд┐ рдореЗрдВ рдкреГрд╖реНрда рдФрд░ рдЦрдВрдб рд╕рдВрдЧрдарди рдХреЛ рдореЗрд░реЗ рд╕рд┐рд░ рдореЗрдВ рдорд┐рд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдореИрдВрдиреЗ рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдкрддрд╛ GDTR рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдФрд░ рдореЗрд░рд╛ рд╕рд┐рд░ рдкрдХрдбрд╝ рд▓рд┐рдпрд╛ред рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдкрдврд╝рдиреЗ, рдЙрд╕реЗ рдкрдЪрд╛рдиреЗ рдФрд░ рдЙрд╕реЗ рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдореЗрдВ рдореБрдЭреЗ рдХрдИ рдорд╣реАрдиреЗ рд▓рдЧ рдЧрдПред рдореИрдВ рдкреАрдЯрд░ рдПрдмреЗрд▓ рдХреА рдкрд╛рдареНрдпрдкреБрд╕реНрддрдХ рдЕрд╕реЗрдВрдмрд▓рд░ рдХрд╛ рд╢рд┐рдХрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реВрдВред рдЖрдИрдмреАрдПрдо рдкреАрд╕реА рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ "(рдПрдХ рдорд╣рд╛рди рдкреБрд╕реНрддрдХ!), рдЬреЛ рдЗрдВрдЯреЗрд▓ 8086 рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд╛рдЬрди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рдЙрди рд╕реБрдЦрдж рд╕рдордп рдореЗрдВ, рд╣рдордиреЗ рдмреАрд╕-рдмрд┐рдЯ рдкрддреЗ рдХреЗ рдКрдкрд░реА 16 рдмрд┐рдЯреНрд╕ рдХреЛ рд╕реЗрдЧрдореЗрдВрдЯ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛, рдФрд░ рдпрд╣ рдореЗрдореЛрд░реА рдореЗрдВ рдкрддрд╛ рдерд╛ред рдпрд╣ рдПрдХ рдХреНрд░реВрд░ рдирд┐рд░рд╛рд╢рд╛ рдереА рдЬреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдореЛрдб рдореЗрдВ i286 рд╕реЗ рд╢реБрд░реВ рд╣реБрдИ, рд╕рдм рдХреБрдЫ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧрд▓рдд рд╣реИред


рддреЛ, рдирдВрдЧреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдпрд╣ рд╣реИ рдХрд┐ x86 рдПрдХ рдЦрдВрдбрд┐рдд рд╕реНрдореГрддрд┐ рдореЙрдбрд▓ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреБрд░рд╛рдиреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗрд╡рд▓ 640 KB рд╕реЗ рдЖрдЧреЗ рдирд┐рдХрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ 1 рдПрдордмреА рдореЗрдореЛрд░реАред


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


рдкрддрд╛ рдЕрдиреБрд╡рд╛рдж рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдХрд░рддреЗ рд╣реИрдВ (рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЖрдЦрд┐рд░реА рдореЗрдВ)
рд▓рд╛рдЗрди рдХрд╛ рдкрддрд╛ [0x08: 0xFFFFFFFF] -> рд╕реЗрдЧрдореЗрдВрдЯ рдХреА рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВ 0x08 -> рд╡рд░реНрдЪреБрдЕрд▓ рдПрдбреНрд░реЗрд╕ [0xFFFFFFFFFF] -> рдкреЗрдЬ рдЯреЗрдмрд▓ + рдЯреАрдПрд▓рдмреА -> рднреМрддрд┐рдХ рдкрддрд╛ [0xAAAAFFFF]


рдПрдХ рдЦрдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рдЕрдВрджрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕реЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЦрдВрдб рд░рдЬрд┐рд╕реНрдЯрд░ (рд╕реАрдПрд╕, рдПрд╕рдПрд╕, рдбреАрдПрд╕, рдИрдПрд╕, рдПрдлрдПрд╕, рдЬреАрдПрд╕) рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдФрд░ рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЖрдк рдХрд░реНрдиреЗрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдерд╛рди рд╕реЗ рд╕рд┐рд░реНрдл рд▓реЗ рдФрд░ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред 0x18 рдХреЗ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реЗрдЧрдореЗрдВрдЯ (рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реИ, рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдЕрд▓рдЧ рд╣реИ) рдХреЗ рд╕реНрддрд░ 3 рдХреЗ рдЕрдзрд┐рдХрд╛рд░ рд╣реИрдВ, рдФрд░ 0x08 рдХреЗ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реЗрдЧрдореЗрдВрдЯ рдХреЗ рд╕реНрддрд░ 0. рдХреЗ рдЕрдзрд┐рдХрд╛рд░ рд╣реИрдВред x86 рд╕рдореНрдореЗрд▓рди рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЕрдирдзрд┐рдХреГрдд рдкрд╣реБрдВрдЪ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП, рдХрдо рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рд╡рд╛рд▓реЗ рдПрдХ рд╕реЗрдЧрдореЗрдВрдЯ рдХреЛ рд╕реАрдзреЗ рдмрдбрд╝реЗ рдЦрдВрдб рдХреЗ рд╕рд╛рде рдПрдХ рд╕реЗрдЧрдореЗрдВрдЯ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред jmp 0x08 рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдзрд┐рдХрд╛рд░: [EAX], рд▓реЗрдХрд┐рди рдЕрдиреНрдп рддрдВрддреНрд░реЛрдВ, рдЬреИрд╕реЗ рдЬрд╛рд▓, рдлрд╛рдЯрдХ, рд╡реНрдпрд╡рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рд╣реИред


рд╕реЗрдЧрдореЗрдВрдЯ рдФрд░ рдЙрдирдХреЗ рдкреНрд░рдХрд╛рд░ (рдХреЛрдб, рдбреЗрдЯрд╛, рд▓реИрдбрд░, рдЧреЗрдЯреНрд╕) рдХреЛ GDT рдЧреНрд▓реЛрдмрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдЯреЗрдмрд▓, рд╡рд░реНрдЪреБрдЕрд▓ рдПрдбреНрд░реЗрд╕ рдФрд░ рдЬрд┐рд╕рдХрд╛ рдЖрдХрд╛рд░ GDTR рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕реЗрдЧрдореЗрдВрдЯ рдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдХрд░рддреЗ рд╕рдордп (рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдПрдХ рд╕реАрдзрд╛ рд╕рдВрдХреНрд░рдордг рд╕рдВрднрд╡ рд╣реИ), рдЖрдкрдХреЛ jmp рдХреЛ 0x08: [EAX] рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬрд╣рд╛рдВ 0x08 рддрд╛рд▓рд┐рдХрд╛ рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рдкрд╣рд▓реЗ рдорд╛рдиреНрдп рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреА рдСрдлрд╕реЗрдЯ рд╣реИ , рдФрд░ EAX рдЯреНрд░рд╛рдВрд╕реНрдлрд╝реЙрд░реНрдо рдПрдбреНрд░реЗрд╕ рд╡рд╛рд▓рд╛ рд░рдЬрд┐рд╕реНрдЯрд░ рд╣реИред рдСрдлрд╝рд╕реЗрдЯ (рдЪрдпрдирдХрд░реНрддрд╛) рдХреЛ CS рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рдЫрд╛рдпрд╛ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╡рд░рдгрдХ рдПрдХ 8-рдмрд╛рдЗрдЯ рд╕рдВрд░рдЪрдирд╛ рд╣реИред рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреНрд░рд▓реЗрдЦрд┐рдд рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рд╡рд┐рд╡рд░рдг OSDev рдФрд░ Intel рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рджреЛрдиреЛрдВ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдкрд╣рд▓рд╛ рд▓реЗрдЦ рджреЗрдЦреЗрдВ)ред


рдореИрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реВрдВред рдЬрдм рд╣рдо GDT рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ jmp 0x08 рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ: [EAX] рд╕рдВрдХреНрд░рдордг, рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреА рд╕реНрдерд┐рддрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧреА:


  • GDTR рдореЗрдВ рд╡рд░реНрдЪреБрдЕрд▓ GDT рдПрдбреНрд░реЗрд╕ рд╣реЛрддрд╛ рд╣реИ
  • CS рдореЗрдВ рдорд╛рди 0x08 рд╣реИ
  • рдкрддреЗ рдкрд░ рдПрдХ рд╣реИрдВрдбрд▓ [GDTR + 0x08] рдХреЛ рдореЗрдореЛрд░реА рд╕реЗ рдЫрд╛рдпрд╛ рд░рдЬрд┐рд╕реНрдЯрд░ рд╕реАрдПрд╕ рдкрд░ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛
  • EIP рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ EAX рд░рдЬрд┐рд╕реНрдЯрд░ рд╕реЗ рдкрддрд╛ рд╣реЛрддрд╛ рд╣реИ

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


 extern { fn load_gdt(base: *const GdtEntry, limit: u16); } pub unsafe fn setup_gdt() { GDT[5].set_offset((&super::tss::TSS) as *const _ as u32); GDT[5].set_limit(core::mem::size_of::<super::tss::Tss>() as u32); let gdt_ptr: *const GdtEntry = GDT.as_ptr(); let limit = (GDT.len() * core::mem::size_of::<GdtEntry>() - 1) as u16; load_gdt(gdt_ptr, limit); } static mut GDT: [GdtEntry; 7] = [ //null descriptor - cannot access GdtEntry::new(0, 0, 0, 0), //kernel code GdtEntry::new(0, 0xFFFFFFFF, GDT_A_PRESENT | GDT_A_RING_0 | GDT_A_SYSTEM | GDT_A_EXECUTABLE | GDT_A_PRIVILEGE, GDT_F_PAGE_SIZE | GDT_F_PROTECTED_MODE), //kernel data GdtEntry::new(0, 0xFFFFFFFF, GDT_A_PRESENT | GDT_A_RING_0 | GDT_A_SYSTEM | GDT_A_PRIVILEGE, GDT_F_PAGE_SIZE | GDT_F_PROTECTED_MODE), //user code GdtEntry::new(0, 0xFFFFFFFF, GDT_A_PRESENT | GDT_A_RING_3 | GDT_A_SYSTEM | GDT_A_EXECUTABLE | GDT_A_PRIVILEGE, GDT_F_PAGE_SIZE | GDT_F_PROTECTED_MODE), //user data GdtEntry::new(0, 0xFFFFFFFF, GDT_A_PRESENT | GDT_A_RING_3 | GDT_A_SYSTEM | GDT_A_PRIVILEGE, GDT_F_PAGE_SIZE | GDT_F_PROTECTED_MODE), //TSS - for interrupt handling in multithreading GdtEntry::new(0, 0, GDT_A_PRESENT | GDT_A_RING_3 | GDT_A_TSS_AVAIL, 0), GdtEntry::new(0, 0, 0, 0), ]; 

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


 global load_gdt section .text gdtr dw 0 ; For limit storage dd 0 ; For base storage load_gdt: mov eax, [esp + 4] mov [gdtr + 2], eax mov ax, [esp + 8] mov [gdtr], ax lgdt [gdtr] jmp 0x08:.reload_CS .reload_CS: mov ax, 0x10 ; 0x10 points at the new data selector mov ds, ax mov es, ax mov fs, ax mov gs, ax mov ss, ax mov ax, 0x28 ltr ax ret 

рдлрд┐рд░ рд╕рдм рдХреБрдЫ рдереЛрдбрд╝рд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдХреЛрдИ рдХрдо рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВред


рдмреАрдЪ рдореЗрдВ рдЖрддрд╛ рд╣реИ


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


рдХреЛрдб рд╢реИрд▓реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЧреАрддрд╛рддреНрдордХ рд╡рд┐рд╖рдпрд╛рдВрддрд░ред


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


рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЗрдВрдЯрд░рдкреНрдЯ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ GDT рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдордЭрдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИред рджреВрд╕рд░реА рдУрд░, рдЖрдкрдХреЛ рдПрдХ рд╕рдорд╛рди рдХреЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред Redox OS рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рднрд╛рд╖рд╛ рдХреЗ рд╕рднреА рдЖрдпрд╛рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдПрдХ рд╕реБрдВрджрд░ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ "рдорд╛рдереЗ рдкрд░" рдЧрдпрд╛ рдФрд░ рдХреЛрдб рджреЛрд╣рд░рд╛рд╡ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред


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


PIC рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдкрд░ рдореИрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдирд╣реАрдВ рджреВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдХрдИ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред рдореИрдВ рдХреЛрдбрд╛рдВрддрд░рдХ рдореЗрдВ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реВрдБрдЧрд╛ред рд╡реЗ рд╕рднреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдорд╛рди рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╕реНрдкреЙрдЗрд▓рд░ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдирд┐рдХрд╛рд▓ рджреВрдВрдЧрд╛ред


рдЖрдИрдЖрд░рдХреНрдпреВ
 global irq0 global irq1 ...... global irq14 global irq15 extern kirq0 extern kirq1 ...... extern kirq14 extern kirq15 section .text irq0: pusha call kirq0 popa iret irq1: pusha call kirq1 popa iret ...... irq14: pusha call kirq14 popa iret irq15: pusha call kirq15 popa iret 

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


рдЕрдкрд╡рд╛рдж
 global e0_zero_divide global e1_debug ...... global eE_page_fault ...... global e14_virtualization global e1E_security extern k0_zero_divide extern k1_debug ...... extern kE_page_fault ...... extern k14_virtualization extern k1E_security section .text e0_zero_divide: pushad call k0_zero_divide popad iret e1_debug: pushad call k1_debug popad iret ...... eE_page_fault: pushad mov eax, [esp + 32] push eax mov eax, cr2 push eax call kE_page_fault pop eax pop eax popad add esp, 4 iret ...... e14_virtualization: pushad call k14_virtualization popad iret e1E_security: pushad call k1E_security popad iret 

рд╣рдо рдХреЛрдбрд╛рдВрддрд░рдХ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВ:


 extern { fn load_idt(base: *const IdtEntry, limit: u16); fn e0_zero_divide(); fn e1_debug(); ...... fn e14_virtualization(); fn e1E_security(); fn irq0(); fn irq1(); ...... fn irq14(); fn irq15(); } 

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


 #[no_mangle] pub unsafe extern fn kirq0() { // println!("IRQ 0"); outb(0x20, 0x20); } #[no_mangle] pub unsafe extern fn kirq1() { let ch: char = inb(0x60) as char; crate::arch::vga::VGA_WRITER.force_unlock(); println!("IRQ 1 {}", ch); outb(0x20, 0x20); } #[no_mangle] pub unsafe extern fn kirq2() { println!("IRQ 2"); outb(0x20, 0x20); } ... 

рдЖрдИрдбреАрдЯреА рдФрд░ рдкреАрдЖрдИрд╕реА рдХреА рд╢реБрд░реБрдЖрддред PIC рдФрд░ рдЗрд╕рдХреЗ рд░реАрдореИрдкрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдореБрдЭреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХреА рдЕрд▓рдЧ-рдЕрд▓рдЧ рдбрд┐рдЧреНрд░реА рдХреЗ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреА рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдорд┐рд▓реА, рдЬреЛ OSDev рд╕реЗ рд╢реБрд░реВ рд╣реБрдИ рдФрд░ рд╢реМрдХрд┐рдпрд╛ рд╕рд╛рдЗрдЯреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реБрдИред рдЪреВрдВрдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рдВрдЪрд╛рд▓рди рдФрд░ рдирд┐рд░рдВрддрд░ рдХрдорд╛рдВрдб рдХреЗ рдирд┐рд░рдВрддрд░ рдЕрдиреБрдХреНрд░рдо рдХреЗ рд╕рд╛рде рдЪрд▓рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рдХреЛрдб рдХреЛ рдФрд░ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рдмрд┐рдирд╛ рджреЗ рджреВрдВрдЧрд╛ред , 0x20-0x2F , 0x20 0x28, 16 IDT.


 unsafe fn setup_pic(pic1: u8, pic2: u8) { // Start initialization outb(PIC1, 0x11); outb(PIC2, 0x11); // Set offsets outb(PIC1 + 1, pic1); /* remap */ outb(PIC2 + 1, pic2); /* pics */ // Set up cascade outb(PIC1 + 1, 4); /* IRQ2 -> connection to slave */ outb(PIC2 + 1, 2); // Set up interrupt mode (1 is 8086/88 mode, 2 is auto EOI) outb(PIC1 + 1, 1); outb(PIC2 + 1, 1); // Unmask interrupts outb(PIC1 + 1, 0); outb(PIC2 + 1, 0); // Ack waiting outb(PIC1, 0x20); outb(PIC2, 0x20); } pub unsafe fn init_idt() { IDT[0x0].set_func(e0_zero_divide); IDT[0x1].set_func(e1_debug); ...... IDT[0x14].set_func(e14_virtualization); IDT[0x1E].set_func(e1E_security); IDT[0x20].set_func(irq0); IDT[0x21].set_func(irq1); ...... IDT[0x2E].set_func(irq14); IDT[0x2F].set_func(irq15); setup_pic(0x20, 0x28); let idt_ptr: *const IdtEntry = IDT.as_ptr(); let limit = (IDT.len() * core::mem::size_of::<IdtEntry>() - 1) as u16; load_idt(idt_ptr, limit); } 

IDTR GDTR тАФ . STI тАФ тАФ , , ASCII- -.


 global load_idt section .text idtr dw 0 ; For limit storage dd 0 ; For base storage load_idt: mov eax, [esp + 4] mov [idtr + 2], eax mov ax, [esp + 8] mov [idtr], ax lidt [idtr] sti ret 

рдЕрдВрддрднрд╛рд╖рдг


, , . setup_pd, . , , , .


- GitLab .


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


UPD: 3

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


All Articles