在時鐘中斷、計時器和鍵盤輸入方面,一些創新性的改進方向:
-
時鐘中斷 (PIT /
inthandler20
)- 動態節拍 (Tickless Kernel):當前的 PIT 中斷以固定頻率(約 100Hz)觸發,即使系統空閑或沒有即將到期的計時器,也會消耗 CPU 時間。可以改為動態調整中斷時機:僅當下一個計時器事件即將發生時,才設置 PIT (或更現代的 APIC 定時器/TSC deadline) 產生中斷。這可以顯著減少中斷開銷,降低功耗,提高系統性能,尤其是在空閑時。當前的最小堆結構 (
timerctl.heap[0]
) 已經提供了下一個事件的時間點,為實現此功能提供了基礎。 - 高精度定時器 (High-Resolution Timers):當前定時器精度受限于 PIT 頻率(約 10ms)。如果硬件(或模擬器)支持,可以考慮使用 TSC (Time Stamp Counter) 或 HPET (High Precision Event Timer) 來實現微秒甚至納秒級別的定時精度。這將需要修改
timerctl.count
的單位和計時器超時計算邏輯。
- 動態節拍 (Tickless Kernel):當前的 PIT 中斷以固定頻率(約 100Hz)觸發,即使系統空閑或沒有即將到期的計時器,也會消耗 CPU 時間。可以改為動態調整中斷時機:僅當下一個計時器事件即將發生時,才設置 PIT (或更現代的 APIC 定時器/TSC deadline) 產生中斷。這可以顯著減少中斷開銷,降低功耗,提高系統性能,尤其是在空閑時。當前的最小堆結構 (
-
計時器 (
timer.c
)- 計時器回調函數: 當前計時器到期時,是向指定的 FIFO 發送一個消息。可以擴展
timer_init
或timer_settime
接口,允許直接注冊一個回調函數。當計時器到期時,在中斷處理程序(或延遲到任務上下文)中直接調用該函數。這為需要精確時間觸發的驅動或子系統提供了更靈活的機制。 - 動態計時器分配: 當前使用固定大小的數組
timerctl.timers0
來管理計時器。可以改為使用memman
動態分配和釋放struct TIMER
,解除MAX_TIMER
的限制。需要注意內存碎片和分配/釋放的開銷。 - 周期性定時器的精度: 當前周期性定時器 (
interval > 0
) 的下一次觸發時間是基于當前timerctl.count
加上interval
。這可能導致微小的累積誤差。可以考慮記錄一個“期望喚醒時間”,每次觸發后,下一次期望喚醒時間是上一次期望喚醒時間加上interval
,而不是當前時間加上interval
,以減少長期運行的漂移。
- 計時器回調函數: 當前計時器到期時,是向指定的 FIFO 發送一個消息。可以擴展
-
鍵盤輸入 (
keyboard.c
/ bootpack.c)- 解耦的鍵盤驅動: 將鍵盤掃描碼到字符/按鍵符號的轉換邏輯從主循環 (
HariMain
) 中分離出來,創建一個獨立的鍵盤驅動層或庫函數。中斷處理程序 (inthandler21
) 可以繼續將原始掃描碼放入 FIFO,但由一個專門的驅動模塊(可能是一個獨立的任務,或在需要時被調用的庫)來處理這個 FIFO,解析掃描碼,考慮 Shift/Ctrl/Alt/Lock 狀態,并生成更高級別的按鍵事件(如按鍵按下/釋放、字符輸入、功能鍵等)。 - 結構化按鍵事件: 不要僅僅向應用程序發送字符碼或簡單的整數值。定義一個結構體來表示按鍵事件,包含更豐富的信息,例如:
- 原始掃描碼 (Raw Scancode)
- 按鍵碼 (Key Code, 與物理位置相關的標識符)
- 產生的字符 (Character, 如果有)
- 修飾鍵狀態 (Modifiers: Shift, Ctrl, Alt, CapsLock, NumLock 等)
- 事件類型 (按下 / 釋放)
這樣應用程序可以更靈活地處理各種組合鍵和按鍵狀態。
- 可配置鍵盤布局: 當前的
keytable0
/keytable1
是硬編碼的。可以設計一種機制,允許從外部文件(例如,磁盤上的布局文件)加載鍵盤映射表,從而支持不同的鍵盤布局(如 Dvorak、德語、法語等),并允許用戶切換。 - 輸入法框架 (IME): 對于需要輸入復雜字符(如中文、日文、韓文)的場景,可以設計一個基礎的輸入法框架。雖然完整實現很復雜,但可以先定義接口和基本結構,允許將來擴展。
- 解耦的鍵盤驅動: 將鍵盤掃描碼到字符/按鍵符號的轉換邏輯從主循環 (
這些改進方向中,有些(如動態節拍、高精度定時器、USB 支持、IME)實現起來比較復雜,可能超出了課程設計的范圍,但其他一些(如計時器回調、解耦鍵盤驅動、結構化按鍵事件、可配置布局)相對更具可行性,可以顯著提升系統的靈活性和現代性。