龍芯2Fcpu內部實體地址的轉換

2021-06-07 13:38:20 字數 1266 閱讀 7632

在經過tlb或者特有機制之後,虛擬位址被轉化成實體地址。這個實體地址是不能被外設直接使用的,要經過一些轉化。

對於龍芯,32位的位址使用現在只殘存於bios中。核心都是使用64bit的位址。

在經過cpu的cache和tlb轉換後,cpu-core出來的位址(就是我們常說的實體地址)還要經過一層轉化。

cpu的位址轉換靠的是4個cpu視窗。其中win0,win2是給ddr2對映的,win1,win3是給pci/localio對映的。

每個win都有3個暫存器組成,base,mask,mmap.其中win0和win1一般是使用開機預設的,win0預設的base為0,mask表徵大小為256mb,mmap為0,win1的base為0x1000_0000,mask表徵大小為256mb,mmap為0x1000_0001,mmap的末尾為0表示對映到ddr2,為1表示對映到pci或者cpu的內部資源(pmon,interrupt,uart等)。在bios中,只使用預設的前面兩個視窗,所以在bios中只能使用256mb記憶體,256mb的pci空間(實際是192mb),另外的win2,win3在核心**中設定在arch/mips/lemote/lm2f/common/pci.c中和

arch/mips/lemote/lm2f/common/pci.c中的那些內嵌彙編就是了。

設定暫存器的起始位址是0x900000003ff00000,這個位址屬於xkphy段,位址的解析規則在2fcpu的手冊上表述為」對xkphy的訪問不經過tlb進行位址變換,而是將虛擬位址的bit0~bit39作為實體地址,bit59~bit61控制是否通過cache和cache的一致性屬性。「0x900000003ff00000,可見這個9是用於一致性屬性標識的,實際位址反正是0x3ff00000。這個位址在512m~1g內。實際上實體地址在512m和1g之間是非常特殊的。這個區域的位址不在任一cpu視窗內,實際上設定cpu視窗的暫存器就在這個位址範圍。應該是特殊處理的了。

在setup.c中設定了win2,設定基位址為0x0000000080000000,大小2g,mmap也是2g(可見龍芯2f最大支援2g記憶體,這個段和win0是衝突的,這個通過add_memory_region(0x90000000, highmemsize << 20, boot_mem_ram);這句來解決,就是把程式位址搞成從0x90000000開始,這樣留出win0占用的256mb,就不衝突了)。

在pci.c中設定了win3,base為0x40000000,大小1g,mmap為0x40000001。就是高記憶體部分。

好了。這是實體地址經過的第一次轉換,如果轉換後的位址末尾為0,發往ddr2模組,否則發往另一條路。

龍芯軟體開發 12 龍芯2E摸索前行

上一次說到怎麼樣執行起來,現在接著上次再進行分析下去。在 locate的程式,如下 locate la s0,start subu s0,ra,s0 ands0,0xffff0000 li t0,sr boot exc vec mtc0 t0,cop 0 status reg mtc0 zero,c...

龍芯2k除錯記錄

記 搞到了一塊龍芯的2k的板子,然後開始寫elf,隨即除錯電腦藍屏,重啟,又藍屏數十次。錯誤記錄 軟體問題 除錯時採用的是putty,隨即發生藍屏,因此更換成了sscom32,同時串列埠也不停傳送rx接收控制代碼 除錯資訊 傳送速率過快,但未導致電腦宕機,初步判定電腦宕機為putty軟體問題。硬體問...

關閉龍芯2E 之 cache

發表日期 2006 11 01 19 50 pmon 載入kernel 時,是載入到 kseg0 的 通過在 arch mips makefile 中 load config godsonev2e 0x80100000 指定 該位址空間是 unmaped cached 的,當 pmon 將控制權交給...