рдорд▓реНрдЯреАрдЯрд╛рд╕реНрдХрд┐рдВрдЧ рдорд╛рдЗрдХреНрд░реЛ рдХрд░реНрдиреЗрд▓ рдУрдПрд╕ рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ - рд╢реЗрдбреНрдпреВрд▓рд░

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

рдорд╣рддреНрд╡рдкреВрд░реНрдг :
1. рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдмрдХ рдХреА рдпрд╣ рд╢реНрд░реГрдВрдЦрд▓рд╛ред рд▓рдХреНрд╖реНрдп рджреБрдирд┐рдпрд╛ рдХрд╛ рдПрдХ рд╕рдордЧреНрд░ рдЪрд┐рддреНрд░ рдмрдирд╛рдирд╛ рд╣реИред рдмрд╣реБрдд рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдореЗрд░реЗ рд╕рд┐рд░ рдореЗрдВ рддреЗрдирдмрд╛рдо рд╕рд┐рджреНрдзрд╛рдВрдд рдерд╛ рдФрд░ рдореИрдВ рдЗрд╕реЗ рдЕрднреНрдпрд╛рд╕ рд╕реЗ рдирд╣реАрдВ рдЬреЛрдбрд╝ рд╕рдХрд╛ред рдЬрд┐рди рд▓реЛрдЧреЛрдВ рдХреЗ рдкрд╛рд╕ рд╕рдорд╛рди рдЪреАрдЬ рд╣реИ - рдореИрдВ рдЗрд╕ рд▓реЗрдЦ рдХреЛ рд╕рдорд░реНрдкрд┐рдд рдХрд░рддрд╛ рд╣реВрдВред
2. рдХреЛрдб рд╕рдмрд╕реЗ рд╕рд░рд▓ рдФрд░ рд╡рд┐рдирдореНрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рд╕реНрдкрд╖реНрдЯ рд╣реИред рдореЗрд░рд╛ рд▓рдХреНрд╖реНрдп рдЖрдкрдХреЛ рдПрдХ рд╕рдордЭ рджреЗрдирд╛ рд╣реИ, рддрд╛рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рдХрд░реНрдиреЗрд▓ рдХреЛ рд▓рд┐рдЦ рд╕рдХреЗрдВ, рдЗрд╕рд╕реЗ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ред
3. рдЬреИрд╕реЗ рд╣реА рдореИрдВ рдЗрд╕реЗ рд╡рд┐рд╕реНрддреГрдд рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдорд╛рдирддрд╛ рд╣реВрдВ, рдореИрдВ рд░реЗрдкреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░ рджреВрдВрдЧрд╛ред рдореИрдВ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╣рд┐рд╕реНрд╕рд╛, рдбрд┐рдмрдЧ рд▓рд┐рдЦрддрд╛ рд╣реВрдВ, рдФрд░ рдПрдХ рд╡реАрдбрд┐рдпреЛ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рд╢реВрдЯ рдХрд░рддрд╛ рд╣реВрдВред рдореЗрд░реЗ рдкрд╛рд╕ рддреИрдпрд╛рд░ рдЙрддреНрдкрд╛рдж рдирд╣реАрдВ рд╣реИред

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

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

