●❡❡❦❖❙ ✷✵✶✽ ❙❤❛♥❦❛r ❖❝t♦❜❡r ✹✱ ✷✵✶✽
●♦❛❧ Pr♦✈✐❞❡ ❛ ✈❡r② ❝♦♠♣❛❝t ✈✐❡✇ ♦❢ ●❡❡❦❖❙ Pr♦✈✐❞❡ ❛ ❢r❛♠❡✇♦r❦ ❢♦r ✉♥❞❡rst❛♥❞✐♥❣ t❤❡ ✐♥t❡r♥❛❧s ♦❢ ●❡❡❦❖❙ ♣♦s✐♥❣ ❛♥❞ ❛♥s✇❡r✐♥❣ ❝♦❞✐♥❣ q✉❡st✐♦♥s ✐♥ ❡①❛♠s ❞❡s❝r✐❜✐♥❣ ✇❤❛t ✐s t♦ ❜❡ ❞♦♥❡ ✐♥ ♣r♦❥❡❝ts
❖✉t❧✐♥❡ ❤✇✰❞❡✈ ❍❛r❞✇❛r❡ ❛♥❞ ❞❡✈✐❝❡s ✭❞r✐✈❡rs ✰ ✐♥t❡rr✉♣t ❤❛♥❞❧❡rs✮ ❇♦♦t✐♥❣ ❛♥❞ ❦❡r♥❡❧ ✐♥✐t✐❛❧✐③❛t✐♦♥ ❑❡r♥❡❧ t❤r❡❛❞s ❯s❡r ♣r♦❝❡ss❡s ❙②♥❝❤r♦♥✐③❛t✐♦♥ ❙❝❤❡❞✉❧✐♥❣ ▲♦✇❧❡✈❡❧✳❛s♠ ❱✐rt✉❛❧ ✜❧❡s②st❡♠ P❋❆❚ ❇❧♦❝❦❞❡✈ ❇✉❢❝❛❝❤❡
❍❛r❞✇❛r❡ ❝♦♥✜❣✉r❛t✐♦♥ ❤✇✰❞❡✈ CPU CPU CPU CPU Local APIC Local APIC Local APIC Local APIC dma keyboard ide timer VGA RAM IO APIC monitor diskc diskd ①✽✻ ❝♣✉s ✐♥ ❙▼P ✭s②♠♠❡tr✐❝ ♠✉❧t✐✲♣r♦❝❡ss✐♥❣✮ ❝♦♥✜❣✉r❛t✐♦♥ ❛♣✐❝s ✭✐♥t❡rr✉♣t ❝♦♥tr♦❧❧❡rs✮ ❧♦❝❛❧ ❛♣✐❝✿ r❡❝✈ ✐♥tr♣ts ❢r♦♠ ✐♦✲❛♣✐❝✱ s❡♥❞✴r❡❝✈ t♦ ♦t❤❡r ❝♣✉s ✐♦✲❛♣✐❝✿ r♦✉t❡ ✐♥t❡r♣ts ❢r♦♠ ✐♦ ❞❡✈✐❝❡s✴t✐♠❡r t♦ ❧♦❝❛❧ ❛♣✐❝s ❞✐s❦❝✿ ❦❡r♥❡❧ ✐♠❛❣❡❀ ♣❢❛t ✜❧❡s②st❡♠ ✇✐t❤ ✉s❡r ♣r♦❣r❛♠s ❡♠✉❧❛t❡❞ ❜② ◗❊▼❯ r✉♥♥✐♥❣ ♦♥ ❧✐♥✉① ✭✉♥✐①✮ ❡♥✈✐r♦♥♠❡♥t
①✽✻ ✭❈P❯✮ ❤✇✰❞❡✈ ❍❛s s❡✈❡r❛❧ ♠♦❞❡s✿ ♦♥❧② ✏r❡❛❧✑ ❛♥❞ ✏♣r♦t❡❝t❡❞✑ ♠♦❞❡s r❡❧❡✈❛♥t ❘❡❛❧ ♠♦❞❡ ❊♥t❡rs t❤✐s ♠♦❞❡ ✉♣♦♥ ♣♦✇❡r ✉♣ ✶✻✲❜✐t ♠❛❝❤✐♥❡ ✭■♥t❡❧ ✽✵✽✻✮ ✷✵✲❜✐t s❡❣♠❡♥t❡❞ ♠❡♠♦r② ❛❞❞r❡ss✿ ✶▼❇ ✶✻✲❜✐t ■❖ ✭♣♦rt✮ ❛❞❞r❡ss✱ ✷✺✻ ✐♥t❡rr✉♣ts Pr♦t❡❝t❡❞ ♠♦❞❡ ❊♥t❡r t❤✐s ♠♦❞❡ ✉♣♦♥ ❡①❡❝✉t✐♥❣ ❛ ❝❡rt❛✐♥ ✐♥str ✐♥ r❡❛❧ ♠♦❞❡ ✸✷✲❜✐t ♠❛❝❤✐♥❡ ✇✐t❤ ♠❛♥② ♠♦r❡ ❢❡❛t✉r❡s ✹ ♣r✐✈✐❧❡❣❡ ❧❡✈❡❧s✿ ✵ ✭❦❡r♥❡❧ ♠♦❞❡✮✱ ✶✱ ✷✱ ✸ ✭✉s❡r ♠♦❞❡✮ ✸✷✲❜✐t s❡❣♠❡♥t❡❞ ✭✰ ♦♣t✐♦♥❛❧ ♣❛❣✐♥❣✮ ♠❡♠♦r② ❛❞❞r❡ss✿ ✹●❇ ✶✻✲❜✐t ■❖ ✭♣♦rt✮ ❛❞❞r❡ss s♣❛❝❡✱ ✷✺✻ ✐♥t❡rr✉♣ts ●❡❡❦♦s r✉♥s ✐♥ t❤✐s ♠♦❞❡✳ ❘❡st ♦❢ t❤✐s s❡❝t✐♦♥ ❞❡❛❧s ✇✐t❤ ♣r♦t❡❝t❡❞ ♠♦❞❡
①✽✻✿ ❆❞❞r❡ss✐♥❣ ❤✇✰❞❡✈ ❆❞❞r❡ss s♣❛❝❡✿ ✹●❇ ✭✸✷✲❜✐t ❛❞❞r❡ss✮ ❙❡❣♠❡♥t✿ ❛ ❝♦♥t✐❣✉♦✉s ❝❤✉♥❦ ♦❢ ❛❞❞r❡ss s♣❛❝❡ ❆❞❞r❡ss ❢♦r♠❡❞ ❢r♦♠ ✶✻✲❜✐t s❡❣♠❡♥t s❡❧❡❝t♦r ❛♥❞ ✸✷✲❜✐t ♦✛s❡t ❙❡❣♠❡♥t s❡❧❡❝t♦r ✐♥❞❡①❡s ✐♥t♦ ❛ s❡❣ ❞❡s❝r✐♣t♦r t❛❜❧❡ ❬✇❤✐❝❤ t❛❜❧❡✱ ✐♥❞❡① ✐♥t♦ t❛❜❧❡✱ ♣r♦t❡❝t✐♦♥ ❧❡✈❡❧❪ ❣❧♦❜❛❧ ❞❡s❝r✐♣t♦r t❛❜❧❡ ✭❣❞t✮✱ ❧♦❝❛❧ ❞❡s❝r✐♣t♦r t❛❜❧❡ ✭❧❞t✮ ❨✐❡❧❞s ❛ ✻✹✲❜✐t s❡❣♠❡♥t ❞❡s❝r✐♣t♦r✱ ✇❤✐❝❤ ♣♦✐♥ts t♦ ❛ s❡❣♠❡♥t ❬❜❛s❡ ❛❞❞r✱ ❧✐♠✐t✱ ♣r✐✈✐❧❡❣❡ ❧❡✈❡❧✱ ❡t❝❪ ■❢ ♣❛❣✐♥❣ ✐s ♦♥✱ t❤❡ ❛❞❞r❡ss ✐s ❞✐✈✐❞❡❞ ✐♥t♦ ❬❞✐r✱ ♣❛❣❡✱ ♦✛s❡t❪
①✽✻✿ ■♥t❡rr✉♣ts ❤✇✰❞❡✈ ✷✺✻ ✐♥t❡rr✉♣ts✿ ✵✕✸✶ ❤✇✱ r❡st s✇ ✭tr❛♣s✱ ❡①❝❡♣t✐♦♥s✱ ❢❛✉❧ts✱ ❡t❝✮ ■♥t❡rr✉♣t ✐♥❞❡①❡s ✐♥t♦ ❛ ✐♥t❡rr✉♣t ❞❡s❝r✐♣t♦r t❛❜❧❡ ✭✐❞t✮ ❨✐❡❧❞s ❛ ✻✹✲❜✐t ✐♥t❡rr✉♣t ❣❛t❡✱ ✇❤✐❝❤ ♣♦✐♥ts t♦ ✐♥t❡rr✉♣t ❤❛♥❞❧❡r ❬s❡❣ s❡❧❡❝t♦r✱ ♦✛s❡t✱ ❞❡s❝r✐♣t♦r ♣r✐✈✐❧❡❣❡ ❧❡✈❡❧ ✭❞♣❧✮✱ ❡t❝❪ ■❢ ✐♥t❡rr✉♣t✲❤❛♥❞❧❡r✬s ♣r✐✈✐❧❡❣❡✲❧❡✈❡❧ ❂ ❝♣✉✬s ♣r✐✈✐❧❡❣❡✲❧❡✈❡❧✿ ❝♣✉ ♣✉s❤❡s ♦♥ ✐ts ❝✉rr❡♥t st❛❝❦ ✐ts ❡✢❛❣s✱ ❝s✱ ❡✐♣✱ ❛♥❞ ❛♥ ❡rr♦r ❝♦❞❡ ✭❢♦r s♦♠❡ ✐♥t❡rr✉♣ts✮ ■❢ ✐♥t❡rr✉♣t✲❤❛♥❞❧❡r✬s ♣r✐✈✐❧❡❣❡✲❧❡✈❡❧ ❁ ❝♣✉✬s ♣r✐✈✐❧❡❣❡✲❧❡✈❡❧✿ ❝♣✉ ✉s❡s ❛♥♦t❤❡r st❛❝❦ ✇❤♦s❡ ❧♦❝❛t✐♦♥ ✐s ✐♥ ❛ t❛s❦ st❛t❡ s❡❣♠❡♥t ✭tss✮ ♣✉s❤❡s ✐ts ss ❛♥❞ ❡s♣ / ✐♥t❡rr✉♣t❡❞ t❛s❦✬s st❛❝❦ / ♣✉s❤❡s ❡✢❛❣s✱ ❝s✱ ❡✐♣✱ ❡rr♦r ❝♦❞❡ ✭✐❢ ♣r❡s❡♥t✮ ❘❡t✉r♥✲❢r♦♠✲✐♥t❡rr✉♣t ✭■❘❊❚✮ ✉♥❞♦❡s t❤❡ ❛❜♦✈❡ ✭✐♥ ❜♦t❤ ❝❛s❡s✮
①✽✻✿ ❘❡❣✐st❡rs ❤✇✰❞❡✈ ❡❛①✱ ❡❜①✱ ❡❝①✱ ❡s✐✱ ❡❞✐✱ ❡❞①✿ ✏❣❡♥❡r❛❧ ♣✉r♣♦s❡✑ ✭✸✷✲❜✐t✮ ❡s♣ ✭✸✷✲❜✐t✮✿ st❛❝❦ ♣♦✐♥t❡r ✭✐♥ ss s❡❣♠❡♥t✮ ❡❜♣ ✭✸✷✲❜✐t✮✿ ❢r❛♠❡ ♣♦✐♥t❡r ✭✐♥ ss s❡❣♠❡♥t✮ ❡✐♣ ✭✸✷✲❜✐t✮✿ ✐♥str✉❝t✐♦♥ ♣♦✐♥t❡r ✭✐♥ ❝s s❡❣♠❡♥t✮ s❡❣♠❡♥t r❡❣✐st❡rs ✭✶✻✲❜✐t✮✱ ❡❛❝❤ ❤♦❧❞s ❛ s❡❣♠❡♥t s❡❧❡❝t♦r ❝s ✭❝♦❞❡ s❡❣♠❡♥t✮✱ ss ✭st❛❝❦ s❡❣♠❡♥t✮ ❞s✱ ❡s✱ ❢s✱ ❣s ✭❞❛t❛ s❡❣♠❡♥t✮ ❣❞tr ✭✹✽✲❜✐t✮✿ ❛❞❞r ❛♥❞ s✐③❡ ♦❢ ❝✉rr❡♥t ❣❞t ✐❞tr ✭✹✽✲❜✐t✮✿ ❛❞❞r ❛♥❞ s✐③❡ ♦❢ ❝✉rr❡♥t ✐❞t ❧❞tr ✭✶✻✲❜✐t✮✿ s❡❧❡❝t♦r t♦ ❝✉rr❡♥t ❧❞t ✭✈✐❛ ❣❞t✮ tr ✭✶✻✲❜✐t✮✿ s❡❧❡❝t♦r t♦ ❝✉rr❡♥t tss ✭✈✐❛ ❣❞t✮ ❡✢❛❣s ✭✸✷✲❜✐t✮✿ ❝❛rr②✱ ♦✈❡r✢♦✇✱ s✐❣♥✱ ✐♥t❡rr✉♣t ❡♥❛❜❧❡✱ ❡t❝ ❝r✵✕❝r✹ ✭✸✷✲❜✐t✮✿ ♣❛❣✐♥❣ ❡♥❛❜❧❡✱ ♣❛❣❡ ❢❛✉❧t✱ ❝❛❝❤❡ ❡♥❛❜❧❡✱ ❡t❝✳
▲♦❝❛❧ ❆P■❈s ❛♥❞ ■❖ ❆P■❈ ❤✇✰❞❡✈ ❇■❖❙ st♦r❡s ❆P■❈s ❝♦♥✜❣ ✐♥❢♦ ❛t ❝❡rt❛✐♥ ❛❞❞r❡ss❡s ▲♦❝❛❧ ❆P■❈ ✐♥❢♦ st❛rts ❛t 0xFEE00000 ✭ APIC_Addr ✮ ♦✛s❡t 0x20 ✭ APIC_ID ✮ st♦r❡s t❤❡ ❛♣✐❝ ✐❞ ✭ = ❝♣✉ ✐❞✮ / ✵✱ ✶✱ ✳✳✳ / ●❡t _ ❈P❯ _ ■❉✭✮✿ / r❡t✉r♥ ❝♣✉ ✐❞ ♦❢ ❝❛❧❧❡r t❤r❡❛❞ / ❞✐s❛❜❧❡ ✐♥t❡rr✉♣ts ❛♣✐❝✐❞ ← r❡❛❞ ❧♦❝❛t✐♦♥ APIC_Addr + APIC_ID r❡st♦r❡ ✐♥t❡rr✉♣ts r❡t✉r♥ ❛♣✐❝✐❞ ■❖ ❆P■❈ ✐♥❢♦ st❛rts ❛t 0xFEC00000 ✭ IO_APIC_Addr ✮
P■❚ t✐♠❡r ✰ ▲❆P■❈ t✐♠❡rs ❤✇✰❞❡✈ P■❚ t✐♠❡r✿ ✐♥t❡rr✉♣t TIMER_IRQ ✭❂✵✮ ❊❛❝❤ ▲♦❝❛❧ ❆P■❈ ❤❛s ❛ t✐♠❡r✿ ✐♥t❡rr✉♣t ✸✷ P■❚ t✐♠❡r ✐s ✉s❡❞ ♦♥❧② ❛t ❜♦♦t t♦ ❝❛❧✐❜r❛t❡ t❤❡ ▲❆P■❈ t✐♠❡rs ●❧♦❜❛❧ ❛♥❞ st❛t✐❝ ✈❛r✐❛❜❧❡s / ❣❧♦❜❛❧ t✐❝❦ ❝♦✉♥t❡r g_numTicks / / ❞❡❢❛✉❧t q✉❛♥t✉♠ DEFAULT_MAX_TICKS = 4 / g_Quantum = DEFAULT_MAX_TICKS
▲❆P■❈ t✐♠❡r ❤✇✰❞❡✈ Timer_Interrupt_Handler(istate) ✿ / s✐♠♣❧✐✜❡❞ / id ← Get_CPU_ID() ct ← get_current_thread() ✐❢ ✐❞ ✐s ✵✿ ++g_numTicks ++ct.numTicks ✐❢ ct.numTicks >= g_Quantum ✿ g_needReschedule[id] Init_Timer() ✿ Install_IRQ(32, Timer_Interrupt_Handler) ❡♥❛❜❧❡ ✐♥t❡rr✉♣t ✸✷ Init_Local_APIC(cpuid) ✿ / ❙▼P Install_IRQ(39, Spurious_Interrupt_Handler) / ❡♥❛❜❧❡ ✐♥t❡rr✉♣t ✸✾ s❡t t✐♠❡r t✐♠❡♦✉t ✈❛❧✉❡ / ❝♣✉ ✵ ✉s❡s P■❚ t♦ ❝❛❧✐❜r❛t❡ /
Recommend
More recommend