日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網營銷解決方案
Linux中虛擬地址與線性地址的區(qū)別及原理簡介 (linux 虛擬地址 線性地址)

在操作系統(tǒng)中,地址管理是非常重要的一部分。Linux系統(tǒng)也不例外。在Linux系統(tǒng)中,每一個進程都是有自己的虛擬地址空間的。虛擬地址和線性地址是兩個非常重要的概念。虛擬地址是進程所見到的地址,而線性地址是真實的物理地址。本文將詳細介紹Linux中虛擬地址與線性地址的區(qū)別及原理。

創(chuàng)新互聯(lián)主要從事成都網站設計、成都網站制作、網頁設計、企業(yè)做網站、公司建網站等業(yè)務。立足成都服務磐安,10余年網站建設經驗,價格優(yōu)惠、服務專業(yè),歡迎來電咨詢建站服務:13518219792

一、 基本概念

1. 物理地址

物理地址是指CPU通過總線發(fā)送出去的地址,它描述的是真實的內存地址空間。它是由硬件提供的,是用于表示物理內存地址的。

2. 線性地址

線性地址是在操作系統(tǒng)中使用的地址,也可以稱之為虛擬地址。它是由操作系統(tǒng)提供,對于進程來說是唯一且私有的地址空間,可以被分配、映射、保護等。在x86架構下,我們通常使用CR3寄存器來存儲當前進程的頁目錄表的物理地址,通過線性地址和頁表映射,最終得到物理地址。

3. 虛擬地址

虛擬地址是進程中使用的地址,它存在于應用程序的虛擬地址空間中。當應用程序訪問該地址時,操作系統(tǒng)會將虛擬地址翻譯成真實的物理地址。虛擬地址空間的大小并不取決于物理內存的大小,而是取決于操作系統(tǒng)的指定。每一個進程都有自己的虛擬地址空間。

二、 虛擬地址和線性地址的關系

虛擬地址到線性地址的轉換是由操作系統(tǒng)負責的。它基本上是通過分頁機制來實現(xiàn)的。在Linux系統(tǒng)中,每個進程都有一個64位的線性地址空間,可以使用高級語言編寫的程序能夠使用這個地址空間中的任何一個地址。因為這個地址空間是私有的,所以每個進程都能夠使用它的全部地址,不同進程之間的地址不會沖突。

當進程需要訪問虛擬地址時,操作系統(tǒng)會根據(jù)該虛擬地址所在的頁表找到對應的物理地址,然后再讀取實際的數(shù)據(jù)。可以說,虛擬地址是一個看不見的地址,而線性地址則是一個真實的地址。

三、 虛擬地址和線性地址的實現(xiàn)

在Linux系統(tǒng)中,虛擬地址和線性地址的實現(xiàn)主要依靠了x86架構的分頁機制。在x86架構下,CPU通過地址總線發(fā)送的是線性地址,而真正的存儲數(shù)據(jù)的物理地址被隱藏在該線性地址背后。

為了將虛擬地址轉換為線性地址,Linux內核維護了一個叫做頁表的數(shù)據(jù)結構。頁表中記錄了進程中的虛擬地址和線性地址的映射關系。當進程訪問虛擬地址時,操作系統(tǒng)會根據(jù)該虛擬地址所在的頁表找到對應的線性地址,然后再使用x86分頁機制將該線性地址翻譯成物理地址。

具體的轉換流程如下:

1. CPU將虛擬地址發(fā)送給MMU(Memory Management Unit)。

2. MMU通過CR3寄存器中保存的頁表地址找到對應的頁表。

3. MMU使用虛擬地址中的頁表索引查找對應的頁目錄項,從而找到虛擬地址映射的物理頁框號。

4. 然后將物理頁框號與虛擬地址中的偏移量相加,得到實際的物理地址。

5. CPU通過總線將真實的物理地址發(fā)送給存儲器,讀取數(shù)據(jù)。

四、

本文簡要介紹了Linux中虛擬地址和線性地址的概念、關系和實現(xiàn)原理。由于虛擬地址的存在,使得在不同的進程中,同樣的虛擬地址可以映射到不同的物理地址,保證了每個進程都具有私有的地址空間。而Linux內核使用x86分頁機制將虛擬地址轉化為實際的物理地址,實現(xiàn)了地址的隔離和保護,確保了操作系統(tǒng)的穩(wěn)定性和安全性。

相關問題拓展閱讀:

  • 典型嵌入式linux軟件部分由哪些模塊組成?他們的功能及相互聯(lián)系? Bootloader分為哪兩階段?分

典型嵌入式linux軟件部分由哪些模塊組成?他們的功能及相互聯(lián)系? Bootloader分為哪兩階段?分

典型的嵌入式系統(tǒng),軟件部分從下到上,分別是boot,kernel,rootfs,fsimg和上層應用。

