рдмреВрдЯрд▓реЛрдбрд░ рд╕реЗ рдХрд░реНрдиреЗрд▓ рддрдХрдпрджрд┐ рдЖрдк рдкрд┐рдЫрд▓реЗ
рд▓реЗрдЦ рдкрдврд╝рддреЗ
рд╣реИрдВ , рддреЛ рдЖрдк рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рдирдП рд╢реМрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред рдореИрдВрдиреЗ
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 { _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 рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдПрдХ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рд▓реЛрдб рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдзреНрдпрд╛рдп рдореЗрдВ рдЗрд╕рдХреА рдпреБрдХреНрддрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред
рдХрд░реНрдиреЗрд▓ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ:
рдмреВрдЯрд▓реЛрдбрд░ (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:
рдпрд╣рд╛рдВ рд╣рдо рдСрдкрд░реЗрд╢рди рдХреЛрдб
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
, .
рд╕рдВрджрд░реНрдн