рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмрд┐рдирд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреИрд╕реЗ рдЪрд▓рд╛рдПрдВ: рднрд╛рдЧ 6. FAT рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдбрд┐рд╕реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди

рд▓реЗрдЦреЛрдВ рдХреА рд╣рдорд╛рд░реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдкрд╛рдВрдЪрд╡реЗрдВ рднрд╛рдЧ рдореЗрдВ, рд╣рдордиреЗ рджрд┐рдЦрд╛рдпрд╛ рдХрд┐ рдЖрдк рд╕рдВрд░рдХреНрд╖рд┐рдд рдореЛрдб рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж BIOS рдЗрдВрдЯрд░рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдордиреЗ рд░реИрдо рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ред рдЖрдЬ рд╣рдо рдЗрд╕ рд╕рдлрд▓рддрд╛ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░реЗрдВрдЧреЗ рдФрд░ FAT16 рдФрд░ FAT32 рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рд╕рдорд░реНрдерди рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗред рдбрд┐рд╕реНрдХ рдкрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо 2 рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ рдФрд░ рд░реАрдб / рд░рд╛рдЗрдЯ рд╕реЗрдХреНрдЯрд░ рдкрд░ рдбрд┐рд╕реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВред рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЗ "рдбреНрд░рд╛рдЗрд╡рд░" рдФрд░ рдбрд┐рд╕реНрдХ рдХреЗ "рдбреНрд░рд╛рдЗрд╡рд░" рдХреЛ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред

рдкрдврд╝рдиреЗ / рд▓рд┐рдЦрдиреЗ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕реНрддрд░ рдкрд░ рдбрд┐рд╕реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ


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

рдбрд┐рд╕реНрдХ рдкрд░ рд╕реЗрдХреНрдЯрд░ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВ рдЬреЛ BIOS рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ - рд╕реАрдПрдЪрдПрд╕ ( рд╕рд┐рд▓реЗрдВрдбрд░-рд╣реЗрдб-рд╕реЗрдХреНрдЯрд░ ) рдФрд░ рдПрд▓рдмреАрдП ( рд▓реЙрдЬрд┐рдХрд▓ рдмреНрд▓реЙрдХ рдПрдбреНрд░реЗрд╕рд┐рдВрдЧ )ред рд╕реАрдПрдЪрдПрд╕ рдПрдбреНрд░реЗрд╕рд┐рдВрдЧ рдбрд┐рд╕реНрдХ рдЬреНрдпреЛрдореЗрдЯреНрд░реА рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдФрд░ рд╕реЗрдХреНрдЯрд░ рдПрдбреНрд░реЗрд╕ рддреАрди рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХрд╛ рдПрдХ рд╕рдВрдпреЛрдЬрди рд╣реИ: рд╕рд┐рд▓реЗрдВрдбрд░, рд╣реЗрдб, рд╕реЗрдХреНрдЯрд░ред рд╡рд┐рдзрд┐ рдЖрдкрдХреЛ 8GB рддрдХ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рд╡реНрдпрд╡рдзрд╛рди int0x13 рдЗрд╕ рдкрддреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбрд┐рд╕реНрдХ рдкрд░ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ 8GB рдмрд╣реБрдд рдЫреЛрдЯрд╛ рд╣реИ, рдФрд░ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдпрд╣ рддрд░реАрдХрд╛ рдкреБрд░рд╛рдирд╛ рд╣реИ, рдФрд░ рд╕рднреА рдЖрдзреБрдирд┐рдХ (рдФрд░ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ) рд╣рд╛рд░реНрдб рдбрд┐рд╕реНрдХ рдХрдВрдЯреНрд░реЛрд▓рд░ LBA рдПрдбреНрд░реЗрд╕рд┐рдВрдЧ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред рдПрд▓рдмреАрдП рдбрд┐рд╕реНрдХ рдЬреНрдпрд╛рдорд┐рддрд┐ рд╕реЗ рд╕рд╛рд░ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдПрдХ рдЕрд▓рдЧ рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╕реЗрдХреНрдЯрд░ рдирдВрдмрд░рд┐рдВрдЧ рдЦрд░реЛрдВрдЪ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИред LBA рдмреНрд▓реЙрдХ рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 48 рдмрд┐рдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ 512 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд╕реЗрдХреНрдЯрд░ рдЖрдХрд╛рд░ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП 128 PiB рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╡реНрдпрд╡рдзрд╛рди int0x13 рдПрд▓рдмреАрдП рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбрд┐рд╕реНрдХ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рд╕реЗрд╡рд╛рдПрдВ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╣рдо рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдХрд┐рд╕реА рд╕реЗрдХреНрдЯрд░ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП, in0x13 рдЗрдВрдЯрд░рдкреНрдЯ рдирд┐рдореНрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ:



