編輯:關於android開發
現在,內核已經被我們加載進內存了,該是跳入保護模式的時候了。
首先是GDT以及對應的選擇子,我們只定義三個描述符,分別是一個0~4GB的可執行段、一個0~4GB的可讀寫段和一個指向顯存開始地址的段:
; GDT ; 段基址 段界限, 屬性 LABEL_GDT: Descriptor 0, 0, 0 ; 空描述符 LABEL_DESC_FLAT_C: Descriptor 0, 0fffffh, DA_CR|DA_32|DA_LIMIT_4K ;0-4G LABEL_DESC_FLAT_RW: Descriptor 0, 0fffffh, DA_DRW|DA_32|DA_LIMIT_4K;0-4G LABEL_DESC_VIDEO: Descriptor 0B8000h, 0ffffh, DA_DRW|DA_DPL3 ; 顯存首地址 GdtLen equ $ - LABEL_GDT GdtPtr dw GdtLen - 1 ; 段界限 dd BaseOfLoaderPhyAddr + LABEL_GDT ; 基地址 ; GDT 選擇子 SelectorFlatC equ LABEL_DESC_FLAT_C - LABEL_GDT SelectorFlatRW equ LABEL_DESC_FLAT_RW - LABEL_GDT SelectorVideo equ LABEL_DESC_VIDEO - LABEL_GDT + SA_RPL3
在之前學習保護模式時,大部分描述符的段基址都是運行時計算後填入相應位置的,因為那時我們的程序是由BIOS或者DOS加載的,我們不知道段地址,於是也就不知道程序運行時在內存中的位置。
如今,Loader是由我們自己加載的,段地址已經被確定為BaseOfLoader,所以在Loader中出現的標號(變量)的物理地址可以用下面的公式來表示:
標號(變量)的物理地址=BaseOfLoader*10h+標號(變量)的偏移
我們把它以及相應的聲明放在load.inc中。
BaseOfLoader equ 09000h ; LOADER.BIN 被加載到的位置 ---- 段地址 OffsetOfLoader equ 0100h ; LOADER.BIN 被加載到的位置 ---- 偏移地址 BaseOfLoaderPhyAddr equ BaseOfLoader*10h ; LOADER.BIN 被加載到的位置 ---- 物理地址 BaseOfKernelFile equ 08000h ; KERNEL.BIN 被加載到的位置 ---- 段地址 OffsetOfKernelFile equ 0h ; KERNEL.BIN 被加載到的位置 ---- 偏移地址
我們定義了一個宏BaseOfLoaderPhyAddr用以代替BaseOfLoader*10h,它在loader.asm中被用到一次,用來計算GDT的基址。
運行結果如下:
【源碼】
安卓 應用程序修改圖標不更新,安卓圖標自己在做項目時,真機測試時想更換應用程序的圖標(虛擬機更換後可以更新),但是更換後重新運行並沒有更新圖標。經過嘗試,最終通過重啟手機
tcpdump的移植和使用方法簡介用簡單的話來定義tcpdump,就是:dump the traffic on a network,根據使用者的定義對網絡上的數據包進行截
Android 熱補丁動態修復框架小結 一、概述 最新github上開源了很多熱補丁動態修復框架,大致有: 上述三個框架呢,根據其描述,原理都來自
layout_weight屬性圖解 layout_height的作用: 首先按照聲明的尺寸分配,剩余的空間再按照layout_weight進行分配 一平均分配: 代碼