歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> uclinux-2008R1-RC8(bf561)到VDSP5的移植(39):鏈接重排

uclinux-2008R1-RC8(bf561)到VDSP5的移植(39):鏈接重排

日期:2017/3/3 16:43:30   编辑:關於Linux

在以前的實現中,沒有手工對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) }

再將這些段的代碼或者數據放到相應的內存空間去。

當內核增大時,手工調整以上的內存范圍。

Copyright © Linux教程網 All Rights Reserved