рдбреАрдПрдкреА рд╕рдВрд░рдЪрдирд╛:



рд╡реНрдпрд╡рдзрд╛рди рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ:



рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдбрд┐рд╕реНрдХ рдирдВрдмрд░ рд╣реИред рд╣рдореЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рдбрд┐рд╕реНрдХ рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рдХрд╛рдо рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рдирдВрдмрд░рд┐рдВрдЧ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ: рдлреНрд▓реЙрдкреА рдбрд┐рд╕реНрдХ (fdd), рдФрд░ рд╕рдм рдХреБрдЫ рдЬреЛ рдлреНрд▓реЙрдкреА рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрдХрд░рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЦрд░реЛрдВрдЪ рдФрд░ рд╣рд╛рд░реНрдб рдбрд┐рд╕реНрдХ (hdd) рд╕реЗ рдХреНрд░рдорд╛рдВрдХрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕рдм рдХреБрдЫ рдЬреЛ рдЙрдирдХреЗ рдЬреИрд╕рд╛ рдЕрдиреБрдХрд░рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (usb рдлреНрд▓реИрд╢ рдбреНрд░рд╛рдЗрд╡, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП) 0x80 рд╕реЗ рдЧрд┐рдиреЗ рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕ рдирдВрдмрд░ рдХрд╛ BIOS рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдмреВрдЯ рдЕрдиреБрдХреНрд░рдо рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬрд┐рд╕ рдбрд┐рд╕реНрдХ рдХреЗ рд╕рд╛рде рд╣рдо рдХрд╛рдо рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рдбрд┐рд╕реНрдХ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рд╣рдордиреЗ рдмреВрдЯ рдХрд┐рдпрд╛ рдерд╛ред

рдЬрдм BIOS рдПрдордмреАрдЖрд░ рдирд┐рдпрдВрддреНрд░рдг рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдЗрд╕реЗ 0000h: 7C00h рдкрддреЗ рдкрд░ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдбреАрдПрд▓ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдпрд╣ рдмреВрдЯ рдбрд┐рд╡рд╛рдЗрд╕ рдирдВрдмрд░ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╣ BIOS рдФрд░ MBR рдХреЗ рдмреАрдЪ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрд╣ рд╕рдВрдЦреНрдпрд╛ GRUB рдореЗрдВ рдЖрддреА рд╣реИ, рдЬрд╣рд╛рдВ рддрдм рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдбрд┐рд╕реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред GRUB, рдмрджрд▓реЗ рдореЗрдВ, рдЗрд╕ OS рдирдВрдмрд░ рдХреЛ рдорд▓реНрдЯреАрдмреВрдЯ рд╕реВрдЪрдирд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИред

GRUB рд╕реЗ OS рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдареАрдХ рдмрд╛рдж, рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдПрдХ рд╕реВрдЪрдХ EBX рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИред рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдкрд╣рд▓рд╛ рдХреНрд╖реЗрддреНрд░ рдЭрдВрдбреЗ рд╣реИ, рдФрд░ рдпрджрд┐ рдЗрд╕рдореЗрдВ 2 рдмрд┐рдЯ рд╕реЗрдЯ рд╣реИ, рддреЛ boot_device рдлрд╝реАрд▓реНрдб рд╕рд╣реА рд╣реИред рдпрд╣ рдлрд╝реАрд▓реНрдб рдорд▓реНрдЯреАрдмреВрдЯ рд╕реВрдЪрдирд╛ рд╕рдВрд░рдЪрдирд╛ рд╕реЗ рднреА рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ рдФрд░ рдЗрд╕рдХреА рдЙрдЪреНрдЪ рдмрд╛рдЗрдЯ рдореЗрдВ (рдлрд╝реАрд▓реНрдб рдХрд╛ рдЖрдХрд╛рд░ 4 рдмрд╛рдЗрдЯреНрд╕ рд╣реИ) рд╣рдореЗрдВ рдЬрд┐рд╕ рдбрд┐рд╕реНрдХ рдирдВрдмрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЙрд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ inter0x13 рдЗрдВрдЯрд░рдкреНрдЯ рдХреЛ рд╕рдордЭрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, GRUB рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдореЗрдВ рдбрд┐рд╕реНрдХ рдХреЛ рдкрдврд╝рдиреЗ / рд▓рд┐рдЦрдиреЗ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд╛рдкрддрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдорд┐рд▓рд╛ред

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



