在以前的實現中,沒有手工對SDRAM分段,當內核小時還沒有發現問題,但當內核越來越大時,就開始出現問題了。主要表現為vdsp5在鏈接時,會自動將一些比較小的變量或者代碼段塞到空隙的地方,即使在output_section中加上FORCE_CONTIGUITY也沒有效果。
比如
___per_cpu_start = .;
INPUT_SECTIONS($LIBRARIES_UCLINUX(.data.percpu))
___per_cpu_end = .;
最後發現.data.percpu裡面的這些內容被轉移到其它的角落裡去了,而__per_cpu_start和__per_cpu_end則完全指向同一個地方,這樣必然造成內核運行的失敗。
為解決這個問題,直接在LDF文件中手工對SDRAM進行分段:
MEM_SDRAM_TEXT { TYPE(RAM) START(0x00004000) END(0x00013fff) WIDTH(8) }
MEM_SDRAM_RODATA { TYPE(RAM) START(0x00014000) END(0x00023fff) WIDTH(8) }
MEM_SDRAM_DATA { TYPE(RAM) START(0x00034000) END(0x00043fff) WIDTH(8) }
MEM_SDRAM_INIT_TEXT { TYPE(RAM) START(0x00044000) END(0x00053fff) WIDTH(8) }
MEM_SDRAM_INIT_PERCPU { TYPE(RAM) START(0x00054000) END(0x00063fff) WIDTH(8) }
MEM_SDRAM { TYPE(RAM) START(0x00064000) END(0x03ffffff) WIDTH(8) }
再將這些段的代碼或者數據放到相應的內存空間去。
當內核增大時,手工調整以上的內存范圍。
uclinux-2008R1-RC8(bf561)到VDSP5的移植(62)
uclinux-2008R1-RC8(bf561)到VDSP5的移植(61):KBUILD_MODNAME
uclinux-2008R1-RC8(bf561)到VDSP5的移植(60):current_text_addr
uclinux-2008R1-RC8(bf561)到VDSP5的移植(58)
uclinux-2008R1-RC8(bf561)到VDSP5的移植(57)
uclinux-2008R1-RC8(bf561)到VDSP5的移植(56):__grab_cache_page
uclinux-2008R1-RC8(bf561)到VDSP5的移植(49):kernel_thread_helper的問題