基於X86的操作系統從頭開始構建了用於學習目的
int 64發生,該INT需要門描述符才能升級構建操作系統(假設已安裝了海灣合作委員會),
make在Qemu下運行
make qemu運行(假設安裝了Bochs,安裝了Bochs-SDL),
make run在QEMU下運行調試支持(GDB)
make qemu_gdb(附加GDB,在最高級別Dir中已提供的.gdbinit文件中已提供的必需命令)
BIOS以16位實際模式啟動處理器,GRUB啟動了32位保護模式。按GRUB規範提供了內核ELF圖像,如果GRUB在圖像的前512個字節中找到此標頭,則它將ELF在0x100000位置加載,較低的內存屬於BIOS,而其他硬件/IO映射(如VGA)。啟動代碼,從內核的_start入口點執行,並且(註釋BSS已經由GRUB初始化為零),
簡單的first-fit策略內存分配器,從內核空間分配內存,在free期間還可以管理相鄰自由塊的壓實。
對於用戶空間malloc/free,提供了內部使用的sbrk系統調用,以增加系統中斷(如果需要)。內核確實需要頁表設置和返回會增加系統中斷限制。
將其分為內核空間內存映射和用戶空間內存映射。內核空間映射保持恆定,並且是每個過程地址空間的一部分,僅鏈接未克隆,因為在內核空間中的一個過程也應可見其他過程。
用戶空間映射取決於exec調用,並且每個過程都有其自己的內核和用戶堆棧。
在上下文開關期間,CR3寄存器加載了當前流程頁面目錄基礎地址,並且內部也使TLB無效(翻譯LookAside Buffer)。
用戶空間應用程序存儲在initramfs中,這是標準精靈格式的CPIO格式拱門。在exec內核查找和解析ELF圖像中,相應地設置其頁面表。 Init進程僅啟動shell ,然後永遠掛在那裡。
調度程序代表當前執行過程運行,主要在兩種情況下
內核模式代碼/數據段比用戶模式代碼/數據段相應地編程的用戶模式代碼/數據段。從例外返回時,硬件會從堆棧中彈出CS(代碼段)和SS(堆棧段),以返回較低的特權級別。
我們在創建新任務時相應地對此堆棧框架進行編程,
/* Task will start in CPL = 3, i.e. user mode */
task -> irqf -> cs = ( SEG_UCODE << 3 ) | DPL_USER ;
task -> irqf -> ds = ( SEG_UDATA << 3 ) | DPL_USER ;
task -> irqf -> eflags = 0x200 ;
task -> irqf -> ss = ( SEG_UDATA << 3 ) | DPL_USER ;X86硬件對任務切換具有內置支持,基本上是從用戶堆棧切換到內核堆棧以及其他分割參數。為此,每個任務都需要使用自己的TSS進行設置,該TSS在上下文切換過程中進行了修改。我們不會使用硬件任務切換,而是在軟件本身中也會使用相同的操作。在任何情況下,我們都需要設置具有有效內核模式SS(堆棧段)和ESP(堆棧指針)的最低tss,以進行當前任務。
隨機常見問題解答
隨意叉並發送合併請求