рд╡рд┐рднрд╛рдЬрди рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╡рд┐рднрд╛рдЬрди рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред рдПрдХ рдбрд┐рд╕реНрдХ рдкрд░ рдХреЗрд╡рд▓ 4 рдкреНрд░рд╛рдердорд┐рдХ рд╡рд┐рднрд╛рдЬрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рд╕реЗ рдЖрдк рдмреВрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкреНрд░рддрд┐ рд╕реЗрдХреНрд╢рди рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдореЗрдВ 8 рдмрд╛рдЗрдЯреНрд╕ рд╣реИрдВред рдкрд╣рд▓рд╛ рдмрд╛рдЗрдЯ рдзреНрд╡рдЬ рд╣реИ, рдпрджрд┐ рдЗрд╕рдХрд╛ рдорд╛рди 0x80 рд╣реИ, рддреЛ рд╡рд┐рднрд╛рдЬрди рдмреВрдЯ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИред рдЕрдкрдиреЗ рдХрд╛рдо рдХреЗ рджреМрд░рд╛рди рдПрдордмреАрдЖрд░ рдХреЛрдб рдмреВрдЯ рд╡рд┐рднрд╛рдЬрди рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдЗрди 4 рдЦрдВрдбреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рддрд╛ рд╣реИред рдЕрдкрдиреА рдЦреЛрдЬ рдХреЗ рдмрд╛рдж, рдПрдордмреАрдЖрд░ рдЗрд╕ рдЦрдВрдб рдХреЗ рдкрд╣рд▓реЗ рд╕реЗрдХреНрдЯрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ 0000h: 7C00h рдФрд░ рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯ рдХрдВрдЯреНрд░реЛрд▓ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИред рд╣рдо рдмреВрдЯ рд╡рд┐рднрд╛рдЬрди рдХреЗ рдкрд╣рд▓реЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ LBA рдкрддреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЗрд╕ рдкрд░ рд╣реИ рдХрд┐ рд╣рдорд╛рд░рд╛ рдХрд░реНрдиреЗрд▓ рд╕реНрдерд┐рдд рд╣реИ, рдФрд░ рдПрдХ рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдкрдврд╝рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕ рдкрддреЗ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдбрд┐рд╕реНрдХ рдХреЗ рдкрд╣рд▓реЗ рд╕реЗрдХреНрдЯрд░ рдХреЛ рдкрдврд╝рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдЙрд╕ рдкрд░ рд╡рд┐рднрд╛рдЬрди рддрд╛рд▓рд┐рдХрд╛ рдвреВрдВрдвреЗрдВ, рд╡рд┐рднрд╛рдЬрди рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдмреВрдЯ рд╡рд┐рднрд╛рдЬрди рдХреЛ рдвреВрдВрдвреЗрдВ, рдФрд░ рдЗрд╕рдХреЗ рд░рд┐рдХреЙрд░реНрдб рд╕реЗ рд╡рд╛рдВрдЫрд┐рдд рдХреНрд╖реЗрддреНрд░ рдХреЛ рдкрдврд╝реЗрдВред

рддреЛ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдбрд┐рд╕реНрдХ рд╕реЗ рдПрдХ рд╕реЗрдХреНрдЯрд░ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рд╡рд┐рднрд╛рдЬрди рдХреЗ рд╕реНрдерд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдбрд┐рд╕реНрдХ рдкрд░ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдЦрдВрдб рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ


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

int media_read(uint32 sector, uint8 *buffer, uint32 sector_count); int media_write(uint32 sector, uint8 *buffer, uint32 sector_count); Return: int, 1 = success, 0 = failure. 


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

рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд┐рднрд╛рдЬрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЗрдХреНрдЯрд░ рдХреЛ рдкрдврд╝рдиреЗ / рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рд╣реИрдВ рдФрд░ FAT16 / 32 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ рдЬреЛ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕рдм рдХреБрдЫ рдПрдХ рд╕рд╛рде рд░рдЦрдиреЗ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред рд▓реЗрдХрд┐рди рдХреЛрдб рдкрд░ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдпрд╣ рдмрддрд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рд╣рдо рдЬрд┐рд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдореЗрдВ рдХрд╛рдлреА рд▓рд╛рдЧреВ рд╣реИред рдиреАрдЪреЗ VBR рд╡рд┐рдВрдбреЛрдЬ 7 рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдбрд┐рд╕реНрдХ рд╕реЗрдХреНрдЯрд░ рдХреЛ int0x13 рдЗрдВрдЯрд░рдкреНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдХреЛрдб рдХреЛ рдмрд╛рд░-рдмрд╛рд░ рд╕рд┐рд╕реНрдЯрдо рдмреВрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдмреВрдЯ рдПрдиреАрдореЗрд╢рди рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рдХреНрд╖рдг рддрдХред



рдЗрд╕ рдХреЛрдб рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд┐рдВрдбреЛрдЬ 7, рд╣рдо рдЗрд╕реЗ рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд╕рдВрд░рдХреНрд╖рд┐рдд рдореЛрдб рд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореЛрдб рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрддред рдпрд╣ QEMU рдореЗрдВ рд╡рд┐рдВрдбреЛрдЬ 7 рдЪрд▓рд╛рдХрд░ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред QEMU рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреАрдмрдЧрд░ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдбрд┐рдмрдЧрд░ (рдЬреАрдбреАрдмреА) рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж рд╣рдордиреЗ рдмреНрд░реЗрдХрдкреНрд╡рд╛рдЗрдВрдЯ рдХреЛ рдПрдбреНрд░реЗрд╕ (0x7c00 + 0x11d) рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ред рдЯреНрд░рд┐рдЧрд░ рдмреНрд░реЗрдХрдкрд╛рдЗрдВрдЯ рдХрд╛ рдЕрд░реНрде рд╣реЛрдЧрд╛ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ред рд╡реИрд╕реЗ, рд╡рд┐рдВрдбреЛрдЬ рдПрдХреНрд╕рдкреА рдореЗрдВ рдпрд╣ рддрдВрддреНрд░ рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╣реИ, BIOS рд╡реНрдпрд╡рдзрд╛рди рдкреИрджрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡реЗ рд╡рд╣рд╛рдВ VM86 рдореЛрдб рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рддреЗ рд╣реИрдВред

! рдорд╣рддреНрд╡рдкреВрд░реНрдг! рд╣рдорд╛рд░реЗ рд▓реЗрдЦреЛрдВ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдкрд╛рдВрдЪрд╡реЗрдВ рднрд╛рдЧ рд╕реЗ рд╕рднреА рдЪрд░рдгреЛрдВ рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рд╕рднреА рдЖрдЧреЗ рдХреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рдЪрд░рдг 1. рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдореБрдЦреНрдп рддрд░реНрдХ рдмрджрд▓реЗрдВ



1. рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдирд┐рдореНрди рдШреЛрд╖рдгрд╛рдПрдБ рдЬреЛрдбрд╝реЗрдВред рдлрд╝рд╛рдЗрд▓:

 #include "multiboot.h" #include "fat_io_lib/fat_filelib.h" //    loader.s extern u32 mbd; extern u32 magic; 


рдХреЛрдб рд░реИрдо рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ

 u64 ram_size = GetRamsize(); printf("ram_size = %llu(%lluMb)\n", ram_size, ram_size / 0x100000); 


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╕реЗ рдмрджрд▓реЗрдВ:

 // ,    grub- if (magic != MULTIBOOT_BOOTLOADER_MAGIC) { printf("Invalid magic number: 0x%x\n", magic); return; } multiboot_info_t *p_multiboot_info = (multiboot_info_t*)mbd; // Is boot_device valid? if ((p_multiboot_info->flags & 2) == 0) { printf("Error: boot_device(2) flag is clear\n"); return; } //      if (InitBootMedia(p_multiboot_info->boot_device >> 24) == 0) { printf("Error: InitBootMedia failed.\n"); return; } //   fat_io_lib fl_init(); if (fl_attach_media(ReadBootMedia, WriteBootMedia) != FAT_INIT_OK) { printf("Error: Media attach failed.\n"); return; } //      /boot/grub fl_listdirectory("/boot/grub"); //   /boot/grub/menu.lst   char str[64]; void *file = fl_fopen("/boot/grub/menu.lst", "r"); if (file == 0) { printf("Error: can not open file.\n"); return; } printf("\nConntent of the file /boot/grub/menu.lst:\n"); while (fl_fgets(str, sizeof(str), file)) { printf("%s", str); } 


