國產處理器龍芯地址空間詳解

qq_26989627發表於2020-10-15

國產處理器龍芯地址空間詳解

原創程式猿的未來人生2020-06-13 09:04:07

MIPS基本邏輯地址空間

MIPS64架構下包含一個64位地址空間和一個32位地址空間,32位地址空間是64位地址空間的子集。32位地址空間被分成四段,即常說的kuseg,kseg0~2如下圖。其64位地址空間可被分割成更多的段。

國產處理器龍芯地址空間詳解

 

kuseg:0x0000 0000-0x7FFF FFFF(低端2G) :使用者太可用地址,必須通過MMU進行地址對映後才能正常訪問。

kseg0:0x8000 0000 - 0x9FFF FFFF(512M):最高位清零就是對應的實體地址,對映到連續的低端512M實體地址。該地址空間通過快取記憶體存取,主要用來存放作業系統核心。

kseg1:0xA000 0000 - 0xBFFF FFFF(512M):高3位清零就是對應的實體地址,對映到連續的低端512M實體地址。該地址空間不通過快取記憶體存取,該區域主要用做I/O暫存器,系統ROM和啟動時入口向量(0xBFC00000)就存於這個地址段內,因為系統啟動時cache還未進行初始化。

kseg1:0xC000 0000 - 0xFFFF FFFF (1G):該地址段只能在核心態使用,並且需要經過MMU轉換。

龍芯實體地址空間規範

龍芯實體地址空間設計的規則約定如下:

  • 0x0000_0000~0x0FFF_FFFF 的低 256MB 空間為低端記憶體空間。 其中0x000 0000~0x001F FFFF為相容老版本韌體保留的2M地址空間;0x0F00_0000~0x0FFF_FFFF 是為韌體PMON保留的 16M 地址空間,用於與核心的資訊互動,如韌體傳參、關機和重啟功能、Smbios、 Vbios 等。

國產處理器龍芯地址空間詳解

 

國產處理器龍芯地址空間詳解

 

  • 0x1000_0000~0x1FFF_FFFF 為 PCI 等 IO 裝置空間及部分晶片配置暫存器空間;
  • 0x3000_0000~0x3FFF_FFFF 為視窗配置暫存器的空間範圍;
  • 0x4000_0000~0x7FFF_FFFF 為 PCI 裝置 memory 空間範圍;
  • 0x2000_0000~0x2FFF_FFFF 和 0x8000_0000~高階記憶體基址-0x0000_0001 為保留空洞;
  • 高階記憶體基址預設值為 0x9000_0000。

國產處理器龍芯地址空間詳解

 

System RAM地址範圍如下圖:

國產處理器龍芯地址空間詳解

 

龍芯DMA 地址對映規範

編寫驅動時涉及設定DMA地址,龍芯不同晶片的DMA地址設定不同,需要特別注意,否則驅動可能無法正常執行。其相關DMA地址設定方法如下:

  • 7A 作為橋片時 DMA 地址與記憶體實體地址的對應關係為 1:1 對映:即 dmaaddr = phyaddr

國產處理器龍芯地址空間詳解

 

  • 2H 作為橋片時 DMA 地址與記憶體實體地址的對應關係分為兩種情況: 記憶體地址為低 256M 時與 DMA 地址關係為 1:1 對映; 記憶體地址大於 256M 時與 DMA 的對映關係為 dmaaddr = phyaddr - 0x80000000。

國產處理器龍芯地址空間詳解

 

  • 780e 作為橋片時 DMA 地址與記憶體實體地址的對應關係分為兩種情況: 記憶體地址在低 256M 對映關係為 dmaaddr=phyaddr | 0x80000000; 記憶體地址大於 256M 的部分為 1:1 對映。

國產處理器龍芯地址空間詳解

 

-------------------------------------------------------------------------------------------------------------------------------------------------

總結:龍芯2k實體地址空間為

0-0xFFFFFFF (0-256M)

0x90000000-0xFFFFFFFF(256M-2G)

虛擬地址空間:

kuseg:0x0000 0000-0x7FFF FFFF(低端2G) :使用者太可用地址,必須通過MMU進行地址對映後才能正常訪問。

kseg0:0x8000 0000 - 0x9FFF FFFF(512M):最高位清零就是對應的實體地址,對映到連續的低端512M實體地址。該地址空間通過快取記憶體存取,主要用來存放作業系統核心。由於實體地址不連續所以,虛擬地址(0x80000000~0x80000000+256M)==>對應實體地址0-0xFFFFFFF (0-256M,即低端256M)  虛擬地址(0x90000000~0x90000000+256M)=====>對應實體地址(0x90000000~0x90000000+256M),pmon起來後,只能使用低端256M實體記憶體

kseg1:0xA000 0000 - 0xBFFF FFFF(512M):高3位清零就是對應的實體地址,對映到連續的低端512M實體地址。該地址空間不通過快取記憶體存取,該區域主要用做I/O暫存器,系統ROM和啟動時入口向量(0xBFC00000)就存於這個地址段內,因為系統啟動時cache還未進行初始化。

kseg1:0xC000 0000 - 0xFFFF FFFF (1G):該地址段只能在核心態使用,並且需要經過MMU轉換

相關文章