рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдмреВрдЯред рднрд╛рдЧ 1

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

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

рдореБрдЭреЗ рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ рдХрд┐ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдЪреАрдЬреЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ: рдореЗрд░реЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреИрд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВ, рд╡реЗ рдореЗрдореЛрд░реА рдореЗрдВ рдХреИрд╕реЗ рд╕реНрдерд┐рдд рд╣реИрдВ, рдХрд░реНрдиреЗрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдФрд░ рдореЗрдореЛрд░реА рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХреИрд╕реЗ рдХрд░рддрд╛ рд╣реИ, рдиреЗрдЯрд╡рд░реНрдХ рд╕реНрдЯреИрдХ рдирд┐рдореНрди рд╕реНрддрд░ рдкрд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдмрд╣реБрдд рдХреБрдЫред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ x86_64 рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ рдФрд░ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред

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

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

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдФрд░ рдЬреНрдЮрд╛рди рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рд╣реИред

рдЖрд╡рд╢реНрдпрдХ рдЬреНрдЮрд╛рди

  • рд╕реА рдХреЛрдб рдХреЛ рд╕рдордЭрдирд╛
  • рдЕрд╕реЗрдВрдмрд▓рд░ рдХреЛрдб (рдПрдЯреА рдПрдВрдб рдЯреА рд╕рд┐рдВрдЯреИрдХреНрд╕) рдХреЛ рд╕рдордЭрдирд╛

рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрджрд┐ рдЖрдк рдРрд╕реЗ рдЙрдкрдХрд░рдг рд╕реАрдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдЗрд╕ рдФрд░ рдмрд╛рдж рдХреЗ рд▓реЗрдЦреЛрдВ рдореЗрдВ рдХреБрдЫ рд╕рдордЭрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред рдареАрдХ рд╣реИ, рдкрд░рд┐рдЪрдп рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде, рдпрд╣ рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдФрд░ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдЪреАрдЬреЛрдВ рдореЗрдВ рдЧреЛрддрд╛ рд▓рдЧрд╛рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред

рдореИрдВрдиреЗ рд▓рд┐рдирдХреНрд╕ 3.18 рдХрд░реНрдиреЗрд▓ рдХреЗ рджрд┐рдиреЛрдВ рдореЗрдВ рдЗрд╕ рдкреБрд╕реНрддрдХ рдХреЛ рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдерд╛ рдФрд░ рддрдм рд╕реЗ рдмрд╣реБрдд рдХреБрдЫ рдмрджрд▓ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИрдВ, рддреЛ рдореИрдВ рддрджрдиреБрд╕рд╛рд░ рд▓реЗрдЦреЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реВрдВрдЧрд╛ред

рдореИрдЬрд┐рдХ рдкрд╛рд╡рд░ рдмрдЯрди, рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реИ?


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

рдкреНрд░реЛрд╕реЗрд╕рд░ 80386 рдФрд░ рдмрд╛рдж рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рд░рд┐рдмреВрдЯ рдХреЗ рдмрд╛рдж рд╕реАрдкреАрдпреВ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд╛рди рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП:

  рдЖрдИрдкреА тАЛтАЛ0xfff0
 рд╕реАрдПрд╕ рдЪрдпрдирдХрд░реНрддрд╛ 0xf000
 рд╕реАрдПрд╕ рдмреЗрд╕ 0xffff0000 

рдкреНрд░реЛрд╕реЗрд╕рд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореЛрдб рдореЗрдВ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИ ред рдЖрдЗрдП рдереЛрдбрд╝рд╛ рдкреАрдЫреЗ рдЬрд╛рдПрдВ рдФрд░ рдЗрд╕ рдореЛрдб рдореЗрдВ рдореЗрдореЛрд░реА рд╕реЗрдЧрдореЗрдВрдЯреЗрд╢рди рдХреЛ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореЛрдб рд╕рднреА x86- рд╕рдВрдЧрдд рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рд╕рдорд░реНрдерд┐рдд рд╣реИ: 8086 рд╕реЗ рдЖрдзреБрдирд┐рдХ 64-рдмрд┐рдЯ рдЗрдВрдЯреЗрд▓ рдкреНрд░реЛрд╕реЗрд╕рд░ рддрдХред 8086 рдкреНрд░реЛрд╕реЗрд╕рд░ 20-рдмрд┐рдЯ рдПрдбреНрд░реЗрд╕ рдмрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рдпрд╣ 0-0xFFFFF рдпрд╛ 1 рдПрдбреНрд░реЗрд╕ рд╕реНрдкреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдХреЗрд╡рд▓ 16-рдмрд┐рдЯ рд░рдЬрд┐рд╕реНрдЯрд░ рд╣реИ рдЬрд┐рд╕рдореЗрдВ 2^16-1 рдпрд╛ 0xffff (64 рдХрд┐рд▓реЛрдмрд╛рдЗрдЯ) рдХрд╛ рдЕрдзрд┐рдХрддрдо рдкрддрд╛ рд╣реИред

