歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux內核 >> Linux內核學習筆記:內存尋址

Linux內核學習筆記:內存尋址

日期:2017/3/1 10:30:12   编辑:Linux內核

內存地址分為三種:邏輯地址,線性地址,物理地址。在分段的CPU結構中,程序中引用的地址都是邏輯地址,邏輯地址經過分段單元成為線性地址。然後經過分頁單元成為物理地址,物理地址就是硬件電路尋址的實際地址。如果CPU體系結構不支持分段,那麼邏輯地址等於物理地址。一般RSIC指令的CPU都不支持分段,如arm。復雜指令的CPU支持分段,如x86。

一.分段

1.硬件中的分段:因為x86體系結構是分段的,所以程序是由很多段組成。程序的邏輯地址有段與偏移量組成。實現這種分段機制有特殊的硬件來完成,主要有段寄存cs, ss, ds, es, fs, gs,全局段描述符寄存器gdtr與局部段描述符寄存器ldtr。前三個段寄存器有固定的用途:cs 代碼段寄存器。ss 棧段寄存器。 ds數據段寄存器。邏輯地址由16位段選擇符和32位偏移量組成,段寄存器裝有段選擇符,段選擇符由索引號與特權級。當段選擇符裝入段寄存器時,硬件單元就會按照裡面的索引號,根據是全局段還是局部段從gdtr或ldtr寄存器段描述符的初始地址,算出線性地址。在這期間還進行相應的權限檢查。

2.linux中的分段:linux的設計目標就是簡單實用就好,而分段單元使得程序變得復雜。所以Linux不喜歡分段。但在在x86平台上必須分段,所以linux采用一種巧妙的方法,在用戶態與內核態使用四個段,分別是用戶代碼段,用戶數據段,內核代碼段,內核數據段。而且段描述符的基地址都是0,這樣換算下來的邏輯地址等於線性地址。分段的唯一用途就是可以檢查權限。

二. 分頁

1. 硬件中的分頁:分頁使得線性地址轉換成物理地址,還有一個關鍵的任務就是進行線性地址訪問權限的檢查。為了方便,線性地址分為相應的組:稱為頁。而物理地址也相應的分為組:稱為頁框。頁的大小由處理器決定。有些處理器支持不同大小的也,如s3c2440。x86支持4k大小的也。分頁根據頁的大小分為常規分頁與擴展分頁。擴展分頁允許頁的大小為4M而不是4k。常規分頁采用三級頁表,32位線性地址分為三個部分,最高十位是目錄中間十位為頁表,最後12位偏移量。在打開硬件分頁功能前,首先應該初始話頁表,然後把頁目錄的物理地址存放在cr3寄存器中,線性地址轉換成物理地址是這樣進行的。首先分頁單元取線性地址的最高十位,以它為索引找到頁目錄項,然後取頁目錄中的base字段加上線性地址的中間十位找到頁表項,然後加上線性地址的最後12位偏移量就是物理地址。當然這其中與做相應的權限檢查。

2. linux中的分頁:為了保持可移植性,無論硬件采用幾級分頁,linux都采用的四級分頁:頁全局目錄,頁上級目錄,頁中間目錄,頁表。如果硬件是兩極分頁,linux采用中間兩極分頁全是0的方式消除中間的分頁。linux的進程很大程度上依賴於分頁技術。不同的進程分配不同的地址空間,有效的減少了尋址錯誤。分頁技術是虛擬內存機制的基礎。linux提供了一些宏來簡化頁表的操作。

三. 物理內存布局

在系統初始化的時候,linux必須對物理內存做一定的映射,指定那些物理內存可以用,那些不可以用。內核保留的頁框為:不可用的物理地址的頁框范圍,這個也就是沒有安裝物理內存的地址。另外一個是含有內核代碼和已初始化數據結構的頁框。由於硬件的原因,linux一般安裝在物理地址的0x00100000開始的地方,但也不是絕對的,如mini2440,物理地址開始就是0x30000000,所以內核安裝在0x30008000起始地址處。在啟動內核的早期階段,內核訪問BIOS來確定物理內存的大小,有的體系結構通過啟動代碼傳過來的內核參數來了解物理內存的大小。隨後內核運行一些函數來初始化內存映射,初始化內核的一些表量來描述內存的物理布局。

Copyright © Linux教程網 All Rights Reserved