Mbd рдФрд░ рдореИрдЬрд┐рдХ рд╡реИрд░рд┐рдПрдмрд▓ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рд▓реЛрдбрд░.рдПрд╕ рдлрд╛рдЗрд▓ рдореЗрдВ рдЖрд░рдХреНрд╖рд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ C рдХреЛрдб рд╕реЗ рд╡реИрд╢реНрд╡рд┐рдХ рд╡реИрд░рд┐рдПрдмрд▓ рдХреЗ рд╕рдорд╛рди рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореИрдЬрд┐рдХ рд╡реИрд░рд┐рдПрдмрд▓ рдореЗрдВ рдПрдХ рд╕рд┐рдЧреНрдиреЗрдЪрд░ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдкреБрд╖реНрдЯрд┐ рдХреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд▓реНрдЯреАрдмреВрдЯ рдорд╛рдирдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдХрд╛ рд╕рдВрджрд░реНрдн рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди GRUB рд╣реИред Mbd рд╡реИрд░рд┐рдПрдмрд▓ рдорд▓реНрдЯреАрдмреВрдЯ_info_t рд╕рдВрд░рдЪрдирд╛ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдорд▓реНрдЯреАрдмреВрдЯ рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдмреВрдЯ рдбрд┐рд╕реНрдХ рд╕рдВрдЦреНрдпрд╛ рдирд┐рдореНрди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ - p_multiboot_info-> boot_device >> 24. InitBootMedia рдлрд╝рдВрдХреНрд╢рди рдбрд┐рд╕реНрдХ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдпрд╛рдж рд░рдЦрддрд╛ рд╣реИ рдФрд░ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдкрд╣рд▓реЗ рд╕реЗрдХреНрдЯрд░ рдХреЛ рдЦреЛрдЬрддрд╛ рд╣реИ, рддрд╛рдХрд┐ рд╕рднреА рдСрдлрд╕реЗрдЯ рдХреЛ рдЗрд╕рд╕реЗ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХреЗред

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

2. рд╢рд╛рдорд┐рд▓ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ multiboot.h рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝реЗрдВред рд╣рдо рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рд╕рд╛рдЗрдЯ рд╕реЗ рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рд▓реЗрддреЗ рд╣реИрдВред

рдЪрд░рдг 2. рдбрд┐рд╕реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝реЗрдВ



1. рдлрд╝рд╛рдЗрд▓ рдореЗрдВ \ callrealmode.h рд╢рд╛рдорд┐рд▓ рд╣реИ, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:

 u32 InitBootMedia(u8 bootDevice); int ReadBootMedia(unsigned long sector, unsigned char *buffer, unsigned long sectorCount); int WriteBootMedia(unsigned long sector, unsigned char *buffer, unsigned long sectorCount); 


2. рд╢рд╛рдорд┐рд▓ \ callrealmode_asm.h рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, enum callrealmode_Func рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдорд╛рди рдЬреЛрдбрд╝реЗрдВ рддрд╛рдХрд┐ рдирд┐рдореНрди рдШрдЯрд┐рдд рд╣реЛ:

 enum callrealmode_Func { CALLREALMODE_FUNC_GETSYSMEMMAP = 0, CALLREALMODE_FUNC_READ_DISK = 1 };  ,       : <source lang="c"> struct callrealmode_read_disk { u64 start_sector_lba; u32 buff_addr; u32 sectors_count; u16 disk_number; u8 ret_code; } __attribute__ ((packed)); 


Callrealmode_Data рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЕрдВрджрд░ рдпреВрдирд┐рдпрди рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ рдмрд╕ рдШреЛрд╖рд┐рдд callrealmode_read_disk рд╕рдВрд░рдЪрдирд╛ред рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд┐рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП:

 struct callrealmode_Data { enum callrealmode_Func func : 16; union { struct callrealmode_GetSysMemMap getsysmemmap; struct callrealmode_read_disk readdisk; }; } __attribute__ ((packed)); 