рд╕рдВрдкреВрд░реНрдг рдЙрдкрд▓рдмреНрдз рдкрддрд╛ рд╕реНрдерд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рд╕реЗрдЧрдореЗрдВрдЯреЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╕рднреА рдореЗрдореЛрд░реА рдХреЛ 65536 рдмрд╛рдЗрдЯреНрд╕ (64 KB) рдХреЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЖрдХрд╛рд░ рдХреЗ рдЫреЛрдЯреЗ рд╕реЗрдЧрдореЗрдВрдЯ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЪреВрдВрдХрд┐ 16-рдмрд┐рдЯ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЗ рд╕рд╛рде рд╣рдо 64 рдХреЗрдмреА рд╕реЗ рдКрдкрд░ рдореЗрдореЛрд░реА рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рддрд░реАрдХрд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдкрддреЗ рдореЗрдВ рджреЛ рднрд╛рдЧ рд╣реЛрддреЗ рд╣реИрдВ: 1) рдПрдХ рдЖрдзрд╛рд░ рдкрддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдЦрдВрдб рдЪрдпрдирдХрд░реНрддрд╛; 2) рдЖрдзрд╛рд░ рдкрддреЗ рд╕реЗ рдСрдлрд╕реЗрдЯред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореЛрдб рдореЗрдВ, рдЦрдВрдб * 16 рдЖрдзрд╛рд░ рдкрддрд╛ * 16 ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕реНрдореГрддрд┐ рдореЗрдВ рднреМрддрд┐рдХ рдкрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЦрдВрдб рдЪрдпрдирдХрд░реНрддрд╛ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ 16 рд╕реЗ рдЧреБрдгрд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЙрд╕рдореЗрдВ рдСрдлрд╕реЗрдЯ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:

   =   * 16 +  

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ CS:IP рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд╛ рдорд╛рди 0x2000:0x0010 , рддреЛ рд╕рдВрдмрдВрдзрд┐рдд рднреМрддрд┐рдХ рдкрддрд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛:

 >>> hex((0x2000 << 4) + 0x0010) '0x20010' 

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рд╕реЗрдЧрдореЗрдВрдЯ рдХреЗ рдЪрдпрдирдХрд░реНрддрд╛ рдФрд░ рдСрдлрд╕реЗрдЯ 0xffff:0xffff , рддреЛ рдЖрдкрдХреЛ рдкрддрд╛ рдорд┐рд▓рддрд╛ рд╣реИ:

 >>> hex((0xffff << 4) + 0xffff) '0x10ffef' 

рдпрд╣, рдкрд╣рд▓реА рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рдХреЗ рдмрд╛рдж 65520 рдмрд╛рдЗрдЯреНрд╕ рд╣реИред рдЪреВрдБрдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореЛрдб рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рдЙрдкрд▓рдмреНрдз рд╣реИ, 0x10ffef A20 рд▓рд╛рдЗрди рдЕрдХреНрд╖рдо рдХреЗ рд╕рд╛рде 0x10ffef рдмрди рдЬрд╛рддрд╛ рд╣реИред

рдареАрдХ рд╣реИ, рдЕрдм рд╣рдо рдЗрд╕ рдореЛрдб рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореЛрдб рдФрд░ рдореЗрдореЛрд░реА рдПрдбреНрд░реЗрд╕рд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЬрд╛рдирддреЗ рд╣реИрдВред рд░реАрд╕реЗрдЯ рдХреЗ рдмрд╛рдж рд░рдЬрд┐рд╕реНрдЯрд░ рдорд╛рдиреЛрдВ рдХреА рдЪрд░реНрдЪрд╛ рдкрд░ рд▓реМрдЯрддреЗ рд╣реИрдВред

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

рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкрддрд╛ рдИрдЖрдИрдкреА рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдореВрд▓реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрддреЗ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 >>> 0xffff0000 + 0xfff0 '0xfffffff0' 

рд╣рдореЗрдВ 0xfffffff0 рдорд┐рд▓рддрд╛ рд╣реИ, рдЬреЛ 4 рдЬреАрдмреА рд╕реЗ рдиреАрдЪреЗ 16 рдмрд╛рдЗрдЯреНрд╕ рд╣реИред рдЗрд╕ рдмрд┐рдВрджреБ рдХреЛ рд░реАрд╕реЗрдЯ рд╡реЗрдХреНрдЯрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ ред рдпрд╣ рд╕реНрдореГрддрд┐ рдореЗрдВ рд╡рд╣ рд╕реНрдерд╛рди рд╣реИ рдЬрд╣рд╛рдВ CPU рд░реАрд╕реЗрдЯ рдХреЗ рдмрд╛рдж рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рдирд┐рд░реНрджреЗрд╢ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ: рдПрдХ рдЬрдВрдк рдСрдкрд░реЗрд╢рди ( jmp ), рдЬреЛ рдЖрдорддреМрд░ рдкрд░ BIOS рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдХреЛрд░рдмреВрдЯ ( src/cpu/x86/16bit/reset16.inc ) рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ:

  .section ".reset", "ax", %progbits .code16 .globl _start _start: .byte 0xe9 .int _start16bit - ( . + 2 ) ... 

рдпрд╣рд╛рдБ рд╣рдо рдСрдкрд░реЗрд╢рди рдХреЛрдб ( opcode ) jmp , рдЬрд┐рд╕рдХрд╛ рдирд╛рдо 0xe9 , рдФрд░ рдЧрдВрддрд╡реНрдп рдкрддрд╛ _start16bit - ( . + 2) ред

рд╣рдо рдпрд╣ рднреА рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ reset рдЦрдВрдб 16 рдмрд╛рдЗрдЯреНрд╕ рд╣реИ, рдФрд░ рдпрд╣ 0xfffff0 ( src/cpu/x86/16bit/reset16.ld ) рдкрддреЗ рд╕реЗ рдЪрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ:

 SECTIONS { /* Trigger an error if I have an unuseable start address */ _bogus = ASSERT(_start16bit >= 0xffff0000, "_start16bit too low. Please report."); _ROMTOP = 0xfffffff0; . = _ROMTOP; .reset . : { *(.reset); . = 15; BYTE(0x00); } } 

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

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

 ; ; :       Intel x86 ; [BITS 16] boot: mov al, '!' mov ah, 0x0e mov bh, 0x00 mov bl, 0x07 int 0x10 jmp $ times 510-($-$$) db 0 db 0x55 db 0xaa 

рд╣рдо рдЗрдХрдЯреНрдард╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЪрд▓рд╛рддреЗ рд╣реИрдВ:

nasm -f bin boot.nasm && qemu-system-x86_64 boot

QEMU boot рдмрд╛рдЗрдирд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдорд╛рдВрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдмрд╕ рдбрд┐рд╕реНрдХ рдЫрд╡рд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдерд╛ред рдЪреВрдВрдХрд┐ рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдКрдкрд░ рдЙрддреНрдкрдиреНрди рдмреВрдЯ рд╕реЗрдХреНрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ ( 0x7c00 рдкрд░ рд╢реБрд░реВ 0x7c00 рдФрд░ рдПрдХ рдЬрд╛рджреВ рдЕрдиреБрдХреНрд░рдо рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ), 0x7c00 рдмрд╛рдЗрдирд░реА рдХреЛ рдбрд┐рд╕реНрдХ рдЫрд╡рд┐ рдХреЗ рдорд╛рд╕реНрдЯрд░ рдмреВрдЯ рд░рд┐рдХреЙрд░реНрдб (рдПрдордмреАрдЖрд░) рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдЧрд╛ред

рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ:



рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдб 16-рдмрд┐рдЯ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореЛрдб рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИ рдФрд░ рд╕реНрдореГрддрд┐ рдореЗрдВ 0x7c00 рдкрддреЗ рдкрд░ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ 0x10 рдЕрд╡рд░реЛрдз рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ, рдЬреЛ рдмрд╕ рдПрдХ рдЪрд░рд┐рддреНрд░ рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ ! ; рд╢реЗрд╖ 510 рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рд╢реВрдиреНрдп рд╕реЗ рднрд░рддрд╛ рд╣реИ рдФрд░ рджреЛ рдореИрдЬрд┐рдХ рдмрд╛рдЗрдЯреНрд╕ 0xaa рдФрд░ 0x55 рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред

рдЖрдк рдмрд╛рдЗрдирд░реА рдбрдВрдк рдХреЛ objdump рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗ рд╕рд╛рде рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:

nasm -f bin boot.nasm
objdump -D -b binary -mi386 -Maddr16,data16,intel boot


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

рдиреЛрдЯ : рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕реАрдкреАрдпреВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореЛрдб рдореЗрдВ рд╣реИ; рд╕реНрдореГрддрд┐ рдореЗрдВ рднреМрддрд┐рдХ рдкрддреЗ рдХреА рдЧрдгрдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

   =   * 16 +  

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ 16-рдмрд┐рдЯ рд╕рд╛рдорд╛рдиреНрдп-рдЙрджреНрджреЗрд╢реНрдп рд░рдЬрд┐рд╕реНрдЯрд░ рд╣реИрдВ, рдФрд░ 16-рдмрд┐рдЯ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд╛ рдЕрдзрд┐рдХрддрдо рдореВрд▓реНрдп 0xffff , рдЗрд╕рд▓рд┐рдП рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рдореВрд▓реНрдпреЛрдВ рдкрд░ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдЧрд╛:

 >>> hex((0xffff * 16) + 0xffff) '0x10ffef' 