起到的作用分別是,首孫引導內核,啟動內核,掛載根文件系統(tǒng),掛載實際文件系統(tǒng),開啟上層應用主循環(huán)。

你問的這些問題者茄鏈,每一點都可以單獨拿出來,長篇大論的講很久了。建議去納團網上先看相關的資料。貪多求快是不好的,一個知識點一個知識點的掌握。

從軟件硬件設計特點簡單描述嵌入式產品開發(fā)設計流程。

項目論證階段:項目的可行性分析并形成可行性研究報告。

系統(tǒng)方案階段:對產品需求加以分析、細化,并抽象出需要完成的功能列表,明確定義所要完成的任務。

系統(tǒng)設計階段:軟件開發(fā)部分完成軟件需求分析,形成軟件總體設計方案,軟件開發(fā)接口規(guī)范等;硬件部分完成硬件總體設計方案,接口定義及說明等。

產品詳細設計階段:完成軟/硬件的詳細設計,編制代碼,形成軟件各模塊的設計說明;硬件部分各單板的原理圖,PCB和料單,同時完成產品的結構設計。

制造聯(lián)試階段:完成產品的系統(tǒng)調試和可靠性測試,并形成相應的系統(tǒng)調試報告和可靠性測試報告。

典型嵌入式Linux軟件部分由哪些模塊組成?它的功能和相互關系是什么?

Bootloader、嵌入式Linux內核、嵌入式文件系統(tǒng)組成。Bootloader完成硬件設備的初始化以及引導內核加載,內核通過文件系統(tǒng)來管理對整個系統(tǒng)中的所有的數(shù)據(jù)和文件。

BootLoader分為哪兩個階段?分別實現(xiàn)了哪些功能?

stage1和stage2兩個階段。

完成的工作:

硬件設備初始化。

為加載Bootloader的stage2準備RAM空間。

拷貝Bootloader的stage2到RAM空間中。

設置堆棧。

跳轉到stage2的C入口點。

stage2完成櫻盯陸的工作:

初始化本階段要使用到的硬件設備。

監(jiān)測系統(tǒng)內存映射。

將內核映像和根文件系統(tǒng)映像從Flash設備上復制到RAM空間中。

設置內核啟動參數(shù)。

調用啟動內核。

簡述嵌入式文件系統(tǒng)的種類和管理機制。

Ext2fs文件系統(tǒng) 2.基于Flash的文件系統(tǒng) 3.基于RAM的文件系統(tǒng) 4.網絡文件系統(tǒng)。

Linux引入了虛擬文件系統(tǒng)vfs(virtual file system),為各類文件系統(tǒng)提供一個統(tǒng)一的應用編程接口。

如何理解消費類電子產品開發(fā)的可裁剪性和可移植性,并以Linux系統(tǒng)為例進行說明。

Linux來說,假如我們用不到以太網設備,我們可以將該設備的驅動程序以及相關庫文件等都去掉以縮小體積。

Linux可以在不同架構的CPU平臺上運行。

詳細描述嵌入式Linux軟件開發(fā)的編譯開發(fā)環(huán)境和編譯開發(fā)工具。

開發(fā)環(huán)境:首先宿主機上需要安裝Linux操作系統(tǒng)。需要為這個Linux系統(tǒng)安裝以下三個部分:

函數(shù)庫(glibc):是Linux下C語言的主要函數(shù)庫。

編譯器(gcc):可以將C,C++,匯編源程序和目標程序編譯、鏈接成可執(zhí)行文件。

系統(tǒng)頭文件(glibc_header):系統(tǒng)相關功能的頭文件。

編譯開發(fā)工具:編輯器有Vi和Emacs;編譯器為GCC,是GUN推出的功能強大、性能優(yōu)越的多平臺編譯器;調試器為GDB,可以方便的設置斷點、單步跟蹤等調試功能;項目管理器“make”,用來控制編譯或者重復編譯,自動管理軟件編譯內容、方式和時機。

基于S3C2410嵌入式Linux的開發(fā)的邏輯空間和物理空間如何對應?詳細描述脊頃之。

在支持MMU的32位處理器平臺上,Linux系統(tǒng)中的物理存儲空則悔間和虛擬存儲空間的地址范圍分別都是從0x到0xFFFFFFFF,共4GB,但物理存儲空間與虛擬存儲空間布局完全不同。Linux運行在虛擬存儲空間,并負責把系統(tǒng)中實際存在的遠小于4GB的物理內存根據(jù)不同需求映射到整個4GB的虛擬存儲空間中。

n 物理存儲空間布局

Linux的物理存儲空間布局與處理器相關,詳細情況可以從處理器用戶手冊的存儲空間分布表(memory map)相關章節(jié)中查到,我們這里只列出嵌入式處理器平臺Linux物理內存空間的一般布局,如圖18-4所示。

