[問題] 移植系統 保留一塊記憶體問題

看板LinuxDev作者 (夏天)時間10年前 (2014/07/11 01:23), 編輯推噓2(205)
留言7則, 3人參與, 最新討論串1/1
新手移植系統遇到一些問題, 卡一段時間了, 求助一下 移植 linux kernel driver 需要一塊20M上下的 physical 連續的記憶體給硬體使用 參考的程式是直接 platform_get_resource(pdev, IORESOURCE_MEM, 0); 然後拿得到的 physical addr? 印出來的位置是 0xbe......~0xbf 直接轉換 ioremap 得到 virtual addr 就一路操作下去 我仿造直接拿 0xbe......~0xbf...... 去做 ioremap 結果失敗, 印一堆 kernel message 查了一下 http://lxr.free-electrons.com/source/arch/arm/mm/ioremap.c#L334 287 if (size && !(sizeof(phys_addr_t) == 4 && pfn >= 0x100000)) { 288 struct static_vm *svm; 289 290 svm = find_static_vm_paddr(paddr, size, mtype); 291 if (svm) { 292 addr = (unsigned long)svm->vm.addr; 293 addr += paddr - svm->vm.phys_addr; 294 return (void __iomem *) (offset + addr); 295 } 296 } 297 298 /* 299 * Don't allow RAM to be mapped - this causes problems with ARMv6+ 300 */ 301 if (WARN_ON(pfn_valid(pfn))) 302 return NULL; 印log對起來是 svm=find_static_vm_paddr 就得到 0 然後 pfn_valid(pfn) = 1, 然後就印了訊息直接 return NULL 覺得少做了一些事所以這樣失敗, 一直亂試還沒結果 是因為沒有保留一塊記憶體, 還是少建立對應表, 還是少做哪些事? 網路上查詢要在一開始保留大塊記憶體大部分做法是 alloc_bootmem(size) 或是開機設定 kernel 參數 mem=xx alloc_bootmem(size) 試過了目前還是失敗 回傳的位置已是 virtual addr 轉成 physical addr 就可用 不用在 ioremap 還甚麼設定就直接用? 開機設定 kernel 參數這部分還沒試過 這個就直接用 ioremap 轉換一個 physical addr 就可以用嗎? 實在不懂, 有沒有甚麼方向可參考, 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.251.204.140 ※ 文章網址: http://www.ptt.cc/bbs/LinuxDev/M.1405013031.A.827.html

07/11 16:54, , 1F
alloc_bootmem應該是可以用,我從2.6x到3.x都是這樣挖
07/11 16:54, 1F

07/11 16:55, , 2F
只是你呼叫的時間點要在kernel剛起來記憶體還沒配置完全
07/11 16:55, 2F

07/11 16:56, , 3F
拿到的位置直接轉physical addr就可以用了~
07/11 16:56, 3F

07/11 16:58, , 4F
我們硬體更誇張,需要連續記憶體都要一兩百MB的~
07/11 16:58, 4F

07/12 16:44, , 5F
來個CODEDUMP和SOURCE CODE大家會比較好幫你
07/12 16:44, 5F

07/12 17:17, , 6F
COREDUMP
07/12 17:17, 6F

07/13 01:48, , 7F
07/13 01:48, 7F
文章代碼(AID): #1JlimdWd (LinuxDev)