рдЬрд╣рд╛рдБ 0x10ffef 1 + 64 - 16 ред 8086 рдкреНрд░реЛрд╕реЗрд╕рд░ (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореЛрдб рд╡рд╛рд▓рд╛ рдкрд╣рд▓рд╛ рдкреНрд░реЛрд╕реЗрд╕рд░) рдореЗрдВ 20-рдмрд┐рдЯ рдПрдбреНрд░реЗрд╕ рд▓рд╛рдЗрди рд╣реЛрддреА рд╣реИред 2^20 = 1048576 рдмрд╛рдж рд╕реЗ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрд▓рдмреНрдз рдореЗрдореЛрд░реА 1 рдПрдордмреА рд╣реИред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╡рд╛рд╕реНрддрд╡рд┐рдХ-рдореЛрдб рдореЗрдореЛрд░реА рдПрдбреНрд░реЗрд╕рд┐рдВрдЧ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

  0x00000000 - 0x000003FF - рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореЛрдб рдХреЗ рдмрд╛рдзрд┐рдд рд╡реИрдХреНрдЯрд░ рдХреА рддрд╛рд▓рд┐рдХрд╛
 0x00000400 - 0x000004FF - BIOS рдбреЗрдЯрд╛ рдХреНрд╖реЗрддреНрд░
 0x00000500 - 0x00007BFF - рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛
 0x00007C00 - 0x00007DFF - рд╣рдорд╛рд░рд╛ рдмреВрдЯрд▓реЛрдбрд░
 0x00007E00 - 0x0009FFFF - рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛
 0x000A0000 - 0x000BFFFF - рд╡реАрдбрд┐рдпреЛ рд░реИрдо (VRAM) 
 0x000B0000 - 0x000B7777 - рдореЛрдиреЛрдХреНрд░реЛрдо рд╡реАрдбрд┐рдпреЛ рдореЗрдореЛрд░реА
 0x000B8000 - 0x000BFFFF - рд░рдВрдЧ рдореЛрдб рд╡реАрдбрд┐рдпреЛ рдореЗрдореЛрд░реА
 0x000C0000 - 0x000C7FFF - рд╡реАрдбрд┐рдпреЛ ROM BIOS
 0x000C8000 - 0x000EFFFF - рдЫрд╛рдпрд╛ рдХреНрд╖реЗрддреНрд░ (BIOS рдЫрд╛рдпрд╛)
 0x000F0000 - 0x000FFFFF - рд╕рд┐рд╕реНрдЯрдо BIOS 

рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓рд╛ рдирд┐рд░реНрджреЗрд╢ 0xFFFFFFF0 рдкрд░ рд╕реНрдерд┐рдд 0xFFFFFFF0 , рдЬреЛ 0xFFFFF (1 MB) рд╕реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореЛрдб рдореЗрдВ рд╕реАрдкреАрдпреВ рдЗрд╕ рдкрддреЗ рддрдХ рдХреИрд╕реЗ рдкрд╣реБрдВрдЪ рд╕рдХрддрд╛ рд╣реИ? рдХреЛрд░рдмреВрдЯ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдЙрддреНрддрд░:

0xFFFE_0000 - 0xFFFF_FFFF: 128 ROM

рдирд┐рд╖реНрдкрд╛рджрди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, BIOS рд░реИрдо рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд░реЛрдо рдореЗрдВ рд╣реИред

рд▓реЛрдбрд░


рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдХреЛ рдЕрд▓рдЧ рдмреВрдЯ рд▓реЛрдбрд░ рдХреЗ рд╕рд╛рде рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ GRUB 2 рдФрд░ syslinux ред рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдПрдХ рдмреВрдЯ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╣реИ рдЬреЛ рд▓рд┐рдирдХреНрд╕ рд╕рдорд░реНрдерди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреВрдЯрд▓реЛрдбрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо GRUB 2 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред

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

grub_main рдлрд╝рдВрдХреНрд╢рди рдХрдВрд╕реЛрд▓ рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░рддрд╛ рд╣реИ, рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдЖрдзрд╛рд░ рдкрддрд╛ рджреЗрддрд╛ рд╣реИ, рд░реВрдЯ рдбрд┐рд╡рд╛рдЗрд╕ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдЧреНрд░рдм рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреЛ рд▓реЛрдб / рдкрд╛рд░реНрд╕ рдХрд░рддрд╛ рд╣реИ, рдореЙрдбреНрдпреВрд▓ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ, рдЖрджрд┐ред рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдЕрдВрдд рдореЗрдВ, рдпрд╣ рдЧреНрд░рдм рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдореЛрдб рдореЗрдВ рдбрд╛рд▓рддрд╛ рд╣реИред grub_normal_execute рдлрд╝рдВрдХреНрд╢рди ( grub-core/normal/main.c рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓ рд╕реЗ) рдЕрдВрддрд┐рдо рддреИрдпрд╛рд░реА рдкреВрд░реА рдХрд░рддрд╛ рд╣реИ рдФрд░ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдореЗрдиреВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЬрдм рд╣рдо рдХрд┐рд╕реА рдЧреНрд░рдм рдореЗрдиреВ рдЖрдЗрдЯрдо рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ grub_menu_execute_entry рдлрд╝рдВрдХреНрд╢рди grub_menu_execute_entry , рдЬреЛ рдЧреНрд░рдм boot рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЪрдпрдирд┐рдд рдУрдПрд╕ рдХреЛ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдХрд░реНрдиреЗрд▓ рдмреВрдЯ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореЗрдВ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдмреВрдЯ рд▓реЛрдбрд░ рдХреЛ рдХрд░реНрдиреЗрд▓ рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рд╣реЗрдбрд░ рдХреЗ рдХреБрдЫ рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЛ рдкрдврд╝рдирд╛ рдФрд░ рднрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдХрд┐ рдХрд░реНрдиреЗрд▓ рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдХреЛрдб рд╕реЗ рдСрдлрд╕реЗрдЯ 0x01f1 рдкрд░ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдСрдлрд╕реЗрдЯ рд▓рд┐рдВрдХрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдХрд░реНрдиреЗрд▓ рд╣реЗрдбрд░ рдЖрд░реНрдХ / x86 / рдмреВрдЯ / рд╣реЗрдбрд░ред рдЗрд╕рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ:

  .globl hdr hdr: setup_sects: .byte 0 root_flags: .word ROOT_RDONLY syssize: .long 0 ram_size: .word 0 vid_mode: .word SVGA_MODE root_dev: .word 0 boot_flag: .word 0xAA55 

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

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

  |  рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░реНрдиреЗрд▓ рдореЛрдб |
 100000 + ------------------------ +
          |  I / O рдореИрдкрд┐рдВрдЧ |
 0A0000 + ------------------------ +
          |  рдЖрд░рдХреНрд╖рд┐рддред  BIOS рдХреЗ рд▓рд┐рдП |  рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдореБрдХреНрдд рдЫреЛрдбрд╝ рджреЗрдВ
          ~ ~
          |  рдХрдорд╛рдВрдб рд▓рд╛рдЗрди |  (X + 10000 рд╕реЗ рдиреАрдЪреЗ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ)
 X + 10000 + ------------------------ +
          |  рдвреЗрд░ / рдвреЗрд░ |  рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд░реНрдиреЗрд▓ рдореЛрдб рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
 X + 08000 + ------------------------ +
          |  рдХрд░реНрдиреЗрд▓ рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди |  рдХрд░реНрдиреЗрд▓ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореЛрдб рдХреЛрдб
          |  рдХрд░реНрдиреЗрд▓ рдмреВрдЯ рд╕реЗрдХреНрдЯрд░ |  рд╡рд┐рд░рд╛рд╕рдд рдХрд░реНрдиреЗрд▓ рдмреВрдЯ рдХреНрд╖реЗрддреНрд░
        рдПрдХреНрд╕ + ------------------------ +
          |  рд▓реЛрдбрд░ |  <- рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ 0x7C00 рдмреВрдЯ рд╕реЗрдХреНрдЯрд░
 001000 + ------------------------ +
          |  рдЖрд░рдХреНрд╖рд┐рддред  MBR / BIOS рдХреЗ рд▓рд┐рдП |
 000800 + ------------------------ +
          |  рдЖрдорддреМрд░ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ  рдПрдордмреАрдЖрд░ |
 000600 + ------------------------ +
          |  рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВред  рдХреЗрд╡рд▓ BIOS |
 000000 + ------------------------ +

рдЗрд╕рд▓рд┐рдП, рдЬрдм рд▓реЛрдбрд░ рдХрд░реНрдиреЗрд▓ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдкрддреЗ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ:

 X + sizeof (KernelBootSector) + 1 

рдЬрд╣рд╛рдВ X рдХрд░реНрдиреЗрд▓ рдмреВрдЯ рд╕реЗрдХреНрдЯрд░ рдХрд╛ рдкрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, X 0x10000 , рдЬреИрд╕рд╛ рдХрд┐ рдореЗрдореЛрд░реА рдбрдВрдк рдореЗрдВ рджреЗрдЦрд╛ рдЧрдпрд╛ рд╣реИ:



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

рдХрд░реНрдиреЗрд▓ рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдЪрд░рдг рдХреА рд╢реБрд░реБрдЖрдд


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

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

qemu-system-x86_64 vmlinuz-3.18-generic

рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ:



рджрд░рдЕрд╕рд▓, header.S рдлрд╝рд╛рдЗрд▓ рдореИрдЬрд┐рдХ рдирдВрдмрд░ MZ (рдКрдкрд░ рдбрдВрдк рдХрд╛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рджреЗрдЦреЗрдВ) рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ, рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдФрд░ рдкреАрдИ рд╣реЗрдбрд░ рдХрд╛ рдкрд╛рда:

 #ifdef CONFIG_EFI_STUB # "MZ", MS-DOS header .byte 0x4d .byte 0x5a #endif ... ... ... pe_header: .ascii "PE" .word 0 

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

рдХрд░реНрдиреЗрд▓ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ:

 // header.S line 292 .globl _start _start: 

рдмреВрдЯрд▓реЛрдбрд░ (grub2 рдФрд░ рдЕрдиреНрдп) рдЗрд╕ рдмрд┐рдВрджреБ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддрд╛ рд╣реИ ( MZ рд╕реЗ рдСрдлрд╕реЗрдЯ 0x200 ) рдФрд░ рд╕реАрдзреЗ рдЙрд╕рдХреЗ рдкрд╛рд╕ рдЬрд╛рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ header.S .bstext рдЕрдиреБрднрд╛рдЧ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХрд╛ рдкрд╛рда рд╕реНрдерд┐рдд рд╣реИред

 // // arch/x86/boot/setup.ld // . = 0; // current position .bstext : { *(.bstext) } // put .bstext section to position 0 .bsdata : { *(.bsdata) } 

рдХрд░реНрдиреЗрд▓ рд╕реНрдерд╛рдкрдирд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ:

  .globl _start _start: .byte 0xeb .byte start_of_setup-1f 1: // // rest of the header // 

рдпрд╣рд╛рдВ рд╣рдо рдСрдкрд░реЗрд╢рди рдХреЛрдб jmp ( 0xeb ) рджреЗрдЦрддреЗ рд╣реИрдВ, рдЬреЛ рдмрд┐рдВрджреБ start_of_setup-1f ред Nf рд╕рдВрдХреЗрддрди рдореЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 2f рд╕реНрдерд╛рдиреАрдп рд▓реЗрдмрд▓ 2: рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ 2: рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд▓реЗрдмрд▓ 1 , рдЬреЛ рд╕рдВрдХреНрд░рдордг рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдореМрдЬреВрдж рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рдмрд╛рдХреА рд╕реЗрдЯрдЕрдк рд╣реЗрдбрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рд╕реНрдерд╛рдкрдирд╛ рд╢реАрд░реНрд╖ рд▓реЗрдЦ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж, рд╣рдо .entrytext рдЕрдиреБрднрд╛рдЧ рджреЗрдЦрддреЗ рд╣реИрдВ, рдЬреЛ start_of_setup рд▓реЗрдмрд▓ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдкрд╣рд▓рд╛ рдХреЛрдб рд╣реИ (рдкрд┐рдЫрд▓реЗ рдХреВрдж рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ)ред рдХрд░реНрдиреЗрд▓ рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдХреЗ рднрд╛рдЧ рдХреЗ рдмрд╛рдж рд▓реЛрдбрд░ рд╕реЗ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдкрд╣рд▓рд╛ jmp рдирд┐рд░реНрджреЗрд╢ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд░реНрдиреЗрд▓ рдореЛрдб рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ 0x200 рдкрд░ рдСрдлрд╕реЗрдЯ 0x200 рд╣реИ, рдЕрд░реНрдерд╛рдд рдкрд╣рд▓реЗ 512 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдмрд╛рджред рдпрд╣ рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдмреВрдЯ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдФрд░ grub2 рд╕реНрд░реЛрдд рдХреЛрдб рджреЛрдиреЛрдВ рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 segment = grub_linux_real_target >> 4; state.gs = state.fs = state.es = state.ds = state.ss = segment; state.cs = segment + 0x20; 

рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкрддрд╛ 0x10000 рдкрд░ рдХрд░реНрдиреЗрд▓ рдмреВрдЯ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХрд░реНрдиреЗрд▓ рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╕реЗрдЧрдореЗрдВрдЯ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд╛рди рд╣реЛрдВрдЧреЗ:

gs = fs = es = ds = ss = 0x10000
cs = 0x10200


start_of_setup рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж start_of_setup рдХрд░реНрдиреЗрд▓ рдХреЛ рдирд┐рдореНрди рдХрд╛рд░реНрдп рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

  • рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╕рднреА рдЦрдВрдб рд░рдЬрд┐рд╕реНрдЯрд░ рдореВрд▓реНрдп рд╕рдорд╛рди рд╣реИрдВ
  • рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рд╕рд╣реА рд╕реНрдЯреИрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ
  • Bss рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ
  • рдЖрд░реНрдХ / x86 / рдмреВрдЯ / main.c рдореЗрдВ C рдХреЛрдб рдкрд░ рдЬрд╛рдПрдВ

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЦрдВрдб рдХреЗрд╕ рд╕рдВрд░реЗрдЦрдг


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

  movw %ds, %ax movw %ax, %es cld 

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд▓рд┐рдЦрд╛ рдерд╛, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЧреНрд░рдм 2 рдХрд░реНрдиреЗрд▓ рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдХреЛрдб рдХреЛ 0x10000 рдкрд░ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ, рдФрд░ 0x10200 рдкрд░ 0x10200 , рдХреНрдпреЛрдВрдХрд┐ рдирд┐рд╖реНрдкрд╛рджрди рдлрд╝рд╛рдЗрд▓ рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рд╕рдВрдХреНрд░рдордг рд╕реЗ:

 _start: .byte 0xeb .byte start_of_setup-1f 

рдпрд╣ 4d 5a рд╕реЗ 512 рдмрд╛рдЗрдЯ рдСрдлрд╕реЗрдЯ рд╣реИред рдЕрдиреНрдп рд╕рднреА рд╕реЗрдЧрдореЗрдВрдЯ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреА рддрд░рд╣ 0x10200 рд╕реЗ 0x10000 рддрдХ cs рдХреЛ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░рдирд╛ рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж рд╕реНрдЯреИрдХ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:

  pushw %ds pushw $6f lretw 

рдпрд╣ рдирд┐рд░реНрджреЗрд╢ рд╕реНрдЯреИрдХ рдкрд░ ds рдорд╛рди рдХреЛ рдзрдХреЗрд▓рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рдж рд▓реЗрдмрд▓ 6 рдХрд╛ рдкрддрд╛ рдФрд░ lretw рдирд┐рд░реНрджреЗрд╢ рд╣реИ, рдЬреЛ рд▓реЗрдмрд▓ 6 рдХреЗ рдкрддреЗ рдХреЛ рдХрдорд╛рдВрдб рдХрд╛рдЙрдВрдЯрд░ рдХреЗ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ рдорд╛рди ds рд╕рд╛рде cs рд▓реЛрдб рдХрд░рддрд╛ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, ds рдФрд░ cs рдореЗрдВ рд╕рдорд╛рди рдорд╛рди рд╣реЛрдВрдЧреЗред

рд╕реНрдЯреИрдХ рд╕реЗрдЯрдЕрдк


рдЗрд╕ рдХреЛрдб рдХреЗ рд▓рдЧрднрдЧ рд╕рднреА рд╕реА рд╡рд╛рддрд╛рд╡рд░рдг рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореЛрдб рдореЗрдВ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдЕрдЧрд▓рд╛ рдЪрд░рдг ss рд░рдЬрд┐рд╕реНрдЯрд░ рдорд╛рди рдХреА рдЬрд╛рдБрдЪ рдХрд░рдирд╛ рдФрд░ ss рдорд╛рди рдЧрд▓рдд рд╣реЛрдиреЗ рдкрд░ рд╕рд╣реА рд╕реНрдЯреИрдХ рдмрдирд╛рдирд╛ рд╣реИ:

  movw %ss, %dx cmpw %ax, %dx movw %sp, %dx je 2f 

рдпрд╣ рддреАрди рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ:

  • ss рдорд╛рди 0x1000 ( cs рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдЕрдиреНрдп рд╕рднреА рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЗ рд╕рд╛рде)
  • ss рдЕрдорд╛рдиреНрдп рдорд╛рди рд╣реИ рдФрд░ CAN_USE_HEAP рдзреНрд╡рдЬ рд╕реЗрдЯ рд╣реИ (рдиреАрдЪреЗ рджреЗрдЦреЗрдВ)
  • ss рдЕрдорд╛рдиреНрдп рдорд╛рди рд╣реИ рдФрд░ CAN_USE_HEAP рдзреНрд╡рдЬ рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИ (рдиреАрдЪреЗ рджреЗрдЦреЗрдВ)

рдХреНрд░рдо рдореЗрдВ рд╕рднреА рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

  • ss рд╡реИрдз рдорд╛рди ( 0x1000 ) рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рд▓реЗрдмрд▓ 2 рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ:

 2: andw $~3, %dx jnz 3f movw $0xfffc, %dx 3: movw %ax, %ss movzwl %dx, %esp sti 

рдпрд╣рд╛рдВ рд╣рдордиреЗ dx рд░рдЬрд┐рд╕реНрдЯрд░ (рдЬрд┐рд╕рдореЗрдВ рдмреВрдЯрд▓реЛрдбрд░ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ sp рдорд╛рди рд╣реЛрддрд╛ рд╣реИ) рдХреЗ рд╕рдВрд░реЗрдЦрдг рдХреЛ 4 рдмрд╛рдЗрдЯреНрд╕ рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рд╢реВрдиреНрдп рдХреА рдЬрд╛рдВрдЪ рдХреА рд╣реИред рдпрджрд┐ рдпрд╣ рд╢реВрдиреНрдп рд╣реИ, рддреЛ рд╣рдо рдореВрд▓реНрдп 0xfffc dx ( 4 рдмрд╛рдЗрдЯ-рд╕рдВрд░реЗрдЦрд┐рдд рдкрддрд╛ 64 рдХреЗрдмреА рдХреЗ рдЕрдзрд┐рдХрддрдо рдЦрдВрдб рдЖрдХрд╛рд░ рд╕реЗ рдкрд╣рд▓реЗ) рдореЗрдВ 0xfffc ред рдпрджрд┐ рдпрд╣ рд╢реВрдиреНрдп рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдо рдмреВрдЯрд▓реЛрдбрд░ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ 0xf7f4 ) рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ sp рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред рдлрд┐рд░ рд╣рдордиреЗ ss рдореЗрдВ ax рдореВрд▓реНрдп рдбрд╛рд▓рд╛, рдЬреЛ рд╕рд╣реА рдЦрдВрдб рдкрддреЗ 0x1000 рдмрдЪрд╛рддрд╛ рд╣реИ рдФрд░ рд╕рд╣реА sp рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рд╣реА рд╕реНрдЯреИрдХ рд╣реИ:



  • рджреВрд╕рд░реЗ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ, ss != ds ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рд╣рдо dend (рдЗрдВрд╕реНрдЯрд╛рд▓реЗрд╢рди рдХреЛрдб рдХреЗ рдЕрдВрдд рдХрд╛ рдкрддрд╛) dx рдореЗрдВ loadflags рдФрд░ рд╣реЗрдбрд░ рдлреАрд▓реНрдб loadflags рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ, рдЕрдЧрд░ testb рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╣ testb рд▓рд┐рдП testb рдЕрдиреБрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдПред рд▓реЛрдбрдлреНрд▓реИрдЧ рдПрдХ рдмрд┐рдЯрдорд╛рд╕реНрдХ рд╣реЗрдбрд░ рд╣реИ рдЬрд┐рд╕реЗ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 #define LOADED_HIGH (1<<0) #define QUIET_FLAG (1<<5) #define KEEP_SEGMENTS (1<<6) #define CAN_USE_HEAP (1<<7) 

рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдмреВрдЯ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореЗрдВ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

