
рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐
рдкреАрд╕реАрдЖрдИ рдмрд╕ рдХреЗ рдорддрджрд╛рди рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╣рдорд╛рд░реЗ рд▓реЗрдЦ рдореЗрдВ, рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛: рдЗрд╕ рдХреЛрдб рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкрд░ рдХреИрд╕реЗ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рдП? рдЕрдкрдирд╛ рдмреВрдЯ рдбрд┐рд╕реНрдХ рдХреИрд╕реЗ рдмрдирд╛рдПрдВ? рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдЗрди рд╕рднреА рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рджреЗрдВрдЧреЗ (рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ, рдЗрди рдореБрджреНрджреЛрдВ рдкрд░ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рдереА, рд▓реЗрдХрд┐рди рдкрдврд╝рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рд╣рдо рдЦреБрдж рдХреЛ рд╕рд╛рдордЧреНрд░реА рдХреЗ рдереЛрдбрд╝рд╛ рджреЛрд╣рд░рд╛рд╡ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ)ред
рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдЕрдкрдиреЗ рдЦреБрдж рдХреЗ рдорд┐рдиреА-рдУрдПрд╕ рд▓рд┐рдЦрдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡рд┐рд╡рд░рдг рдФрд░ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рд╣реИрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕реИрдХрдбрд╝реЛрдВ рддреИрдпрд╛рд░-рдХрд┐рдП рдЧрдП рдЫреЛрдЯреЗ рд╢реМрдХ-рдУрдПрд╕ рд╣реИрдВред рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рд╕рдмрд╕реЗ рдпреЛрдЧреНрдп рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ, рдЬрд┐рд╕реЗ рдореИрдВ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рд╡рд╣ рд╣реИ рдСрд╕рджреЗрд╡ рдбреЙрдЯ рдХреЙрдо рдкреЛрд░реНрдЯрд▓ред рдкреАрд╕реАрдЖрдИ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ (рдФрд░ рдХрд┐рд╕реА рднреА рдЖрдзреБрдирд┐рдХ рдУрдПрд╕ рдореЗрдВ рдореМрдЬреВрдж рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдж рдХреЗ рд▓реЗрдЦ рд▓рд┐рдЦрдиреЗ рдХреА рдХреНрд╖рдорддрд╛) рдХреЗ рдкреВрд░рдХ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реА рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╕рд╛рде рдмреВрдЯ рдбрд┐рд╕реНрдХ рдмрдирд╛рдиреЗ рдкрд░ рдЪрд░рдг-рджрд░-рдЪрд░рдг рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВрдЧреЗред рд╣рдордиреЗ рдпрдерд╛рд╕рдВрднрд╡ рд╡рд┐рд╕реНрддреГрдд рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдХрд┐ рд╕рдм рдХреБрдЫ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЗрд╕реЗ рдЕрдкрдиреЗ рдЖрдк рд╕реЗ рдмрд╛рд╣рд░ рдХрд░реЛред
рддреЛ, рд▓рдХреНрд╖реНрдп: рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдХрдо рдкреНрд░рдпрд╛рд╕ рдореЗрдВ рдЦрд░реНрдЪ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдмреВрдЯ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдпреВрдПрд╕рдмреА рдлреНрд▓реИрд╢ рдбреНрд░рд╛рдЗрд╡ рдмрдирд╛рдПрдВ, рдЬреЛ рдХрдВрдкреНрдпреВрдЯрд░ рд╕реНрдХреНрд░реАрди рдкрд░ рдХреЗрд╡рд▓ рдХреНрд▓рд╛рд╕рд┐рдХ "рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб" рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИред
рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЕрдХреНрд╖рдо рдкреГрд╖реНрда рдкрддреЗ рдФрд░ рдЗрдВрдЯрд░рдкреНрдЯ рдХреЗ рд╕рд╛рде рд╕рдВрд░рдХреНрд╖рд┐рдд рдореЛрдб рдореЗрдВ "рдкреНрд░рд╛рдкреНрдд" рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХрдВрд╕реЛрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рд╛рде рд╕рдмрд╕реЗ рд╕рд░рд▓ рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЛрдбред рдЗрд╕ рд▓рдХреНрд╖реНрдп рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЙрдЪрд┐рдд рддрд░реАрдХрд╛ рдПрдХ рдХрд░реНрдиреЗрд▓ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рд╣реИ рдЬреЛ рдорд▓реНрдЯреАрдмреВрдЯ рдкреНрд░рд╛рд░реВрдк рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдФрд░ рд▓реЛрдХрдкреНрд░рд┐рдп рдЧреНрд░рдм рдмреВрдЯ рд▓реЛрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рд╡реЙрд▓реНрдпреВрдо рдмреВрдЯ рд░рд┐рдХреЙрд░реНрдб (рд╡реАрдмреАрдЖрд░) рд▓рд┐рдЦрдирд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд▓реЛрдбрд░ (рд▓реЛрдбрд░) рдХреЛ рд▓реЛрдб рдХрд░реЗрдЧрд╛ред рдПрдХ рд╕рднреНрдп рдмреВрдЯрд▓реЛрдбрд░, рдХрдо рд╕реЗ рдХрдо, рдбрд┐рд╕реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде, рдФрд░ рдпреЛрдЧрд┐рдиреА рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░реЗрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдмрд╣реБрдд рд╕реЗ рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб, рдФрд░ рдмрд╣реБрдд рд╕реА рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдЧреНрд░рдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИред
рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЧреЗ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрдВрдкрд╛рдЗрд▓рд░реЛрдВ рдФрд░ рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реЗрдЯ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдирдХреНрд╕ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдмрдВрдЯреВ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд╣ рд╕рдм рдХреБрдЫ рд╣реЛрдЧрд╛ рдЬреЛ рдЖрдкрдХреЛ рдмреВрдЯ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдлреНрд▓реИрд╢ рдбреНрд░рд╛рдЗрд╡ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рд╡рд┐рдВрдбреЛрдЬ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдЖрджреА рд╣реИрдВ, рддреЛ рдЖрдк рд▓рд┐рдирдХреНрд╕ рдХреЗ рд╕рд╛рде рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди (рд╡рд░реНрдЪреБрдЕрд▓ рдмреЙрдХреНрд╕ рдпрд╛ рд╡реАрдПрдорд╡реЗрдпрд░ рд╡рд░реНрдХрд╕реНрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпрджрд┐ рдЖрдк рд▓рд┐рдирдХреНрд╕ рдЙрдмрдВрдЯреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдХрдИ рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
1. рдЧреНрд░рдмред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
sudo apt-get install grub
2. рдХреНрдпреВрдореВред рдпрд╣ рдЬрд▓реНрджреА рд╕реЗ
рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдФрд░ рд╕рдм рдХреБрдЫ
рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрдорд╛рдВрдб рд╕рдорд╛рди рд╣реИ:
sudo apt-get install qemu
рдЕрдм рд╣рдорд╛рд░реА рдпреЛрдЬрдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
1. рдПрдХ C рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрдирд╛рдПрдВ рдЬреЛ рд╕реНрдХреНрд░реАрди рдкрд░ рдПрдХ рд▓рд╛рдЗрди рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИред
2. рдЗрд╕реЗ рдорд┐рдиреАрдмреВрдЯ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдПрдХ рдЫрд╡рд┐ (рдХрд░реНрдиреЗрд▓.рдмрд┐рди) рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ рддрд╛рдХрд┐ рдпрд╣ GRUB рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбрд╛рдЙрдирд▓реЛрдб рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реЛред
3. рдмреВрдЯ рдбрд┐рд╕реНрдХ рдЫрд╡рд┐ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВ рдФрд░ рдЙрд╕реЗ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░реЗрдВред
4. рдЗрд╕ рдЫрд╡рд┐ рдкрд░ рдЧреНрд░рдм рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред
5. рдбрд┐рд╕реНрдХ рдкрд░ рдмрдирд╛рдП рдЧрдП рдкреНрд░реЛрдЧреНрд░рд╛рдо (kernel.bin) рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВред
6. рдЫрд╡рд┐ рдХреЛ рднреМрддрд┐рдХ рдореАрдбрд┐рдпрд╛ рдореЗрдВ рд▓рд┐рдЦреЗрдВ рдпрд╛ рдЗрд╕реЗ qemu рдореЗрдВ рдЪрд▓рд╛рдПрдВред
рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдмреВрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛:

рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрдИ рдлрд╛рдЗрд▓реЗрдВ рдФрд░ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдПрдБ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:
kernel.c | рд╕реА рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛрдбред рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реНрдХреНрд░реАрди рдкрд░ рдПрдХ рд╕рдВрджреЗрд╢ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИред |
makefile | рдореЗрдХрдлрд╛рдЗрд▓, рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреА рдкреВрд░реА рдЕрд╕реЗрдВрдмрд▓реА рдЪрд▓рд╛рддреА рд╣реИ рдФрд░ рдПрдХ рдмреВрдЯ рдЗрдореЗрдЬ рдмрдирд╛рддреА рд╣реИред |
linker.ld | рдХрд░реНрдиреЗрд▓ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯред |
loader.s | рдЕрд╕реЗрдВрдмрд▓рд░ рдХреЛрдб рдЬрд┐рд╕реЗ рдЧреНрд░рдм рджреНрд╡рд╛рд░рд╛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реЗ рдореБрдЦреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред |
рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ / | рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдлрд╝реЛрд▓реНрдбрд░ред |
рдЧреНрд░рдм / | рдЧреНрд░рдм рдлрд╝рд╛рдЗрд▓ рдлрд╝реЛрд▓реНрдбрд░ред |
рд╕рд╛рдорд╛рдиреНрдп / | рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдпреЛрдЬрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдлрд╝реЛрд▓реНрдбрд░ред рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рд┐рдВрдЯрдл рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред |
рдЪрд░рдг 1. рд▓рдХреНрд╖реНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдХреЛрдб рдмрдирд╛рдирд╛ (рдХрд░реНрдиреЗрд▓):
рдПрдХ рдХрд░реНрдиреЗрд▓ рдмрдирд╛рдПрдБред рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рдореНрди рдХреЛрдб рд╣реЛрдЧрд╛ рдЬреЛ рд╕реНрдХреНрд░реАрди рдкрд░ рдПрдХ рд╕рдВрджреЗрд╢ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ:
#include "printf.h" #include "screen.h" #include "types.h" void main(void) { clear_screen(); printf("\n>>> Hello World!\n"); }
рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдкрд░рд┐рдЪрд┐рдд рдФрд░ рд╕рд░рд▓ рд╣реИред рдкреНрд░рд┐рдВрдЯрдлрд╝ рдФрд░ рдХреНрд▓рд┐рдпрд░_рд╕реНрдХреНрд░реАрди рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдкрд░ рдмрд╛рдж рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред рдЗрд╕ рдмреАрдЪ, рдЖрдкрдХреЛ рдЗрд╕ рдХреЛрдб рдХреЛ рдЖрд╡рд╢реНрдпрдХ рд╕рдм рдХреБрдЫ рдХреЗ рд╕рд╛рде рдкреВрд░рдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЗрд╕реЗ рдЧреНрд░рдм рджреНрд╡рд╛рд░рд╛ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред
рдХрд░реНрдиреЗрд▓ рдорд▓реНрдЯреАрдмреВрдЯ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрд░реНрдиреЗрд▓ рдХреЙрд░реНрдб рдХреЗ рдкрд╣рд▓реЗ 8 рдХрд┐рд▓реЛрдмрд╛рдЗрдЯ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрд░рдЪрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
0x1BADB002 = рдореИрдЬрд┐рдХ | рдорд▓реНрдЯреАрдмреВрдЯ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ |
0x0 = рдлреНрд▓реИрдЧ | рдлрд╝реНрд▓реЗрдЧ рдЬрд┐рд╕рдореЗрдВ рд▓реЛрдбрд░ рджреНрд╡рд╛рд░рд╛ рдкрд╛рд░рд┐рдд рдХрд░реНрдиреЗрд▓ (рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо) рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╕рднреА рдЭрдВрдбреЗ рд░реАрд╕реЗрдЯ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред |
0xE4524FFE = - (рдореИрдЬрд┐рдХ + рдлреНрд▓реИрдЧ) | Checksumред |
рдпрджрд┐ рдпреЗ рд╕рднреА рд╢рд░реНрддреЗрдВ рдкреВрд░реА рд╣реЛ рдЬрд╛рддреА рд╣реИрдВ, рддреЛ рдЧреНрд░рдм% eax рд╕реЗ рд╣реЛрдХрд░ рдЧреБрдЬрд░рддрд╛ рд╣реИ рдФрд░% ebx рдорд▓реНрдЯреАрдмреВрдЯ рд╕реВрдЪрдирд╛ рд╕рдВрд░рдЪрдирд╛ рдФрд░ рдХреНрд░рдорд╢рдГ 0x1BADB002 рдХреЗ рдорд╛рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рджрд░реНрдЬ рдХрд░рддрд╛ рд╣реИред рдорд▓реНрдЯреАрдмреВрдЯ рд╕реВрдЪрдирд╛ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдЬрд╛рдирдХрд╛рд░реА рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд▓реЛрдб рдХрд┐рдП рдЧрдП рдореЙрдбреНрдпреВрд▓ рдХреА рд╕реВрдЪреА рдФрд░ рдЙрдирдХрд╛ рд╕реНрдерд╛рди рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬреЛ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЖрдЧреЗ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдкреНрд░реЛрдЧреНрд░рд╛рдо рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдПрдХ рд▓реЛрдбрд░ред S рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ:
.text .global loader # making entry point visible to linker # setting up the Multiboot header - see GRUB docs for details .set FLAGS, 0x0 # this is the Multiboot 'flag' field .set MAGIC, 0x1BADB002 # 'magic number' lets bootloader find the header .set CHECKSUM, -(MAGIC + FLAGS) # checksum required .align 4 .long MAGIC .long FLAGS .long CHECKSUM # reserve initial kernel stack space .set STACKSIZE, 0x4000 # that is, 16k. .lcomm stack, STACKSIZE # reserve 16k stack .comm mbd, 4 # we will use this in kmain .comm magic, 4 # we will use this in kmain loader: movl $(stack + STACKSIZE), %esp # set up the stack movl %eax, magic # Multiboot magic number movl %ebx, mbd # Multiboot data structure call main # call C code cli hang: hlt # halt machine should kernel return jmp hang
рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдХреЛрдб рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдпрд╣ рдХреЛрдб
wiki.osdev.org/Bare_Bones рд╕реЗ рд▓рдЧрднрдЧ
рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реИред рдЪреВрдВрдХрд┐ gcc рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдВрдХрд▓рди рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, GAS рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдЗрдП рдЗрд╕ рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд▓реЗрддреЗ рд╣реИрдВред
.text
рдмрд╛рдж рдХреЗ рд╕рднреА рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЖ рдЬрд╛рдПрдВрдЧреЗред
.global loader
рд╣рдо рд▓рд┐рдВрдХрд░ рдХреЛ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдбрд░ рдкреНрд░рддреАрдХ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд▓рд┐рдВрдХрд░ рд▓реЛрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░реЗрдЧрд╛ред
.set FLAGS, 0x0 # FLAGS = 0x0 .set MAGIC, 0x1BADB002 # MAGIC = 0x1BADB002 .set CHECKSUM, -(MAGIC + FLAGS) # CHECKSUM = -(MAGIC + FLAGS) .align 4 # 4 .long MAGIC # MAGIC .long FLAGS # FLAGS .long CHECKSUM # CHECKSUM
рдпрд╣ рдХреЛрдб рдорд▓реНрдЯреАрдмреВрдЯ рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдПрдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдмрдирд╛рддрд╛ рд╣реИред .рд╕реЗрдЯ рдирд┐рд░реНрджреЗрд╢, рд╡рд░реНрдг рдХреЗ рдорд╛рди рдХреЛ рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рдХреЗ рджрд╛рдИрдВ рдУрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред .Align 4 рдирд┐рд░реНрджреЗрд╢ 4 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдмрд╛рдж рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░рддрд╛ рд╣реИред рд▓рдВрдмрд╛ рдирд┐рд░реНрджреЗрд╢ рдЕрдЧрд▓реЗ рдЪрд╛рд░ рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рдореВрд▓реНрдп рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред
.set STACKSIZE, 0x4000 # STACKSIZE = 0x4000 .lcomm stack, STACKSIZE # STACKSIZE . stack .comm mbd, 4 # 4 mdb COMMON .comm magic, 4 # 4 magic COMMON
рдмреВрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди, рдЧреНрд░рдм рд╕реНрдЯреИрдХ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдХрд░реНрдиреЗрд▓ рдХреЛ рд╕реНрдЯреИрдХ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо 0x4000 (16Kb) рдмрд╛рдЗрдЯреНрд╕ рдЖрд░рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред .Bcomm рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ .lcomm рдирд┐рд░реНрджреЗрд╢ рдХреЛ рджрд╢рдорд▓рд╡ рдмрд┐рдВрджреБ рдХреЗ рдмрд╛рдж рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдирд╛рдо рд╕реНрдЯреИрдХ рдХреЗрд╡рд▓ рд╕рдВрдХрд▓рд┐рдд рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред .Comm рдирд┐рд░реНрджреЗрд╢ .lcomm рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рддреАрдХ рдирд╛рдо рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рд╕реА рдХреЛрдб рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐ рд▓рд┐рдЦрдХрд░ рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдмрд╛рд╣рд░реА рдЬрд╛рджреВ
рдФрд░ рдЕрдм рдЕрдВрддрд┐рдо рднрд╛рдЧ:
loader: movl $(stack + STACKSIZE), %esp # movl %eax, magic # %eax magic movl %ebx, mbd # %ebx mbd call main # main cli # hang: hlt # jmp hang # hang
рдкрд╣рд▓рд╛ рдирд┐рд░реНрджреЗрд╢% esp рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд╕реНрдЯреИрдХ рдХреЗ рд╢реАрд░реНрд╖ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдмрдЪрд╛рддрд╛ рд╣реИред рдЬреИрд╕реЗ рд╣реА рд╕реНрдЯреИрдХ рдмрдврд╝рддрд╛ рд╣реИ, рд╕реНрдЯреИрдХ рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд рд╕реАрдорд╛ рдХреЗ рдЕрдВрдд рдХрд╛ рдкрддрд╛% esp рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред 4 рдмрд╛рдж рдХреА рдЖрд░рдХреНрд╖рд┐рдд рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдореЗрдВ рджреЛ рдмрд╛рдж рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рджреБрдХрд╛рди рдЙрди рдореВрд▓реНрдпреЛрдВ рдХреЛ рдорд╛рдирддреА рд╣реИ рдЬреЛ рдЧреНрд░рдм% ex,% рдИрдмреЗрдХреНрд╕ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдореЗрдВ рдЧреБрдЬрд░рддреА рд╣реИрдВред рдлрд┐рд░ рдореБрдЦреНрдп рдлрд╝рдВрдХреНрд╢рди, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реА рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рд▓реМрдЯрддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рд▓реВрдк рдХрд░реЗрдЧрд╛ред
рдЪрд░рдг 2. рдХрд╛рд░реНрдпрдХреНрд░рдо (рд╕рд┐рд╕реНрдЯрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА) рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдб рддреИрдпрд╛рд░ рдХрд░рдирд╛:
рдЪреВрдВрдХрд┐ рдкреВрд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рд╕реНрдХреНрд░реИрдЪ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреНрд░рд┐рдВрдЯрдлрд╝ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реНрдХреНрд░реИрдЪ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрдИ рдлрд╛рдЗрд▓реЗрдВ рддреИрдпрд╛рд░ рдХрд░реЗрдВред
рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдмрдирд╛рдПрдВ рдФрд░ рдлрд╝реЛрд▓реНрдбрд░ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ:
mkdir common mkdir include
рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╕рд╛рдорд╛рдиреНрдп \ printf.c рдмрдирд╛рдПрдБ рдЬрд┐рд╕рдореЗрдВ рдкрд░рд┐рдЪрд┐рдд рдкреНрд░рд┐рдВрдЯрдлрд╝ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реЛрдЧрд╛ред рдпрд╣ рдкреВрд░реА рдлрд╛рдЗрд▓
www.bitvisor.org рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рд▓реА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдмрд┐рдЯрд╡рд┐рдЬрд╝рд░ рдХреЗ рд╕реНрд░реЛрддреЛрдВ рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкрде: core / printf.cред рдмрд┐рдЯрд╡рд╛рдЗрдЬрд╝рд░ рд╕реЗ рдХреЙрдкреА рдХреА рдЧрдИ рдкреНрд░рд┐рдВрдЯрдлрд╝ред рд╕реАред рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рд▓рдХреНрд╖реНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
#include "initfunc.h" #include "printf.h" #include "putchar.h" #include "spinlock.h"
рдкреНрд░рддрд┐ рдкрдВрдХреНрддрд┐:
#include "types.h" #include "stdarg.h" #include "screen.h"
рдлрд┐рд░, рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ printf_init_global рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдЙрд╕рдХреЗ рд╕рднреА рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрдВ:
static void printf_init_global (void) { spinlock_init (&printf_lock); } INITFUNC ("global0", printf_init_global);
рдлрд┐рд░ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкреНрд░рд┐рдВрдЯрдлрд╝реНрд▓реЙрдХ рдЪрд░ рдФрд░ рдЗрд╕рдХреЗ рд╕рднреА рд╕рдВрджрд░реНрдн рд╣рдЯрд╛ рджреЗрдВ:
static spinlock_t printf_lock; тАж spinlock_lock (&printf_lock); тАж spinlock_unlock (&printf_lock);
рдкреНрд░рд┐рдВрдЯрдл рдлрд╝рдВрдХреНрд╢рди рдкреБрдЪрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд▓рд┐рдЦрдирд╛ рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп \ screen.c рдмрдирд╛рдПрдБ:
#include "types.h" #define GREEN 0x2 #define MAX_COL 80
рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЛрдб рдореЗрдВ рдкрд╛рда рдореЛрдб рдореЗрдВ рд╕реНрдХреНрд░реАрди рдкрд░ рд╡рд░реНрдг рдореБрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рддрд░реНрдХ рд╣реИрдВред рдЗрд╕ рдореЛрдб рдореЗрдВ, рдПрдХ рдЪрд░рд┐рддреНрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдПрдХ рдЪрд░рд┐рддреНрд░ рдХреЛрдб рдХреЗ рд╕рд╛рде, рджреВрд╕рд░рд╛ рдЗрд╕рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде), рд╕реАрдзреЗ рд╕реНрдХреНрд░реАрди рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╡реАрдбрд┐рдпреЛ рдореЗрдореЛрд░реА рдХреЗ рд▓рд┐рдП рд╕реАрдзреЗ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкрддрд╛ 0xB8000 рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рд╕реНрдХреНрд░реАрди рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди 80x25 рдЕрдХреНрд╖рд░ рд╣реИред рдЪрд░рд┐рддреНрд░ рд╕реАрдзреЗ PUT рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореБрджреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдм рдХреЗрд╡рд▓ рдХреБрдЫ рд╣реЗрдбрд░ рдлрд╛рдЗрд▓реЗрдВ рдЧрд╛рдпрдм рд╣реИрдВ:
1. рдлрд╝рд╛рдЗрд▓ рдореЗрдВ \ screen.h рд╢рд╛рдорд┐рд▓ рд╣реИред рдПрдХ рдкреБрдЪрдХрд╛рд░ рдлрд╝рдВрдХреНрд╢рди рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░рд┐рдВрдЯрдлрд╝ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдлрд╝рд╛рдЗрд▓ рд╕рд╛рдордЧреНрд░реА:
#ifndef _SCREEN_H #define _SCREEN_H void clear_screen( void ); void putchar( int c ); #endif
2. рдлрд╝рд╛рдЗрд▓ рдореЗрдВ \ printf.h рд╢рд╛рдорд┐рд▓ рд╣реИред рдкреНрд░рд┐рдВрдЯрдл рдлрд╝рдВрдХреНрд╢рди рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдлрд╝рд╛рдЗрд▓ рд╕рд╛рдордЧреНрд░реА:
#ifndef _PRINTF_H #define _PRINTF_H int printf (const char *format, ...); #endif
3. рдлрд╝рд╛рдЗрд▓ рдореЗрдВ \ stdarg.h рд╢рд╛рдорд┐рд▓ рд╣реИред рдЙрди рддрд░реНрдХреЛрдВ рдкрд░ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдирдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд╣рд▓реЗ рд╕реЗ рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рд╣реИред рдкреВрд░реА рдлрд╛рдЗрд▓
www.bitvisor.org рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рд▓реА рдЧрдИ рд╣реИред рдмрд┐рдЯрд╡рд┐рдЬрд╝рд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛрдб рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкрде: \ core \ stdarg.h рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВред
4. рдлрд╝рд╛рдЗрд▓ рдореЗрдВ \ type.h рд╢рд╛рдорд┐рд▓ рд╣реИред NULL рдФрд░ size_t рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддрд╛ рд╣реИред рдлрд╝рд╛рдЗрд▓ рд╕рд╛рдордЧреНрд░реА:
#ifndef _TYPES_H #define _TYPES_H #define NULL 0 typedef unsigned int size_t; #endif
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╢рд╛рдорд┐рд▓ рдФрд░ рдЖрдо рдлрд╝реЛрд▓реНрдбрд░реЛрдВ рдореЗрдВ рдиреНрдпреВрдирддрдо рд╕рд┐рд╕реНрдЯрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛрдб рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рднреА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдЪрд░рдг 3. рд▓рд┐рдВрдХрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рдирд╛:
рд╣рдо linker.ld рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓рд┐рдВрдХрд░ рджреНрд╡рд╛рд░рд╛ рдЯрд╛рд░реНрдЧреЗрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдлрд╝рд╛рдЗрд▓ (k рдЧрд┐рдиреЗ.рдмрд┐рди) рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╢рд╛рдорд┐рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
ENTRY (loader) LMA = 0x00100000; SECTIONS { . = LMA; .multiboot ALIGN (0x1000) : { loader.o( .text ) } .text ALIGN (0x1000) : { *(.text) } .rodata ALIGN (0x1000) : { *(.rodata*) } .data ALIGN (0x1000) : { *(.data) } .bss : { *(COMMON) *(.bss) } /DISCARD/ : { *(.comment) } }
рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдлрд╝рдВрдХреНрд╢рди ENTRY () рдЖрдкрдХреЛ рд╣рдорд╛рд░реЗ рдХрд░реНрдиреЗрд▓ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рдкрддреЗ рдкрд░ рд╣реИ рдХрд┐ рдЧреНрд░рдм рдХрд░реНрдиреЗрд▓ рдмреВрдЯ рдХреЗ рдмрд╛рдж рдирд┐рдпрдВрддреНрд░рдг рд╕реЗ рдЧреБрдЬрд░реЗрдЧрд╛ред рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд▓рд┐рдВрдХрд░ рдИрдПрд▓рдПрдл рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдПрдХ рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдЧрд╛ред рдПрдХ ELF рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ рд╕реЗрдЧрдореЗрдВрдЯ рдФрд░ рд╕реЗрдХреНрд╢рди рд╣реЛрддреЗ рд╣реИрдВред рд╕реЗрдЧрдореЗрдВрдЯ рдХреА рд╕реВрдЪреА рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╣реЗрдбрд░ рдЯреЗрдмрд▓, рд╕реЗрдХреНрд╢рди рд╣реЗрдбрд░ рдЯреЗрдмрд▓ рдореЗрдВ рд╕реЗрдХреНрд╢рди рдХреА рд╕реВрдЪреА рдореЗрдВ рд╕рдорд╛рд╣рд┐рдд рд╣реИред рд▓рд┐рдВрдХрд░ рдЕрдиреБрднрд╛рдЧреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдЫрд╡рд┐ рд▓реЛрдбрд░ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, GRUB) рдЦрдВрдбреЛрдВ рдХреЗ рд╕рд╛рдеред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЖрдВрдХрдбрд╝рд╛ рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЦрдВрдбреЛрдВ рдореЗрдВ рдЕрдиреБрднрд╛рдЧ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЕрдиреБрднрд╛рдЧ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЖрднрд╛рд╕реА рдкрддрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдЕрдиреБрднрд╛рдЧ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд╕рдордп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдХ рдЦрдВрдб рдореЗрдВ 2 рдХреНрд╖реЗрддреНрд░ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕рдХреЗ рд╕реНрдерд╛рди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ: рдЦрдВрдб рдХрд╛ рдЖрднрд╛рд╕реА рдкрддрд╛ рдФрд░ рдЦрдВрдб рдХрд╛ рднреМрддрд┐рдХ рдкрддрд╛ред рд╕реЗрдЧрдореЗрдВрдЯ рдХрд╛ рд╡рд░реНрдЪреБрдЕрд▓ рдПрдбреНрд░реЗрд╕ рдХреЛрдб рдХреЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рдХреЗ рд╕рдордп рд╕реЗрдЧрдореЗрдВрдЯ рдХреЗ рдкрд╣рд▓реЗ рдмрд╛рдЗрдЯ рдХрд╛ рд╡рд░реНрдЪреБрдЕрд▓ рдПрдбреНрд░реЗрд╕ рд╣реИ, рд╕реЗрдЧрдореЗрдВрдЯ рдХрд╛ рднреМрддрд┐рдХ рдкрддрд╛ рд╡рд╣ рднреМрддрд┐рдХ рдкрддрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рд╕реЗрдЧрдореЗрдВрдЯ рдХреЛ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдпреЗ рдкрддреЗ рд╣рдореЗрд╢рд╛ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВред рдЧреНрд░рдм рдЙрдирдХреЗ рднреМрддрд┐рдХ рдкрддреЗ рдкрд░ рдЫрд╡рд┐ рд╕реЗрдЧрдореЗрдВрдЯ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдЧреНрд░рдм рдкреЗрдЬ рдПрдбреНрд░реЗрд╕рд┐рдВрдЧ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕реЗрдЧрдореЗрдВрдЯ рдХрд╛ рд╡рд░реНрдЪреБрдЕрд▓ рдкрддрд╛ рдЗрд╕рдХреЗ рднреМрддрд┐рдХ рдкрддреЗ рд╕реЗ рдореЗрд▓ рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рд╡рд░реНрдЪреБрдЕрд▓ рдореЗрдореЛрд░реА рднреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдирд╣реАрдВ рд╣реИред
SECTIONS
рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдЖрдЧреЗ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
. = LMA;
рдпрд╣ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд▓рд┐рдВрдХрд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдмрд╛рдж рдХреЗ рдЕрдиреБрднрд╛рдЧ рдПрд▓рдПрдордП рдкрддреЗ рдХреЗ рдмрд╛рдж рд╣реИрдВред
ALIGN (0x1000)
рдКрдкрд░ рджрд┐рдП рдЧрдП рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЕрдиреБрднрд╛рдЧ 0x1000 рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рд╕рдВрд░реЗрдЦрд┐рдд рд╣реИред
.multiboot ALIGN (0x1000) : { loader.o( .text ) }
рдПрдХ рдЕрд▓рдЧ рдорд▓реНрдЯреАрдмреВрдЯ рдЕрдиреБрднрд╛рдЧ, рдЬрд┐рд╕рдореЗрдВ рд▓реЛрдбрд░ .o рдлрд╝рд╛рдЗрд▓ рд╕реЗ .text рдЦрдВрдб рд╢рд╛рдорд┐рд▓ рд╣реИ, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдорд▓реНрдЯреАрдмреВрдЯ рдкреНрд░рд╛рд░реВрдк рдХрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░реНрдиреЗрд▓ рдЫрд╡рд┐ рдХреЗ рдкрд╣рд▓реЗ 8kb рдореЗрдВ рдорд┐рд▓рддрд╛ рд╣реИред
.bss : { *(COMMON) *(.bss) }
* (COMMON) рд╡рд╣ рдХреНрд╖реЗрддреНрд░ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдореЗрдореЛрд░реА рдХреЛ рдирд┐рд░реНрджреЗрд╢ .comm рдФрд░ .lcomm рджреНрд╡рд╛рд░рд╛ рдЖрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рдЗрд╕реЗ .bs рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВред
/DISCARD/ : { *(.comment) }
DISCARD рдЪрд┐рд╣реНрдирд┐рдд рд╕рднреА рдЦрдВрдб рдЫрд╡рд┐ рд╕реЗ рд╣рдЯрд╛ рджрд┐рдП рдЧрдП рд╣реИрдВред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╣рдо .comment рд╕реЗрдХреНрд╢рди рдХреЛ рд╣рдЯрд╛ рджреЗрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд▓рд┐рдВрдХрд░ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИред
рдЕрдм рдХреЛрдб рдХреЛ рдПрдХ рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рдореНрди рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ:
as -o loader.o loader.s gcc -Iinclude -Wall -fno-builtin -nostdinc -nostdlib -o kernel.o -c kernel.c gcc -Iinclude -Wall -fno-builtin -nostdinc -nostdlib -o printf.o -c common/printf.c gcc -Iinclude -Wall -fno-builtin -nostdinc -nostdlib -o screen.o -c common/screen.c ld -T linker.ld -o kernel.bin kernel.o screen.o printf.o loader.o
Objdump рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдпрд╣ рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХрд░реНрдиреЗрд▓ рдХреА рдЫрд╡рд┐ рдХреИрд╕реА рджрд┐рдЦрддреА рд╣реИ:
objdump -ph ./kernel.bin

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЫрд╡рд┐ рдореЗрдВ рдЕрдиреБрднрд╛рдЧ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдордиреЗ рд▓рд┐рдВрдХрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдерд╛ред рд▓рд┐рдВрдХрд░ рдиреЗ рд╡рд░реНрдгрд┐рдд рд╡рд░реНрдЧреЛрдВ рд╕реЗ 3 рдЦрдВрдбреЛрдВ рдХрд╛ рдЧрдарди рдХрд┐рдпрд╛ред рдкрд╣рд▓реЗ рдЦрдВрдб рдореЗрдВ .multiboot, .text, .rodata рдФрд░ рдПрдХ рдЖрднрд╛рд╕реА рдФрд░ рднреМрддрд┐рдХ рдкрддрд╛ 0x00100000 рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рджреВрд╕рд░реЗ рдЦрдВрдб рдореЗрдВ .data рдФрд░ .bs рд╡рд░реНрдЧ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдФрд░ 0x00104000 рдкрд░ рд╕реНрдерд┐рдд рд╣реИред рддреЛ рд╕рдм рдХреБрдЫ рдЧреНрд░рдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред
рдЪрд░рдг 4. рдЧреНрд░рдм рдмреВрдЯрд▓реЛрдбрд░ рддреИрдпрд╛рд░ рдХрд░рдирд╛:
рдЧреНрд░рдм рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдБ:
mkdir grub
рдЗрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдХрдИ рдЧреНрд░рдм рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдПрдБ рдЬреЛ рдЫрд╡рд┐ рдкрд░ рдЗрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ (рдирд┐рдореНрди рдлрд╝рд╛рдЗрд▓реЗрдВ рдореМрдЬреВрдж рд╣реИрдВ рдпрджрд┐ рдЧреНрд░рдм рд╕рд┐рд╕реНрдЯрдо рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рд╣реИ)ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди рдЖрджреЗрд╢ рдЪрд▓рд╛рдПрдБ:
cp /usr/lib/grub/i386-pc/stage1 ./grub/ cp /usr/lib/grub/i386-pc/stage2 ./grub/ cp /usr/lib/grub/i386-pc/fat_stage1_5 ./grub/
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдПрдХ рдЧреНрд░рдм / рдореЗрдиреВ.рд▓рд╕реНрдЯ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ:
timeout 3 default 0 title mini_os root (hd0,0) kernel /kernel.bin
рдЪрд░рдг 5. рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░реЗрдВ рдФрд░ рдмреВрдЯ рдЫрд╡рд┐ рдмрдирд╛рдПрдВ:
рдмрд┐рд▓реНрдб рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдореЗрдХ рдпреВрдЯрд┐рд▓рд┐рдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдореЗрдХрдлрд╛рдЗрд▓ рдмрдирд╛рдПрдВ рдЬреЛ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рди рдХрд░реЗрдЧрд╛, рдХрд░реНрдиреЗрд▓ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ рдФрд░ рдПрдХ рдмреВрдЯ рдЫрд╡рд┐ рдмрдирд╛рдПрдВред рдореЗрдХрдлрд╛рдЗрд▓ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░реА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП:
CC = gcc CFLAGS = -Wall -fno-builtin -nostdinc -nostdlib LD = ld OBJFILES = \ loader.o \ common/printf.o \ common/screen.o \ kernel.o image: @echo "Creating hdd.img..." @dd if=/dev/zero of=./hdd.img bs=512 count=16065 1>/dev/null 2>&1 @echo "Creating bootable first FAT32 partition..." @losetup /dev/loop1 ./hdd.img @(echo c; echo u; echo n; echo p; echo 1; echo ; echo ; echo a; echo 1; echo t; echo c; echo w;) | fdisk /dev/loop1 1>/dev/null 2>&1 || true @echo "Mounting partition to /dev/loop2..." @losetup /dev/loop2 ./hdd.img \ --offset `echo \`fdisk -lu /dev/loop1 | sed -n 10p | awk '{print $$3}'\`*512 | bc` \ --sizelimit `echo \`fdisk -lu /dev/loop1 | sed -n 10p | awk '{print $$4}'\`*512 | bc` @losetup -d /dev/loop1 @echo "Format partition..." @mkdosfs /dev/loop2 @echo "Copy kernel and grub files on partition..." @mkdir -p tempdir @mount /dev/loop2 tempdir @mkdir tempdir/boot @cp -r grub tempdir/boot/ @cp kernel.bin tempdir/ @sleep 1 @umount /dev/loop2 @rm -r tempdir @losetup -d /dev/loop2 @echo "Installing GRUB..." @echo "device (hd0) hdd.img \n \ root (hd0,0) \n \ setup (hd0) \n \ quit\n" | grub --batch 1>/dev/null @echo "Done!" all: kernel.bin rebuild: clean all .so: as -o $@ $< .co: $(CC) -Iinclude $(CFLAGS) -o $@ -c $< kernel.bin: $(OBJFILES) $(LD) -T linker.ld -o $@ $^ clean: rm -f $(OBJFILES) hdd.img kernel.bin
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рджреЛ рдореБрдЦреНрдп рд▓рдХреНрд╖реНрдп рдШреЛрд╖рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ: рд╕рднреА - рдХрд░реНрдиреЗрд▓, рдФрд░ рдЫрд╡рд┐ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ - рдЬреЛ рдмреВрдЯ рдбрд┐рд╕реНрдХ рдмрдирд╛рддрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рдореЗрдХрдлрд╛рдЗрд▓ рдХреА рддрд░рд╣ рд╕рднреА рдЯрд╛рд░рдЧреЗрдЯ рдореЗрдВ .so рдФрд░ .co рдХреЗ рд╕рдмрдЧреЛрд▓реНрд╕ рд╣реЛрддреЗ рд╣реИрдВ, рдЬреЛ * .s рдФрд░ * .c рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╛рдЗрд▓реНрд╕ (* .o) рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рдХрд░реНрдиреЗрд▓.рдмрд┐рдирд╛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯрд╛рд░рдЧреЗрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреЛ рд▓рд┐рдВрдХрд░ рдХреЛ рдкрд╣рд▓реЗ рдмрдирд╛рдИ рдЧрдИ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред рдпреЗ рд▓рдХреНрд╖реНрдп рдЪрд░рдг 3 рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рд╕рдорд╛рди рдХрдорд╛рдВрдбреНрд╕ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рддреЗ рд╣реИрдВред
рдпрд╣рд╛рдВ рд╕рдмрд╕реЗ рдмрдбрд╝реА рд░реБрдЪрд┐ рдмреВрдЯ рдЫрд╡рд┐ HDd.img (рд▓рдХреНрд╖реНрдп рдЫрд╡рд┐) рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╣реИред рдЖрдЗрдП рд╣рдо рдЪрд░рдгреЛрдВ рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд╣реЛрддрд╛ рд╣реИред
dd if=/dev/zero of=./hdd.img bs=512 count=16065 1>/dev/null 2>&1
рдпрд╣ рдХрдорд╛рдВрдб рдПрдХ рдЫрд╡рд┐ рдмрдирд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдХрд╛рдо рд╣реЛрдЧрд╛ред рд╕реЗрдХреНрдЯрд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕рдВрдпреЛрдЧ рд╕реЗ рдирд╣реАрдВ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛: 16065 = 255 * 63. рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдбрд┐рд╕реНрдХ рдХреЗ рд╕рд╛рде fdsik рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдЗрд╕рдореЗрдВ CHS рдЬреНрдпрд╛рдорд┐рддрд┐ рдереА, рдЬрд┐рд╕рдореЗрдВ рд╣реЗрдбрд░ (H) = 255, рд╕реЗрдХреНрдЯрд░ (S) = 63, рдФрд░ Cindenders (C) рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдбрд┐рд╕реНрдХ рдХрд╛ рдЖрдХрд╛рд░ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдбрд┐рд╕реНрдХ рдЬреНрдпрд╛рдорд┐рддрд┐ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдмрд┐рдирд╛ fdsik рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдиреНрдпреВрдирддрдо рдбрд┐рд╕реНрдХ рдЖрдХрд╛рд░ 512 * 255 * 63 * 1 = 8225280 рдмрд╛рдЗрдЯреНрд╕ рд╣реИ, рдЬрд╣рд╛рдВ 512 рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдЖрдХрд╛рд░ рд╣реИ рдФрд░ 1 рд╕рд┐рд▓реЗрдВрдбрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИред
рдЕрдЧрд▓рд╛, рдПрдХ рд╡рд┐рднрд╛рдЬрди рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдИ рдЧрдИ рд╣реИ:
losetup /dev/loop1 ./hdd.img (echo c; echo u; echo n; echo p; echo 1; echo ; echo ; echo a; echo 1; echo t; echo c; echo w;) | fdisk /dev/loop1 1>/dev/null 2>&1 || true
рдкрд╣рд▓рд╛ рдХрдорд╛рдВрдб рдмреНрд▓реЙрдХ рдбрд┐рд╡рд╛рдЗрд╕ / рджреЗрд╡ / рд▓реВрдк 1 рдХреЗ рд▓рд┐рдП hdd.img рдлрд╛рдЗрд▓ рдХреЛ рдорд╛рдЙрдВрдЯ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдк рдлрд╛рдЗрд▓ рдХреЛ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рджреВрд╕рд░рд╛ рдХрдорд╛рдВрдб рдбрд┐рд╡рд╛рдЗрд╕ / рджреЗрд╡ / рд▓реВрдк 1 рдкрд░ рдПрдХ рд╡рд┐рднрд╛рдЬрди рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ FAT32 рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рд▓реЗрдмрд▓ рдХреЗ рд╕рд╛рде рдбрд┐рд╕реНрдХ рдХрд╛ 1 рдкреНрд░рд╛рдердорд┐рдХ рдмреВрдЯ рд╡рд┐рднрд╛рдЬрди рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рд╕рдВрдкреВрд░реНрдг рдбрд┐рд╕реНрдХ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓реЗрддрд╛ рд╣реИред
рдлрд┐рд░ рд╣рдо рдирд┐рд░реНрдорд┐рдд рдЕрдиреБрднрд╛рдЧ рдХреЛ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдмреНрд▓реЙрдХ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдЙрдВрдЯ рдХрд░реЗрдВ рдФрд░ рдлрд╝реЙрд░реНрдореЗрдЯрд┐рдВрдЧ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВред
losetup /dev/loop2 ./hdd.img \ --offset `echo \`fdisk -lu /dev/loop1 | sed -n 10p | awk '{print $$3}'\`*512 | bc` \ --sizelimit `echo \`fdisk -lu /dev/loop1 | sed -n 10p | awk '{print $$4}'\`*512 | bc` losetup -d /dev/loop1
рдкрд╣рд▓рд╛ рдХрдорд╛рдВрдб рдбрд┐рд╡рд╛рдЗрд╕ / рджреЗрд╡ / рд▓реВрдк 2 рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдмрдиреЗ рд╡рд┐рднрд╛рдЬрди рдХреЛ рдорд╛рдкрддрд╛ рд╣реИред тАУрдСрдлрд╝рд╕реЗрдЯ рд╡рд┐рдХрд▓реНрдк рдЕрдиреБрднрд╛рдЧ рдХреА рд╢реБрд░реБрдЖрдд рдХрд╛ рдкрддрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЕрдиреБрднрд╛рдЧ рдХреЗ рдЕрдВрдд рдХрд╛ рдкрддрд╛ -sizelimitред рджреЛрдиреЛрдВ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ fdisk рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
mkdosfs /dev/loop2
Mkdosfs рдЙрдкрдпреЛрдЧрд┐рддрд╛ FAT32 рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдПрдХ рд╡рд┐рднрд╛рдЬрди рдХреЛ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рддреА рд╣реИред
рдХрд░реНрдиреЗрд▓ рдХреА рдкреНрд░рддреНрдпрдХреНрд╖ рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рд╕реЗ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрд▓рд╛рд╕рд┐рдХ рдореЗрдХрдлрд╛рдЗрд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдм рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рд╡рд┐рднрд╛рдЬрди рдкрд░ GRUB рдХреИрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
mkdir -p tempdir # mount /dev/loop2 tempdir # mkdir tempdir/boot # /boot cp -r grub tempdir/boot/ # grub /boot cp kernel.bin tempdir/ # sleep 1 # Ubuntu umount /dev/loop2 # rm -r tempdir # losetup -d /dev/loop2 #
рдЙрдкрд░реЛрдХреНрдд рдЖрджреЗрд╢реЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЫрд╡рд┐ GRUB рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛрдЧреАред рдирд┐рдореНрди рдХрдорд╛рдВрдб GRd рдХреЛ hdd.img рдбрд┐рд╕реНрдХ рдЫрд╡рд┐ рдХреЗ MBR рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред
echo "device (hd0) hdd.img \n \ root (hd0,0) \n \ setup (hd0) \n \ quit\n" | grub --batch 1>/dev/null
рд╕рдм рдХреБрдЫ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ!
рдЪрд░рдг 6. рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ:
рд╕рдВрдХрд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
make all
рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдХрд░реНрдиреЗрд▓.рдмрд┐рди рдлрд╝рд╛рдЗрд▓ рджрд┐рдЦрдиреА рдЪрд╛рд╣рд┐рдПред
рдмреВрдЯ рдбрд┐рд╕реНрдХ рдЫрд╡рд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
sudo make image
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, hdd.img рдлрд╝рд╛рдЗрд▓ рджрд┐рдЦрд╛рдИ рджреЗрдиреА рдЪрд╛рд╣рд┐рдПред
рдЕрдм рдЖрдк hdd.img рдбрд┐рд╕реНрдХ рдЗрдореЗрдЬ рд╕реЗ рдмреВрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдЗрд╕реЗ рдирд┐рдореНрди рдХрдорд╛рдВрдб рд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
qemu -hda hdd.img -m 32
рдпрд╛:
qemu-system-i386 -hda hdd.img


