рдирдорд╕реНрддреЗред
рдореИрдВ рдЗрд╕ рддрдереНрдп рдХреЗ рд▓рд┐рдП рдорд╛рдлреА рдорд╛рдВрдЧрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдкреЛрд╕реНрдЯ рдЗрддрдиреА рджреЗрд░ рд╕реЗ рдереА, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд▓рд┐рдЦрдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рдерд╛ред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдореЗрдВ, рд╣рдо рдЕрдкрдиреЗ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдорд▓реНрдЯреАрдЯрд╛рд╕реНрдХрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗред
рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рд╢реНрди рдХреЛ рд╣рд▓ рдХрд░реЗрдВрдЧреЗ: рд╣рдо рдХрд┐рд╕ рдорд▓реНрдЯреАрдЯрд╛рд╕реНрдХрд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗ? рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╣реИ, рдорд▓реНрдЯреАрдЯрд╛рд╕реНрдХрд┐рдВрдЧ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╣реИ ...
рдкрд╣рд▓реЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдмреЗрд╣рддрд░ рд╣реИ, рдЖрдЦрд┐рд░рдХрд╛рд░, рдЗрдВрдЯреЗрд▓ рдиреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕ рддрдВрддреНрд░ рдХреЛ "рдордХреНрдЦреА" рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдиреБрдХрд╕рд╛рди рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдзреАрдореА рд╣реИред рдХреИрд╕реЗ? рдЗрдВрдЯреЗрд▓ рдЗрдВрдЬреАрдирд┐рдпрд░реЛрдВ рд╕реЗ рдкреВрдЫреЗрдВред рджреВрд╕рд░реЗ, рд╕рднреА рдиреЗ рдкрд╣рд▓реЗ рд╣реА рдкрдврд╝рд╛ рд╣реИ рдХрд┐ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдорд▓реНрдЯреАрдЯрд╛рд╕реНрдХрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╣рдореЗрдВ TSS (рдЯрд╛рд╕реНрдХ-рд╕реНрдЯреЗрдЯ рд╕реЗрдЧрдореЗрдВрдЯ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдХреЗ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ GDT рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдЬреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ... (рдбреНрд░рдо рд░реЛрд▓) ... 8192 рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ред рдРрд╕рд╛ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд░реНрд╡рд░ рдкрд░ (рд╣рд╛рдВ, рд╣рд╛рдВ, рд╣рдо рд╕рдкрдирд╛ рджреЗрдЦреЗрдВрдЧреЗ) рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рд▓рд┐рдП, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕реЗ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдХрд░реЗрдВрдЧреЗ - рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдорд▓реНрдЯреАрдЯрд╛рд╕реНрдХрд┐рдВрдЧред
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдореЗрдВ, рдореИрдВ рдХреЗрд╡рд▓ рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВред
рдЕрдм рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИред
1) TSS рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рд╕рд╛рде рдЖрддреЗ рд╣реИрдВред
2) рддрдп рдХрд░реЗрдВ рдХрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкрддрд╛ рд╕реНрдерд╛рди рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПред
3) рдХрд╛рд░реНрдп рд╕реНрд╡рд┐рдЪрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
рдЪрд▓реЛ рдкреНрд░реАрдореЗрдкреНрдЯрд┐рд╡ рдорд▓реНрдЯреАрдЯрд╛рд╕реНрдХрд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН, рд╣рдо рдпрд╣ рдХрд░реЗрдВрдЧреЗ: рдЯрд╛рдЗрдорд░ рдЯрд┐рдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░ (рдЬреЛ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 18.2 рдмрд╛рд░ рдЪреВрдХ рдХрд░рддрд╛ рд╣реИ), рд╣рдо рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВрдЧреЗред рдЯреАрдПрд╕рдПрд╕ рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рдПрдХ рд╕рдВрд░рдЪрдирд╛ рджрд░реНрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдмрдЪ рдЬрд╛рдПрдЧреАред рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдкрддрд╛ рд╕реНрдерд╛рди рд╕реНрдерд┐рд░ рд╣реИ (рдЖрдкрдХреЛ рдХрд╣реАрдВ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реИ, рдареАрдХ рд╣реИ?)ред рдпрд╣реА рд╣реИ, рдореЛрдЯреЗ рддреМрд░ рдкрд░, рд╣рдо рд░рд╛рдо рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдПрди рдмрд░рд╛рдмрд░ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рдЕрдм рдЖрдк рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рдПрдХ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди TSS рд╢реБрд░реВ рдХрд░реЗрдВ; рдЗрд╕реЗ рдЧрд░реНрд╡ рд╕реЗ TSS_struct рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рддрд░рд╣ рджреЗрдЦреЗрдВ:
TSS_struct:
0: privilage level (0|3)
1: ESP (Ring0)
5: CR3
9: EIP
13: EFLAGS
17: EAX
21: ECX
25: EDX
29: EBX
33: ESP (Ring3)
37: EBP
41: ESI
45: EDI
49: ES
51: CS
53: SS
55: DS
57: FS
59: GS
61: LDT_selector
63-256 - free
рдЕрдм рд╣рдо рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╣рдо рдЯрд╛рдЗрдорд░ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЯрд┐рдХ рдкрд░ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗред
рд╣рдореЗрдВ рдкреБрд░рд╛рдиреЗ рдХрд╛рд░реНрдп рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдПрдХ рдФрд░ рдХрд╛рд░реНрдп рдвреВрдВрдврдирд╛ рд╣реИ, рдПрдХ рдирдпрд╛ рд▓реЛрдб рдХрд░рдирд╛ рд╣реИред TSS_structs рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо 10 рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬрд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ рдмрд┐рдЯ 1 рдХрд╛рд░реНрдп рдХреЛ рджрд░реНрд╢рд╛рдПрдЧрд╛ред рдпрд╣ 2 рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ рдЬреЛ рд╕реНрдЯреИрдХ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛:
1) рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рд╕реНрддрд░ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ;
2) рдмрджрд▓ рд░рд╣рд╛ рд╣реИ;
рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рд╕реНрдЯреИрдХ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
;|EFLAGS
;|CS
;|EIP <---- ESP
;V
рджреВрд╕рд░реЗ рдореЗрдВ, рдЗрд╕ рддрд░рд╣:
;|SS
;|ESP
;|EFLAGS
;|CS
;|EIP <---- ESP
;V
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХреЗрд╡рд▓ рдЙрди рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рдЬреЛ рдмрд╛рдзрд╛ рд╣реИрдВрдбрд▓рд░ рдкрд░рд┐рд╡рд░реНрддрди рдореВрд▓реНрдпреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВред
рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ, рдореИрдВ рдХреЗрд╡рд▓ Ring0 рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВред рд░рд┐рдВрдЧ (1 | 2 | 3) рд╣рдордиреЗ рдЕрднреА рддрдХ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рд╡рд╣рд╛рдВ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрд▓рдЧ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЦреБрдж рдХреЛ рд╕реАрдорд┐рдд рдХрд░ рд▓реЗрдВрдЧреЗред
рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛ рджреВрдВ рдХрд┐ рдЬрд╣рд╛рдВ рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд░реБрдХрд╛ рд╣реВрдВ, рд╡рд╣рд╛рдВ рдлрд┐рд╕рд▓рди рд╡рд╛рд▓реЗ рд╕реНрдерд╛рди рд╣реИрдВ, рдФрд░ рдЕрдХреНрд╕рд░ рд▓рдВрдмреЗ рд╕рдордп рддрдХред
1) рд╕рдмрд╕реЗ рдкреНрд░рд╛рдердорд┐рдХ: рд╣рдо рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рд╡рд╛рдкрд╕реА рдкрддреЗ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╣рдо рд╕реНрдЯреИрдХ рдкрд░ рдзрдХреНрдХрд╛ рджреЗрддреЗ рд╣реИрдВред
2) EFLAGS рдореЗрдВ IF рдлреНрд▓реИрдЧ (рдЗрдВрдЯрд░рдкреНрдЯ рдлреНрд▓реИрдЧ) рд╕реЗрдЯ рди рдХрд░реЗрдВред рдпрд╣реА рд╣реИ, рдирдХрд╛рдмрдкреЛрд╢ рд╡реНрдпрд╡рдзрд╛рди рдирд┐рд╖рд┐рджреНрдз рд╣реИрдВ, рдФрд░ рдЖрдк рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рд╕рдХрддреЗ рд╣реИрдВред
3) рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЕрдЧрд▓реЗ рдХрд╛рд░реНрдп рдХреЗ рдЦреЛрдЬ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЧрд▓рддреА рди рдХрд░реЗрдВред рдЗрд╕рдХреА рд╕рд╛рджрдЧреА рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдЖрдк рд╡рд╣рд╛рдВ рдмреАрдЯрд▓ рдкреНрд░рдЬрдирди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореИрдВрдиреЗ рдЗрд╕реЗ рдУрд▓реНрдЧрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрд▓рдЧ рд╕реЗ рдирд┐рдХрд╛рд▓ рджрд┐рдпрд╛, рддрд╛рдХрд┐ рдкрд░рд┐рдгрд╛рдо рд╕рдЪ рд╣реЛрдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реЛред
4) рдпрджрд┐ рдЖрдк рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рддрдХ рдирд╣реАрдВ рдХреВрджрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЙрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╢рд╛рдВрддрд┐ рдФрд░ рд╢рд╛рдВрддрд┐ рд╕реЗ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рддреЛ рд╕реНрдЯреИрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордд рднреВрд▓рдирд╛! рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕реНрдЯреИрдХ, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдЗрд╕ рд╡реНрдпрд╡рд╕рд╛рдп рдореЗрдВ рд╕рдмрд╕реЗ рдлрд┐рд╕рд▓рди рд╡рд╛рд▓рд╛ рд╕реНрдерд╛рди рд╣реИред
рдЕрдм рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╕рдВрджрд░реНрдн рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдХреНрдпреЛрдВ? рд╣рдореЗрдВ рдорд▓реНрдЯреАрдЯрд╛рд╕реНрдХрд┐рдВрдЧ рджрд┐рдЦрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЕрдм рдпрд╣рд╛рдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдб рдирд╣реАрдВ рд▓рд┐рдЦреЗ рд╣реИрдВред рд╣рдорд╛рд░рд╛ рдПрдХ рдбреЗрдореЛ рд╣реИред
рдареАрдХ рд╣реИ, рдЪрд▓реЛ рдЗрд╕ рддрдереНрдп рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рдПрдХ рдирдП рдХрд╛рд░реНрдп рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдпрд╣ Ring0 рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдЖрдЗрдП рд╣рдо рд╕реНрдЯреИрдХ рдЫреЛрдбрд╝ рджреЗрдВ рдФрд░ рд╕рднреА рд╕реЗрдЧрдореЗрдВрдЯ рдХрд╛ рдореВрд▓реНрдп рдЕрдХреЗрд▓реЗ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░реЗрдВред рдмрд╕ рдбреЗрдЯрд╛ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рдЦреЗрдВред рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдкреНрд░рджрд░реНрд╢рди рд╣реИ! рдпрд╣ рд╕рдм рдкрд░ рдЧрд░реНрд╡ рдирд╛рдо create_task рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдмрд╕ рдмреВрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдорд╛рди рдбрд╛рд▓реЗрдВ рдФрд░ рдмрд┐рдЯ рдХреЛ рдЕрдзрд┐рдЧреНрд░рд╣рд┐рдд TSS_structs рдХреЗ рдмрд┐рдЯрдореИрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░реЗрдВред рддреЛ:
create_task:
mov ax,20h; - .
mov es,ax
mov [es:100h+9],dword task;EIP
pushfd ;EFLAGS
pop eax
mov [es:100h+13],eax;EFLAGS
mov [es:100h+51],word 8h ;CS тАУ Ring0,
bts word [bysi_TSS_map],6 ;
mov ax,10h;
mov es,ax
ret
рдпрд╣рд╛рдВ 20h рдЪрдпрдирдХрд░реНрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред TSS_structs рдХреЗ рднрдВрдбрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ рдХреНрд╖реЗрддреНрд░ рд╣реИред рдЕрдзрд┐рдХред рд╣рдо 6 рдмрд┐рдЯ рдХреНрдпреЛрдВ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ? рдФрд░ рдпрд╣рд╛рдБ рдкрдХрдбрд╝ рд╣реИред рдХреЛрдб рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рд╡рд╣ рднреА рдмрди рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП ...ред рдХрд╛рд░реНрдпред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ рдпрд╣ 7 рд╡рд╛рдВ рдмрд┐рдЯ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
bts word [bysi_TSS_map],7
рдЕрдм рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдФрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рдПрдХ рдирдП рдХрд╛рд░реНрдп рдХреА рдЦреЛрдЬ рдХрд░рддреЗ рд╣реИрдВред
рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рдФрд░ рдЖрд╕рд╛рди рд╣реИ: рд╣рдо рдХрд╛рд░реНрдп рд╕рдВрдЦреНрдпрд╛ рджреНрд╡рд╛рд░рд╛ TSS_struct рдкрддреЗ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдПрдХ рдирдпрд╛ рдЦреЛрдЬрддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ TSS_struct рд╕реЗ рдбреЗрдЯрд╛ рдкрдврд╝рддреЗ рд╣реИрдВ рдФрд░ рдирдП рдХрд╛рд░реНрдп рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВред
рдЗрд╕рд▓рд┐рдП, рдкреАрдЖрдИрдЯреА рд╣реИрдВрдбрд▓рд░ рд╕реЗ рд╣рдо рдХрд╛рд░реНрдп рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ - task_switch:
task_switch:
mov [temp_1],eax
mov [temp_2],es
xor eax,eax
mov ax,20h
mov es,ax
call calculate_TSS_struct_address ;: EDI тАУ
jmp store_context
рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд░ рдХрд╣рд╛рдБ рд╣реИрдВ:
temp_1 dd 0;EAX
temp_2 dw 0;ES
рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╣рдореЗрдВ рдЙрд╕ рдкрддреЗ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреА рд╣реЛрдЧреАред рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рд░реА рдХрд░рддреЗ рд╣реИрдВред
calculate_TSS_struct_address:
push eax
push ebx
mov eax,[cur_task_num]; dword' .
mov ebx,100h
mul ebx
pop ebx
mov edi,eax;EDI тАУ TSS_struct
pop eax
ret
рдЕрдм рд╕рдВрджрд░реНрдн рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред Banality - рдСрдлрд╕реЗрдЯ рдкрд░ рд╣рдордиреЗ рдорд╛рди рдбрд╛рд▓ рджрд┐рдпрд╛ред рд╡рд╣ рд╕рдм рд╣реИред
store_context:
;mov eax,cr3 ;
;mov [es:edi+5],eax
pushfd
pop eax
mov [es:edi+13],eax;EFLAGS
mov [es:edi+21],ecx
mov [es:edi+25],edx
mov [es:edi+29],ebx
mov [es:edi+37],ebp
mov [es:edi+41],esi
mov [es:edi+45],edi
mov ax,[temp_2]
mov [es:edi+49],ax;ES
mov eax,[temp_1]
mov [es:edi+17],eax
mov [es:edi+53],ss
mov [es:edi+55],ds
mov [es:edi+57],fs
mov [es:edi+59],gs
;sldt ax ;
;mov [es:edi+61],ax
pop eax
mov [es:edi+9],eax;EIP
;
pop ax
mov [es:edi+51],ax;CS
popfd ;EFLAGS
jmp find_next_task
рдирд┐рдореНрди рдлрд╝рдВрдХреНрд╢рди рдмрд┐рдЯрдореИрдк рдореЗрдВ рдЕрдЧрд▓реЗ рд╢рд┐рдХрд╛рд░ рдХреА рдЦреЛрдЬ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдИрдбреАрдЖрдИ рдореЗрдВ рдЕрдкрдирд╛ рдкрддрд╛ рджреЗрддрд╛ рд╣реИред
find_next_task:
xor edx,edx
mov eax,[cur_task_num]
mov ecx,8
div ecx
;EAX -
;EDX - ''
test edx,edx
jnz .norm
mov edi,7
jmp .step
.norm: mov edi,8
.step: sub edi,edx;real bit #
mov edx,edi
mov edi,eax
.cycle:
bt word [bysi_TSS_map+edi],dx
jc .found
cmp dx,0
je .inc_byte
dec dx
jmp .cycle
.inc_byte:
cmp edi,10; - 800- .
je .error
inc edi
mov dx,7
jmp .cycle
.found:
push edx
mov eax,8
mul edi
pop edx
mov di,7
sub di,dx
add eax,edi
mov [cur_task_num],eax
call calculate_TSS_struct_address
jmp load_context
.error:
mov dx,7; .
xor edi,edi
jmp .cycle
рдЕрдм рд╡рд╣ рд╕рдм рдХреБрдЫ рд╕рдВрджрд░реНрдн рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИред
load_context:
;mov eax,[es:edi+5];CR3 -
;mov cr3,eax
;mov esp,[es:edi+1];
;mov ss,[es:edi+53]
mov ecx,[es:edi+21]
mov edx,[es:edi+25]
mov ebx,[es:edi+29]
mov ebp,[es:edi+37]
mov esi,[es:edi+41]
mov edi,[es:edi+45]
;mov ds,[es:edi+55]; .
;mov fs,[es:edi+57]
;mov gs,[es:edi+59]
; '' ( iretd)
push dword [es:edi+13];EFLAGS
push word [es:edi+51] ;CS
push dword [es:edi+9];EIP
jmp timer.s_t
рдпрд╣рд╛рдВ рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рд░реБрдХрд╛рд╡рдЯ рдХреЗ рджреМрд░рд╛рди, рд╕реНрдЯреИрдХ рдореЗрдВ 3 рдорд╛рди рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддреЗ рд╣реИрдВ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рд╛рдВрдкреНрд░рджрд╛рдпрд┐рдХ) (рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рд╕реНрддрд░ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ)ред рд╕рдВрдХреНрд░рдордг рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдирдП рдХрд╛рд░реНрдп рдХреЗ 'рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ' рдХреЛ рд╕реНрдЯреИрдХ рдкрд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ, рдкреАрдЖрдИрдЯреА рд╣реИрдВрдбрд▓рд░ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ iretd рдмрдирд╛рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реА рдкреАрдбрд╝рд╛ рдЦрддреНрдо рд╣реЛ рдЧрдИ рд╣реИ? рд▓рдЧрднрдЧред рдирдП рдХрд╛рд░реНрдп рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдЖрдкрдХреЛ рдЗрдВрдЯрд░рдкреНрдЯ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП sti рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╡рд╣ рд╕рдм рд╣реИред рдФрд░ рддреБрдо рднрдпрднреАрдд рдереЗ!
рдЯрд╛рдЗрдорд░ рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓рд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлреЙрд░реНрдо рд▓реЗрдЧрд╛:
timer:
;........
.s_t:
push ax ; EOI
mov al,20h
out 20h,al
out 0a0h,al
pop ax
iretd ;
рдЕрдм рд╣рдо рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддреЗ рд╣реИрдВред
рдпрд╛рдж рд░рдЦреЗрдВ, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ jmp $ рдЕрдВрддрд┐рдо рдХреЛрдб рд╣реИ?
рдЕрдм рдЖрдк рд╡рд╣рд╛рдВ рдЪрд░рд┐рддреНрд░ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рджреГрд╖реНрдЯрд┐рдЧреЛрдЪрд░ рдФрд░ рд╢реАрдШреНрд░рддрд╛ рд╕реЗред
рдФрд░ рдЬрд┐рд╕ рдХрд╛рд░реНрдп рдХрд╛ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдЙрд╕рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
task:
sti
inc byte [gs:0]
jmp task
рдЕрдм рд╣рдо рдЗрд╕реЗ рд╕рднреА рдХреЛ рдПрдХ рд╕рд╛рде рд░рдЦрддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдЖрдирдВрдж рд▓реЗрддреЗ рд╣реИрдВред
So. рдпрд╣рд╛рдБ рдкрд░рд┐рдЪрдпрд╛рддреНрдордХ рд▓реЗрдЦ рд╣реИ рдФрд░ рдпрд╣ рдЦрддреНрдо рд╣реЛ рдЧрдпрд╛ рд╣реИред
рдорд▓реНрдЯреАрдЯрд╛рд╕реНрдХрд┐рдВрдЧ рдХрд╛ рдПрдХ рд╕рджреБрдкрдпреЛрдЧ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред 'рдХрд╛рд░реНрдп' рдХреЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕реНрдЯреИрдХ, рд╕реЗрдЧрдореЗрдВрдЯ рдФрд░ рд╕реНрдерд╛рдиреАрдп рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдЯреЗрдмрд▓ рдирд╣реАрдВ рд╣реИрдВ ... рдЕрднреА рднреА рдмрд╣реБрдд рдХрд╛рдо рдХрд░рдирд╛ рдмрд╛рдХреА рд╣реИред рдпрд╣рд╛рдБ рднрд╡рд┐рд╖реНрдп рдХреЗ рд░рд┐рд▓реАрдЬ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╖рдп рд╣реИрдВред рдореИрдВ рдЕрдкрдиреА рдЕрдВрдЧреНрд░реЗрдЬреА ('рдмрд╛рдИрд╕реА' = 'рд╡реНрдпрд╕реНрдд' рдХреЗ рд▓рд┐рдП рдорд╛рдлреА рдорд╛рдВрдЧрддрд╛ рд╣реВрдВ; рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╣рд░ рдЬрдЧрд╣ рдХреЛрдб рдХреЛ рдареАрдХ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ)ред