: loadflags

.

7 (): CAN_USE_HEAP
1, ,
heap_end_ptr . ,
.


рдпрджрд┐ CAN_USE_HEAP рдмрд┐рдЯ CAN_USE_HEAP , рддреЛ dx рд╣рдо рдорд╛рди heap_end_ptr (рдЬреЛ рдХрд┐ _end рдХреЛ _end ) рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕рдореЗрдВ STACK_SIZE рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ (рдиреНрдпреВрдирддрдо рд╕реНрдЯреИрдХ рдЖрдХрд╛рд░ 1024 рдмрд╛рдЗрдЯреНрд╕ рд╣реИ)ред рдЙрд╕рдХреЗ рдмрд╛рдж, рд▓реЗрдмрд▓ 2 (рдкрд┐рдЫрд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ) рдФрд░ рд╕рд╣реА рд╕реНрдЯреИрдХ рдмрдирд╛рдПрдВред



  • рдпрджрд┐ CAN_USE_HEAP рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ рдмрд╕ _end рд╕реЗ _end + STACK_SIZE рддрдХ рдиреНрдпреВрдирддрдо рд╕реНрдЯреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:



рдмреАрдПрд╕рдПрд╕ рд╕реЗрдЯрдЕрдк


рдореБрдЦреНрдп рд╕реА рдХреЛрдб рдкрд░ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рджреЛ рдФрд░ рдЪрд░рдгреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ: рдпрд╣ рдмреАрдПрд╕рдПрд╕ рдХреНрд╖реЗрддреНрд░ рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ "рдЬрд╛рджреВ" рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░ рд░рд╣рд╛ рд╣реИред рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕рддреНрдпрд╛рдкрди рдкрд╣рд▓реЗ:

  cmpl $0x5a5aaa55, setup_sig jne setup_bad 

рдирд┐рд░реНрджреЗрд╢ рдмрд╕ рдореИрдЬрд┐рдХ рдирдВрдмрд░ 0x5a5aaa55 рдХреЗ рд╕рд╛рде setup_sig рдХреА рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рд╡реЗ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдПрдХ рдШрд╛рддрдХ рддреНрд░реБрдЯрд┐ рдХреА рд╕реВрдЪрдирд╛ рджреА рдЬрд╛рддреА рд╣реИред

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

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

  movw $__bss_start, %di movw $_end+3, %cx xorl %eax, %eax subw %di, %cx shrw $2, %cx rep; stosl 

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, __bss_start рдХрд╛ рдкреНрд░рд╛рд░рдВрдн рдкрддрд╛ di рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдлрд┐рд░ рдкрддрд╛ _end + 3 (4 рдмрд╛рдЗрдЯреНрд╕ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд░реЗрдЦрдг рдХреЗ рд▓рд┐рдП +3) рдХреЛ cx рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред eax рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЛ рдордВрдЬреВрд░реА рджреЗ рджреА рдЧрдИ рд╣реИ (рдПрдХреНрд╕рдЖрд░ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ), рдмреАрдПрд╕рдПрд╕ рдЕрдиреБрднрд╛рдЧ ( cx-di рдбреАрдЖрдИ) рдХреЗ рдЖрдХрд╛рд░ рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдЗрд╕реЗ cx рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдлрд┐рд░ cx рдХреЛ рдЪрд╛рд░ ("рд╢рдмреНрдж" рдХреЗ рдЖрдХрд╛рд░) рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ stosl рдЗрдВрд╕реНрдЯреНрд░рдХреНрд╢рди рдХреЛ stosl рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ stosl , рдпрд╣ рдорд╛рди рдореЗрдВ (рд╢реВрдиреНрдп) рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ di рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИ, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЪрд╛рд░ рд╕реЗ di рдмрдврд╝рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рджреЛрд╣рд░рд╛рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рд╢реВрдиреНрдп рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рдЬрд╛рддрд╛ рд╣реИ)ред рдЗрд╕ рдХреЛрдб рдХрд╛ рд╢реБрджреНрдз рдкреНрд░рднрд╛рд╡ рдпрд╣ рд╣реИ рдХрд┐ рд╢реВрдиреНрдп рдХреЛ рд╕реНрдореГрддрд┐ рдореЗрдВ рд╕рднреА рд╢рдмреНрджреЛрдВ рдХреЛ _end рд╕реЗ __bss_start рддрдХ _end :



рдореБрдЦреНрдп рдкрд░ рдЬрд╛рдПрдВ


рдпрд╣реА рд╣реИ: рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕реНрдЯреИрдХ рдФрд░ рдмреАрдПрд╕рдПрд╕ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк main() рд╕реА рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ:

  calll main 

main() рдлрд╝рдВрдХреНрд╢рди рдЖрд░реНрдХ / x86 / рдмреВрдЯ / main.c рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИред рд╣рдо рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред

рдирд┐рд╖реНрдХрд░реНрд╖


рдпрд╣ рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╣рд▓реЗ рднрд╛рдЧ рдХрд╛ рдЕрдВрдд рд╣реИред , , . C, Linux, , memset , memcpy , earlyprintk , .

рд╕рдВрджрд░реНрдн


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


All Articles