圖18-4 Linux物理內存空間一般布局示意圖

說明:

1)更大node號n不能大于MAX_NUMNODES-1。

2)MAX_NUMNODES表示系統(tǒng)支持的最多node數(shù)。在ARM系統(tǒng)中,Sharp芯片最多支持16個nodes,其他芯片最多支持4個nodes。

3)numnodes是當前系統(tǒng)中實際的內存node數(shù)。

4)在不支持CONFIG_DISCONTIGMEM選項的系統(tǒng)中,只有一個內存node。

5)更大bank號m不能大于NR_BANKS-1。

6)NR_BANKS表示系統(tǒng)中支持的更大內存bank數(shù),一般等于處理器的RAM片選數(shù)。在ARM系統(tǒng)中,Sharp芯片最多支持16個banks,其他芯片最多支持8個banks。

7)mem_init()函數(shù)會將所有節(jié)點的頁幀位碼表所占空間、孔洞頁描述符空間及空閑內存頁都釋放掉。

n虛擬存儲空間布局

在支持MMU的系統(tǒng)中,當系統(tǒng)做完硬件初始化后就使能MMU功能,這樣整個系統(tǒng)就運行在虛擬存儲空間中,實現(xiàn)虛擬存儲空間到物理存儲空間映射功能的是處理器的MMU,而虛擬存儲空間與5路存儲空間的映射關系則是由Linux內核來管理的。32位系統(tǒng)中物理存儲空間占4GB空間,虛擬存儲空間同樣占4GB空間,Linux把物理空間中實際存在的遠遠小于4GB的內存空間映射到整個4GB虛擬存儲空間中除映射I/O空間之外的全部空間,所以虛擬內存空間遠遠大于物理內存空間,這就說同一塊物理內存可能映射到多處虛擬內存地址空間上,這正是Linux內存管理職責所在。圖18-5列出了Linux內核中虛擬內存空間的一般布局(其實I/O空間也在其中,通常占用高端內存空間,在此未標出)。

圖18-5 Linux系統(tǒng)虛擬內存空間一般布局示意圖

說明:

1)線性地址空間:是指Linux系統(tǒng)中從0x到0xFFFFFFFF整個4GB虛擬存儲空間。

2)內核空間:內核空間表示運行在處理器更高級別的超級用戶模式(supervisor mode)下的代碼或數(shù)據(jù),內核空間占用從0xC到0xFFFFFFFF的1GB線性地址空間,內核線性地址空間由所有進程共享,但只有運行在內核態(tài)的進程才能訪問,用戶進程可以通過系統(tǒng)調用切換到內核態(tài)訪問內核空間,進程運行在內核態(tài)時所產生的地址都屬于內核空間。

3)用戶空間:用戶空間占用從0x到0xBFFFFFFF共3GB的線性地址空間,每個進程都有一個獨立的3GB用戶空間,所以用戶空間由每個進程獨有,但是內核線程沒有用戶空間,因為它不產生用戶空間地址。另外子進程共享(繼承)父進程的用戶空間只是使用與父進程相同的用戶線性地址到物理內存地址的映射關系,而不是共享父進程用戶空間。運行在用戶態(tài)和內核態(tài)的進程都可以訪問用戶空間。

4)內核邏輯地址空間:是指從PAGE_OFFSET(3G)到high_memory(物理內存的大小,更大896)之間的線性地址空間,是系統(tǒng)物理內存映射區(qū),它映射了全部或部分(如果系統(tǒng)包含高端內存)物理內存。內核邏輯地址空間與圖18-4中的系統(tǒng)RAM內存物理地址空間是一一對應的(包括內存孔洞也是一一對應的),內核邏輯地址空間中的地址與RAM內存物理地址空間中對應的地址只差一個固定偏移量(3G),如果RAM內存物理地址空間從0x地址編址,那么這個偏移量就是PAGE_OFFSET。

5)低端內存:內核邏輯地址空間所映射物理內存就是低端內存(實際物理內存的大小,但是小于896),低端內存在Linux線性地址空間中始終有永久的一一對應的內核邏輯地址,系統(tǒng)初始化過程中將低端內存永久映射到了內核邏輯地址空間,為低端內存建立了虛擬映射頁表。低端內存內物理內存的物理地址與線性地址之間的轉換可以通過__pa(x)和__va(x)兩個宏來進行,#define __pa(x) ((unsignedlong)(x)-PAGE_OFFSET) __pa(x)將內核邏輯地址空間的地址x轉換成對應的物理地址,相當于__virt_to_phys((unsigned long)(x)),__va(x)則相反,把低端物理內存空間的地址轉換成對應的內核邏輯地址,相當于((void *)__phys_to_virt((unsigned long)(x)))。

