看板 LinuxDev 關於我們 聯絡資訊
新手移植系統遇到一些問題, 卡一段時間了, 求助一下 移植 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
askacis:alloc_bootmem應該是可以用,我從2.6x到3.x都是這樣挖 07/11 16:54
askacis:只是你呼叫的時間點要在kernel剛起來記憶體還沒配置完全 07/11 16:55
askacis:拿到的位置直接轉physical addr就可以用了~ 07/11 16:56
askacis:我們硬體更誇張,需要連續記憶體都要一兩百MB的~ 07/11 16:58
mayasky:來個CODEDUMP和SOURCE CODE大家會比較好幫你 07/12 16:44
mayasky:COREDUMP 07/12 17:17
enthos:http://rick.vanrein.org/linux/badram/ (For fun.) 07/13 01:48