3. fat_io_lib рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП strncmp рдФрд░ strncpy рдлрд╝рдВрдХреНрд╢рди рдХреЛ \ string.h рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВред

 static inline int strncmp ( const char * str1, const char * str2, unsigned int num ) { for ( ; num > 0; str1++, str2++, --num) { if (*str1 != *str2) return ((*(unsigned char *)str1 < *(unsigned char *)str2) ? -1 : +1); else if (*str1 == '\0') return 0; } return 0; } static inline char* strncpy ( char * dst, const char * src, unsigned int num ) { if (num != 0) { char *d = dst; const char *s = src; do { if ((*d++ = *s++) == 0) { while (--num) *d++ = 0; break; } } while (--num); } return dst; } 


4. callrealmode.c рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рдореНрди рдШреЛрд╖рдгрд╛рдПрдБ рдЬреЛрдбрд╝реЗрдВ:

 #include "fat_io_lib/fat_opts.h" #include "mbr.h" u64 g_BootPartitionStart = 0; //        u32 g_BootDeviceInt13Num = 0; //    


рдФрд░ рдХреБрдЫ рдХрд╛рд░реНрдп:

 //     int ReadBootMedia(unsigned long sector, unsigned char *buffer, unsigned long sectorCount) { struct callrealmode_Data param; // ,     //    RM,    param.func = CALLREALMODE_FUNC_READ_DISK; //         int13. //          //    1Mb,   "buffer"     . //         "low_mem_buff", //     RM ,    CALLREALMODE_OFFSET < 1Mb int i; void *low_mem_buff = CALLREALMODE_OFFSET + (&callrealmode_end - &callrealmode_start); for (i = 0; i < sectorCount; i++) { param.readdisk.start_sector_lba = sector + g_BootPartitionStart + i; param.readdisk.buff_addr = (u32)low_mem_buff; param.readdisk.disk_number = g_BootDeviceInt13Num; param.readdisk.sectors_count = 1; callrealmode_Call(┬╢m); // int 0x13    "param" if (param.readdisk.ret_code) { return 0; // error } memcpy(buffer + i * FAT_SECTOR_SIZE, low_mem_buff, FAT_SECTOR_SIZE); } return 1; // success } //    .  int WriteBootMedia(unsigned long sector, unsigned char *buffer, unsigned long sectorCount) { return 0; // error } //   u32 InitBootMedia(u8 bootDevice) { g_BootDeviceInt13Num = bootDevice; //     MBRSector_t mbr; if (ReadBootMedia(0, (u8*)&mbr, 1) == 0) { return 0; } //   if (mbr.mbr_sign[0] != 0x55 || mbr.mbr_sign[1] != 0xaa) { return 0; } //    int i; for (i = 0; i < 4; i++) { if (mbr.part[i].boot_indicator == 0x80) break; } if (i == 4) { return 0; } //       g_BootPartitionStart = mbr.part[i].start_lva; printf("start sector = %lld boot dev int13 num = 0x%x\n", g_BootPartitionStart, g_BootDeviceInt13Num); return 1; } 


ReadBootMedia рдФрд░ WriteBootMedia рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реЗрдХреНрдЯрд░реЛрдВ рдХреЛ рдкрдврд╝рдиреЗ / рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП fat_io_lib рд▓рд╛рдЗрдмреНрд░реЗрд░реА рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред WriteBootMedia рдлрд╝рдВрдХреНрд╢рди рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ рдФрд░ рдПрдХ рд╕реНрдЯрдм рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдбрд┐рд╕реНрдХ рдкрд░ рдХреЛрдИ рд▓реЗрдЦрди рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди ReadBootMedia рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдорд╛рди рд╣реЛрдЧрд╛ред ReadBootMedia рдлрд╝рдВрдХреНрд╢рди рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рд╕реЗ рдкреНрд░рдХрд╛рд░ param.func рддрдХ GetRamsize рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдорд╛рди рд╣реИ, рдФрд░ param.readysmemmap рдХреЗ рдмрдЬрд╛рдп param.readdisk рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред InitBootMedia рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрдиреНрдп рджреЛ рд╕реЗ рдкрд╣рд▓реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ g_BootPartitionStart рдФрд░ g_BootDeviceInt13Num рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЖрд░рдВрдн рдХрд░рддрд╛ рд╣реИред

5. callrealmode_asm.s рдмрджрд▓реЗрдВред рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ CALLREALMODE_FUNC_READ_DISK рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВ, рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдЪрд╛рд╣рд┐рдП:

 #    enum callrealmode_Func CALLREALMODE_FUNC_GETSYSMEMMAP = 0x0 CALLREALMODE_FUNC_READ_DISK = 0x1 


рдЕрдЧрд▓рд╛, рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рдбрд┐рд╕реНрдХ рд╕реЗ рдХреЛрдб рдкрдврд╝рдиреЗ рдкрд░ рд╕реАрдзреЗ рдПрдХ рдФрд░ рдЪреЗрдХ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд┐рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП:

 callrealmode_switch: OFF_FUNC = 44 #     %bp #   func  callrealmode_Data # Which function? movw OFF_FUNC(%bp),%ax cmp $CALLREALMODE_FUNC_GETSYSMEMMAP,%ax je getsysmemmap cmp $CALLREALMODE_FUNC_READ_DISK,%ax je readdisk ret readdisk: OFF_START_SECTOR = 50 #    start_sector_lba  callrealmode_Data OFF_BUFFER_ADDR = 58 #    buff_addr  callrealmode_Data OFF_SECTORS_COUNT = 62 #    sectors_count  callrealmode_Data OFF_DISK_NUMBER = 66 #    disk_number  callrealmode_Data OFF_RETURN_CODE = 68 #    ret_code  callrealmode_Data push %bp mov %sp,%bp #     DAP pushl OFF_START_SECTOR+4(%bp) pushl OFF_START_SECTOR+0(%bp) pushl OFF_BUFFER_ADDR(%bp) pushw OFF_SECTORS_COUNT(%bp) pushw $0x10 mov %sp,%si # ds:si    , ..  DAP mov OFF_DISK_NUMBER(%bp),%dl #    dl mov $0x42,%ah # EXTENDED READ int $0x13 # CALL DISK BIOS mov %ah,OFF_RETURN_CODE(%bp) #   add $0x10,%sp #    DAP pop %bp ret 


рд░реАрдбрдбрд┐рд╕реНрдХ рд▓реЗрдмрд▓ рдЙрд╕ рдХреЛрдб рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ callrealmode_Data рд╕рдВрд░рдЪрдирд╛ рд╕реЗ DAP рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ int0x13 рдХрд╣рддрд╛ рд╣реИред рдХреЛрдб рдореЗрдВ, рд▓реЗрдмрд▓ callrealmode_switch рдХреЗ рдмрд╛рдж, 2 рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдХреНрдпрд╛ рд░реАрдбрдбрд┐рд╕реНрдХ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

6. MBR рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд╛ рд╡рд╛рд▓реЗ рдПрдХ \ mbr.h рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝реЗрдВред рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА:

 #ifndef _MBR_H_ #define _MBR_H_ #include "types.h" struct MBRPartitionEntry { unsigned char boot_indicator; unsigned char start_head; unsigned short start_sector : 6; unsigned short start_cylinder : 10; unsigned char sys_id; unsigned char end_head; unsigned short end_sector : 6; unsigned short end_cylinder : 10; unsigned int start_lva; unsigned int size_in_sectors; } __attribute__ ((packed)); typedef struct MBRPartitionEntry MBRPartitionEntry_t; struct MBRSector { u8 code[446]; MBRPartitionEntry_t part[4]; u8 mbr_sign[2]; } __attribute__ ((packed)); typedef struct MBRSector MBRSector_t; 


MBRSector рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ InitBootMedia рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЪрд░рдг 3. fat_io_lib рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЪрд▓рд╛рдПрдВ



1. fat_io_lib.zip рд╕рдВрдЧреНрд░рд╣ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░реВрдЯ рдореЗрдВ fat_io_lib рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЗрд╕реЗ рдЕрдирдЬрд╝рд┐рдк рдХрд░реЗрдВред
2. рдлреЛрд▓реНрдбрд░ рдореЗрдВ рдЦрд╛рд▓реА рдлрд╛рдЗрд▓ assert.h рдФрд░ stdlib.h рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВред рдЙрдиреНрд╣реЗрдВ рд╕рдВрдХрд▓рди рдХреЗ рд▓рд┐рдП рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
3. Makefile рдХреЛ рдареАрдХ рдХрд░реЗрдВред рд╕рдВрдХрд▓рди рдХреЗ рд▓рд┐рдП рд▓рдХреНрд╖реНрдпреЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдлрд╛рдЗрд▓реЗрдВ рдЬреЛрдбрд╝реЗрдВред рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд┐рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП:

 FAT_LIB_OBJFILES = \ ./fat_io_lib/fat_access.o \ ./fat_io_lib/fat_cache.o \ ./fat_io_lib/fat_filelib.o \ ./fat_io_lib/fat_format.o \ ./fat_io_lib/fat_misc.o \ ./fat_io_lib/fat_string.o \ ./fat_io_lib/fat_table.o \ ./fat_io_lib/fat_write.o OBJFILES = \ loader.o \ common/printf.o \ common/screen.o \ common/string.o \ kernel.o \ callrealmode.o \ callrealmode_asm.o \ descriptor.o \ $(FAT_LIB_OBJFILES) 


рд▓рд╛рдЗрди рдмрджрд▓реЗрдВ
 @dd if=/dev/zero of=./hdd.img bs=512 count=16065 1>/dev/null 2>&1 

рдкрд░
 @dd if=/dev/zero of=./hdd.img bs=1M count=10 1>/dev/null 2>&1 


рдЕрдм рдЫрд╡рд┐ рдХрд╛ рдЖрдХрд╛рд░ 10Mb рд╣реИред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдХрд┐ mkdosfs рдХрдорд╛рдВрдб FAT12 рдХреЗ рдмрдЬрд╛рдп FAT16 рдореЗрдВ рд╡рд┐рднрд╛рдЬрди рдХреЛ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рддрд╛ рд╣реИред FAT12 рдХреЛ fat_io_lib рд▓рд╛рдЗрдмреНрд░реЗрд░реА рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рд▓рд╛рдЗрди рдмрджрд▓реЗрдВ

 $(CC) -Iinclude $(CFLAGS) -o $@ -c $< 


рдкрд░

 $(CC) -Iinclude -DFAT_PRINTF_NOINC_STDIO $(CFLAGS) -o $@ -c $< 


рдЗрд╕ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЗ рд╕рд╛рде, рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ stdio.h рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдкреНрд░рд┐рдВрдЯрдл рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛, рдЬреЛ рдХрд┐ рд╣рдорд╛рд░реЗ рдЬреИрд╕рд╛ рд╣реА рд╣реИ, рдФрд░ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рд╛рдЧреВ рд╣реИред

4. рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг

 make rebuild 

рд╕реБрдбреЛрд▓ рдЫрд╡рд┐ рдмрдирд╛рддреЗ рд╣реИрдВ

5. рднрд╛рдЧреЛ

 sudo qemu-system-i386 -hda hdd.img 


рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд┐рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП:



рдкрд┐рдЫрд▓реЗ рднрд╛рдЧреЛрдВ рдХреА рддрд░рд╣, рдЖрдк USB рдлреНрд▓реИрд╢ рдбреНрд░рд╛рдЗрд╡ рдкрд░ hdd.img рдЫрд╡рд┐ рдХрд╛ dd рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕рдореЗрдВ рд╕реЗ рдмреВрдЯ рдХрд░рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкрд░ рдХреЛрдб рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдордиреЗ FAT16 рдФрд░ FAT32 рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред рд╣рдордиреЗ рд░реЗрдбреА-рдореЗрдб рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдереЛрдбрд╝рд╛ рдзреЛрдЦрд╛ рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП FAT рдбрд┐рд╡рд╛рдЗрд╕ рдХрдо рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛, рдФрд░ рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реЛрдЧреА рдХрд┐ рд╣рдо 1 рд▓реЗрдЦ рдореЗрдВ рдлрд┐рдЯ рд╣реЛрдВрдЧреЗред рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдпрд╣ рдкрдврд╝рдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд▓рдЧрд╛ рд╣реЛрдЧрд╛ред рдпрджрд┐ рдЖрдкрдХреЛ рдЪрд░рдгреЛрдВ рд╕реЗ рдЧреБрдЬрд░рдиреЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рддреЛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд▓рд┐рдЦреЗрдВ!

рдкрд┐рдЫрд▓реЗ рднрд╛рдЧреЛрдВ рдХреЗ рд▓рд┐рдВрдХ рдХрд╛ рдЪрдпрди:

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


All Articles