рдПрдХ рдЕрд╕рд▓реА рдорд╢реАрди рдкрд░ рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕ рдЫрд╡рд┐ рдХреА dd рдХреЛ рдПрдХ рдлреНрд▓реИрд╢ рдбреНрд░рд╛рдЗрд╡ рдкрд░ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЙрд╕рд╕реЗ рдмреВрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдЖрджреЗрд╢ рдХреЗ рд╕рд╛рде:
sudo dd if=./hdd.img of=/dev/sdb
рд╕рд╛рд░рд╛рдВрд╢рд┐рдд рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдореЗрдВ рд╕реНрд░реЛрддреЛрдВ рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдорд┐рд▓рддрд╛ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдпреЛрдЧреЛрдВ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдкрд╣рд▓рд╛ рдХрджрдо рд╕рд┐рд╕реНрдЯрдо рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдмрдирд╛рдиреЗ рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рдЙрдард╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреИрд╕реЗ рд╣рд╛рдЗрдкрд░рд╡рд╛рдЗрдЬрд╝рд░ рдФрд░ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдоред
рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦреЛрдВ рдХреЗ рд▓рд┐рдВрдХ:
"
рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмрд┐рдирд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреИрд╕реЗ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рдП: рднрд╛рдЧ 2 "
"
рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмрд┐рдирд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреИрд╕реЗ рдЪрд▓рд╛рдПрдВ: рднрд╛рдЧ 3: рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ "
"
рдХреИрд╕реЗ рдПрдХ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП: рднрд╛рдЧ 4. рд╕рдорд╛рдирд╛рдВрддрд░ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ "
"
рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмрд┐рдирд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреИрд╕реЗ рдЪрд▓рд╛рдирд╛ рд╣реИ: рднрд╛рдЧ 5. рдУрдПрд╕ рд╕реЗ BIOS рддрдХ рдкрд╣реБрдВрдЪрдирд╛ "
"
рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмрд┐рдирд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреИрд╕реЗ рдЪрд▓рд╛рдПрдВ: рднрд╛рдЧ 6. FAT рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдбрд┐рд╕реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди "