1 3 5 head s開始執行(5)

2021-07-05 15:38:05 字數 2092 閱讀 7593

1.3.5 head.s開始執行(5)

上述動作的**如下:

//**路徑:boot/head.s  

movl $pg0+7,_pg_dir     /* set present bit/user r/w */  

movl $pg1+7,_pg_dir+4       /*  --------- " " --------- */  

movl $pg2+7,_pg_dir+8       /*  --------- " " --------- */  

movl $pg3+7,_pg_dir+12      /*  --------- " " --------- */  

movl $pg3+4092,%edi  

movl $0xfff007,%eax     /*  16mb-4096 + 7 (r/w user,p) */ 

head程式設定完頁目錄表後,linux 0.11在保護模式下支援的最大定址位址為0xffffff(16mb),此處將第4張頁表(由pg3指向的位置)的最後乙個頁表項(pg3+4902指向的位置)指向定址範圍的最後乙個頁面,即0xfff000開始的4kb位元組大小的記憶體空間。具體請看圖1-38右下方的標示。

圖1-38 頁目錄表設定完成後的狀態

然後開始從高位址向低位址方向填寫全部的4個頁表,依次指向記憶體從高位址向低位址方向的各個頁面,圖1-38是首次設定頁表。

繼續設定頁表。將第4張頁表(由pg3指向的位置)的倒數第二個頁表項(pg3-4+4902指向的位置)指向倒數第二個頁面,即0xfff000-0x1000(0x1000即4k,乙個頁面的大小)開始的4k位元組記憶體空間。請讀者認真對比圖1-39和圖1-38,圖中有多處位置發生了變化。

最終,從高位址向低位址方向完成全部4個頁表的填寫,頁表中的每乙個頁表項分別指向記憶體從高位址向低位址方向的各個頁面,如圖1-40下方所示。

這4個頁表都是核心專屬的頁表,將來每個使用者程序都有它們專屬的頁表,兩者在定址範圍方面的區別,我們將在記憶體與程序一章中詳細介紹。

圖1-38~圖1-40中所發生動作的相應**如下:

//**路徑:boot/head.s  

圖1-39 設定頁表

圖1-40 頁目錄表和頁表設定完畢的狀態

這些工作完成後,記憶體中的布局如圖1-41所示。可以看出,只有184個位元組的剩餘**,由此可見在設計head程式和system模組時,其計算是非常精確的,對head.s的**量的控制非常到位。

head程式已將頁表設定完畢了,但分頁機制的建立還沒有完成。需要設定頁目錄基址暫存器cr3,使之指向頁目錄表,再將cr0暫存器設定的最高位(31位)置為1,如圖1-42的右中部cr0暫存器的示意圖。

小貼士pg(paging)標誌:cr0暫存器的第32位,分頁機制控制位。當cpu的控制暫存器cr0第1位pe(保護模式)置為1時,可設定pg位為開啟。在開啟後,位址對映模式採取分頁機制。當cpu的控制暫存器cr0第1位pe(保護模式)置為0時,此時設定pg位將引起cpu發出異常。

cr3暫存器:3號32位控制暫存器,高20位存放頁目錄的基位址。當cr0中的pg標誌置位時,cpu使用cr3指向的頁目錄和頁表進行虛擬位址到實體地址的對映。

圖1-42 分頁機制完成後的總體狀態

1 3 5 head s開始執行(2)

1.3.5 head.s開始執行 2 小貼士取段暫存器指令 load segment instruction 該組指令的功能是把記憶體單元的乙個 低字 傳送給指令中指定的16位暫存器,把隨後的乙個 高字 傳給相應的段暫存器 ds es fs gs和ss 其指令格式如下 lds les lfs lgs...

kernel啟動流程 head S的執行 1 概述

kernel版本 5.10 平台 arm64 本專題主要基於 arm64 linux head.s的執行流程 系列文章,前者是基於3.18,本專題針對的是核心5.10。主要分析head.s的執行過程。vmlinux.lds中定義了入口點為 text entry text sections kimag...

開始 執行 命令大全

1.gpedit.msc 組策略 2.sndrec32 錄音機 3.nslookup ip位址偵測器 4.explorer 開啟資源管理器 5.logoff 登出命令 6.tsshutdn 60秒倒計時關機命令 7.lusrmgr.msc 本機使用者和組 8.services.msc 本地服務設定 ...