рдЗрд╕рд▓рд┐рдП, рдЙрди рд╕рднреА рдЫрд╛рддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдирдХреЗ рдЙрддреНрд╕рд╛рд╣ рдореЗрдВ рдердХрд╛рд╡рдЯ рдирд╣реАрдВ рд╣реБрдИ рд╣реИ, рдореИрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЦреЛрд▓ рдХреЗ рд╕рд╛рде рд╕рдмрд╕реЗ рд╕рд░рд▓ рдорд▓реНрдЯреАрдЯрд╛рд╕реНрдХрд┐рдВрдЧ рдорд╛рдЗрдХреНрд░реЛрдХрд░реНрдиреЗрд▓ рдХреЛрд░ рдХреЛ рдЦрд░реЛрдВрдЪ рд╕реЗ рд▓реЗрдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ рдПрдХ рд╡рд┐рд╕реНрддреГрдд рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рд╕рдорд░реНрдкрд┐рдд рдХрд░рддрд╛ рд╣реВрдВред рдФрд░ рдореИрдВ рд╣рд░ рдХрд┐рд╕реА рдХреЛ рдЪреЗрддрд╛рд╡рдиреА рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬреЛ рдЕрднреА рддрдХ рдкреНрд░рдХрдЯ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдХреГрддрдШреНрди рдФрд░ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдорд╛рдорд▓рд╛ рд╣реИ, рдпрджреНрдпрдкрд┐ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рдФрд░ рдпреБрд╡рд╛, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЗрд╕рдХреА рдЕрдкрдиреА рдЪрд┐рдВрддрд╛рдПрдБ рд╣реИрдВред

рдЪрд▓реЛ рдЪрд▓рддреЗ рд╣реИрдВ!

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореЗрд░реЗ рд╣реЛрдо рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ рд╢реВрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╡реАрдбрд┐рдпреЛ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рд╣реИ ред рдпрд╣ рд╕реАрдзреЗ рдХреЛрдб рдХреЛ рд╕рдорд░реНрдкрд┐рдд рд╣реИред

рдЖрдЗрдП, рдвреЗрд░ рдкреНрд░рдмрдВрдзрдХ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХрд░реЗрдВред

extern void *kmalloc(size_t size); extern void kfree(void *addr); 

рдвреЗрд░ рдЖрд╡рдВрдЯрди рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рдФрд░ рд╡реНрдпрд╕реНрдд рдкрддреЗ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рджрд┐рд╢рд╛рддреНрдордХ рд╕реВрдЪреА рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╣реИред рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдд рд╕реВрдЪреА рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реНрд╡рдпрдВ рдПрдХ рд╕реНрдереИрддрд┐рдХ рд╕рд░рдгреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

 struct slist_head_t { struct slist_head_t *prev; struct slist_head_t *next; bool is_valid; void *data; } attribute(packed); struct slist_definition_t { size_t base; u_int slots; size_t slot_size; struct slist_head_t *head; struct slist_head_t *tail; }; 

рдРрд╕реА рд╕реАрдорд┐рдд рд╕реВрдЪреА рдХреЗ рддрддреНрд╡ рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд░рд┐рдХреЙрд░реНрдб рд╣реЛрдВрдЧреЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрд╕рдиреНрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдмреАрдЪ рдХреЛрдИ рдЫреЗрдж рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдореБрдлреНрдд рдореЗрдореЛрд░реА рдореМрдЬреВрдж рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рдЕрд▓рдЧ рд╕реВрдЪреА рдЖрдЗрдЯрдо рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рд╣реИред

 struct kheap_entry_t { struct slist_head_t list_head; /* static (array placed) list */ size_t addr; /* physical address */ size_t size; /* memory block size */ bool is_buzy; /* whether block used */ } attribute(packed); struct kheap_entry_t kheap_blocks[KHEAP_MAX_ENTRIES]; struct slist_definition_t kheap_list = { .head = null, .tail = null, .slot_size = sizeof(struct kheap_entry_t), .slots = KHEAP_MAX_ENTRIES, .base = (size_t)kheap_blocks }; 