6)高端內存:低端內存地址之上的物理內存是高端內存(物理內存896之上),高端內存在Linux線性地址空間中沒有沒有固定的一一對應的內核邏輯地址,系統(tǒng)初始化過程中不會為這些內存建立映射頁表將其固定映射到Linux線性地址空間,而是需要使用高端內存的時候才為分配的高端物理內存建立映射頁表,使其能夠被內核使用,否則不能被使用。高端內存的物理地址于現(xiàn)行地址之間的轉換不能使用上面的__pa(x)和__va(x)宏。

7)高端內存概念的由來:如上所述,Linux將4GB的線性地址空間劃分成兩部分,從0x到0xBFFFFFFF共3GB空間作為用戶空間由用戶進程獨占,這部分線性地址空間并沒有固定映射到物理內存空間上;從0xC到0xFFFFFFFF的第4GB線性地址空間作為內核空間,在嵌入式系統(tǒng)中,這部分線性地址空間除了映射物理內存空間之外還要映射處理器內部外設寄存器空間等I/O空間。0xC~high_memory之間的內核邏輯地址空間專用來固定映射系統(tǒng)中的物理內存,也就是說0xC~high_memory之間空間大小與系統(tǒng)的物理內存空間大小是相同的(當然在配置了CONFIG_DISCONTIGMEMD選項的非連續(xù)內存系統(tǒng)中,內核邏輯地址空間和物理內存空間一樣可能存在內存孔洞),如果系統(tǒng)中的物理內存容量遠小于1GB,那么內核現(xiàn)行地址空間中內核邏輯地址空間之上的high_memory~0xFFFFFFFF之間還有足夠的空間來固定映射一些I/O空間??墒?,如果系統(tǒng)中的物理內存容量(包括內存孔洞)大于1GB,那么就沒有足夠的內核線性地址空間來固定映射系統(tǒng)全部物理內存以及一些I/O空間了,為了解決這個問題,在x86處理器平臺設置了一個經驗值:896MB,就是說,如果系統(tǒng)中的物理內存(包括內存孔洞)大于896MB,那么將前896MB物理內存固定映射到內核邏輯地址空間0xC~0xC+896MB(=high_memory)上,而896MB之后的物理內存則不建立到內核線性地址空間的固定映射,這部分內存就叫高端物理內存。此時內核線性地址空間high_memory~0xFFFFFFFF之間的128MB空間就稱為高端內存線性地址空間,用來映射高端物理內存和I/O空間。896MB是x86處理器平臺的經驗值,留了128MB線性地址空間來映射高端內存以及I/O地址空間,我們在嵌入式系統(tǒng)中可以根據(jù)具體情況修改這個閾值,比如,MIPS中將這個值設置為0xB(512MB),那么只有當系統(tǒng)中的物理內存空間容量大于0xB時,內核才需要配置CONFIG_HIGHMEM選項,使能內核對高端內存的分配和映射功能。什么情況需要劃分出高端物理內存以及高端物理內存閾值的設置原則見上面的內存頁區(qū)(zone)概念說明。

8)高端線性地址空間:從high_memory到0xFFFFFFFF之間的線性地址空間屬于高端線性地址空間,其中VMALLOC_START~VMALLOC_END之間線性地址被vmalloc()函數(shù)用來分配物理上不連續(xù)但線性地址空間連續(xù)的高端物理內存,或者被vmap()函數(shù)用來映射高端或低端物理內存,或者由ioremap()函數(shù)來重新映射I/O物理空間。PKMAP_BASE開始的LAST_PKMAP(一般等于1024)頁線性地址空間被kmap()函數(shù)用來永久映射高端物理內存。FIXADDR_START開始的KM_TYPE_NR*NR_CPUS頁線性地址空間被kmap_atomic()函數(shù)用來臨時映射高端物理內存,其他未用高端線性地址空間可以用來在系統(tǒng)初始化期間永久映射I/O地址空間。

悶農雪

捉騰歪

菠脫失

linux 虛擬地址 線性地址的介紹就聊到這里吧,感謝你花時間閱讀本站內容,更多關于linux 虛擬地址 線性地址,Linux中虛擬地址與線性地址的區(qū)別及原理簡介,典型嵌入式linux軟件部分由哪些模塊組成?他們的功能及相互聯(lián)系? Bootloader分為哪兩階段?分的信息別忘了在本站進行查找喔。

成都服務器租用選創(chuàng)新互聯(lián),先試用再開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)提供簡單好用,價格厚道的香港/美國云服務器和獨立服務器。物理服務器托管租用:四川成都、綿陽、重慶、貴陽機房服務器托管租用。


新聞標題:Linux中虛擬地址與線性地址的區(qū)別及原理簡介 (linux 虛擬地址 線性地址)
網站URL:http://www.5511xx.com/article/coegdig.html