Kheap_entry_t рд╕рдВрд░рдЪрдирд╛ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ slist_head_t рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рджрд░реНрдж рд░рд╣рд┐рдд рд░реВрдк рд╕реЗ рд░рд┐рдХреЙрд░реНрдб рдкреНрд░рдХрд╛рд░ рдХреЛ рдПрдХ рд╕реВрдЪреА рдЖрдЗрдЯрдо рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдЕрдм рд╕рдмрд╕реЗ рд╕рд░рд▓ рдвреЗрд░ рдЖрд╡рдВрдЯрди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо (kmalloc) рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

  1. рдпрджрд┐ рдХреЛрдИ рдореБрдлреНрдд рдмреНрд▓реЙрдХ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрд╡рд╢реНрдпрдХ рдЖрдХрд╛рд░ рдХреЗ рдПрдХ рдирдП рдмреНрд▓реЙрдХ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ (рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХрддрдо рд╣реАрдк рдЖрдХрд╛рд░ рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ)ред
  2. рдЕрдиреНрдпрдерд╛, рд╣рдо рд╕рднреА рдореБрдХреНрдд рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВред рдпрджрд┐ рд╣рдо рдПрдХ рдореБрдлрд╝реНрдд рдмреНрд▓реЙрдХ рдкрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЙрд╕рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рджреЗрдЦреЗрдВред рдпрджрд┐ рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рддреЛ рдЗрд╕реЗ рд▓реЗрдВред рдпрджрд┐ рдХреЛрдИ рдЕрдзрд┐рд╢реЗрд╖ рд╣реИ рддреЛ рдЕрдзрд┐рд╢реЗрд╖ рдХреЗ рдЖрдХрд╛рд░ рдХрд╛ рдПрдХ рдирдпрд╛ рдЦрд╛рд▓реА рдЦрдВрдб рдмрдирд╛рдПрдВред рдЕрдиреНрдпрдерд╛, рдпрджрд┐ рдпрд╣ рдЕрдкрд░реНрдпрд╛рдкреНрдд рдФрд░ рдмрд╛рдж рд╡рд╛рд▓рд╛ рд╣реИ, рддреЛ рд╣рдо рдвреЗрд░ рд╕реАрдорд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ (рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХрддрдо рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ)ред

рдореЗрдореЛрд░реА рдореБрдХреНрдд рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕рдорд╛рди рд╣реЛрдЧрд╛ (kfree):

  1. рдПрдХ рдмреНрд▓реЙрдХ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВ рдЬрд┐рд╕рдХрд╛ рдкрддрд╛ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдкрддреЗ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рд╡рд╣ рд╡реНрдпрд╕реНрдд рд╣реИред рдореБрдХреНрдд рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдВред
  2. рдпрджрд┐ рдПрдХ рдмреНрд▓реЙрдХ рдореЗрдВ рдЙрд╕рдХреЗ рд╕рд╛рде рдПрдХрдЬреБрдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рджрд╛рдПрдВ рдпрд╛ рдмрд╛рдПрдВ рдПрдХ рдирд┐рд╢реБрд▓реНрдХ рдкрдбрд╝реЛрд╕реА рд╣реИред

рдЕрдЧрд▓рд╛ рд▓реЗрдЦ рдвреЗрд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдЧрд╛ред

рдЖрдЗрдП рд╕рд░рд▓рддрдо рд╢реЗрдбреНрдпреВрд▓рд░ рд▓рд┐рдЦреЗрдВред рдХрд╛рд░реНрдп рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

 struct task_t { struct clist_head_t list_head; /* cyclic list */ u_short tid; /* task id */ struct gp_registers_t gp_registers; /* general purpose registers */ struct op_registers_t op_registers; /* other purpose registers */ struct flags_t flags; /* processor flags */ u_int time; /* time of task execution */ bool reschedule; /* whether task need to be rescheduled */ u_short status; /* task status */ int msg_count_in; /* count of incomming messages */ struct message_t msg_buff[TASK_MSG_BUFF_SIZE]; /* task message buffer */ void *kstack; /* kernel stack top */ void *ustack; /* user stack top */ } attribute(packed); struct clist_definition_t task_list = { .head = null, .slot_size = sizeof(struct task_t) }; 

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

рд╣рдордиреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЫрдВрдЯрдиреА рдХреА, рдЕрдм рд╕реНрд╡рдпрдВ рдпреЛрдЬрдирд╛ред IDT рдореЗрдВ рдПрдХ рдЯрд╛рдЗрдорд░ рд╣реИрдВрдбрд▓рд░ рдЬреЛрдбрд╝реЗрдВ рдФрд░ PIC рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд IRQ рд▓рд╛рдЗрди рдХреЗ рд╡реНрдпрд╡рдзрд╛рди рдХреЛ рд╕рдХреНрд╖рдо рдХрд░реЗрдВред рдЯрд╛рдЗрдорд░ рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рдиреЗ рд╕реЗ (рдФрд░ рдХрд░реНрдиреЗрд▓ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛрдб рдХреЗ рдЕрдВрдд рдореЗрдВ), рд╣рдо рд╢реЗрдбреНрдпреВрд▓рд░ рдХреЛ рдХрдВрдЯреНрд░реЛрд▓ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд░рддреЗ рд╣реИрдВ, рд░рд┐рдЯрд░реНрди рдПрдбреНрд░реЗрд╕ рдФрд░ рдЯрд╛рдЗрдорд░ рдХреА рд░реБрдХрд╛рд╡рдЯ рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рдмрдЪрд╛рдП рдЧрдП рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЗ рдкрддреЗ рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ:

 /* * Handle IRQ0 * void asm_ih_timer(unsigned long *addr) */ asm_ih_timer: cli pushal mov %esp,%ebp mov %ebp,%ebx pushl %ebx # &reg add $32,%ebx pushl %ebx # &ret addr call ih_timer mov %ebp,%esp popal sti iretl 

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

  /* save task state */ current_task->op_registers.eip = *ret_addr; current_task->op_registers.cs = *(u16 *)((size_t)ret_addr + 4); *(u32 *)(&current_task->flags) = *(u32 *)((size_t)ret_addr + 6) | 0x200; current_task->op_registers.u_esp = (size_t)ret_addr + 12; current_task->gp_registers.esp = current_task->op_registers.u_esp; memcpy(&current_task->gp_registers, (void *)reg_addr, sizeof(struct gp_registers_t)); 

рд╣рдо рдирдП рдХрд╛рд░реНрдп рдХрд╛ рд╕реНрдЯреИрдХ рдкрддрд╛ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рд╡рд╣рд╛рдВ iret рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдП рд░рд┐рдЯрд░реНрди рдлреНрд░реЗрдо рдмрдирд╛рддреЗ рд╣реИрдВред рдлрд┐рд░ рд╣рдо рдЕрд╕реЗрдВрдмрд▓реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдВрджрд░реНрдн рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВред

  /* prepare context for the next task */ next_task->op_registers.u_esp -= 4; *(u32 *)(next_task->op_registers.u_esp) = (*(u16 *)(&next_task->flags)) | 0x200; next_task->op_registers.u_esp -= 4; *(u32 *)(next_task->op_registers.u_esp) = next_task->op_registers.cs; next_task->op_registers.u_esp -= 4; *(u32 *)(next_task->op_registers.u_esp) = next_task->op_registers.eip; next_task->gp_registers.esp = next_task->op_registers.u_esp; next_task->op_registers.u_esp -= sizeof(struct gp_registers_t); memcpy((void *)next_task->op_registers.u_esp, (void *)&next_task->gp_registers, sizeof(struct gp_registers_t)); /* update current task pointer */ current_task = next_task; /* run next task */ asm_switch_context(next_task->op_registers.u_esp); 

рд╕рдВрджрд░реНрдн рд╕реНрд╡рд┐рдЪ рд╕реНрд╡рдпрдВ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 # # Switch context # void asm_switch_context(u32 esp) # asm_switch_context: mov 4(%esp),%ebp # ebp = esp mov %ebp,%esp popal sti iretl 

рд╢реЗрдбреНрдпреВрд▓рд░ рддреИрдпрд╛рд░ рд╣реИред

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

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


All Articles