歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

uclinux-2008R1-RC8(bf561)到VDSP5的移植(19):li2040

在添加了.init段之後,VDSP報告li2040警告:

[Warning li2040] "./uclinux-2008r1-rc8.ldf":690 Due to memory fragmentation, output section '.init' in processor 'p0' was mapped discontinuously.
Use FORCE_CONTIGUITY command to ensure that output section is mapped continuously.
Use NO_FORCE_CONTIGUITY command if contiguity does not matter in this output section.

查了一下li2040,VDSP的解釋是:

For most mapping operations, code and data from an object file are mapped contiguously, and input sections are mapped in the order specified inside the output section. If you have mapped an object into a location that causes a fragmentation of memory, the linker may map an object into the gap in such a way that code or data is no longer contiguous. Because of the fragmentation, the linker may also place input sections into memory in an order that is different from the order in which they appear in the output section. The linker warns that the mapping is not contiguous.
An additional (and probably more common) case of non-contiguous placement is when the sections are not mapped in the order specified in the LDF. Such a case might have nothing to do with internal fragmentation.

給出的解決方法是:

How to Fix
The LDF command FORCE_CONTIGUITY forces the linker to keep the variables contiguous. Using the FORCE_CONTIGUITY command may result in unused space in the output section.
You can indicate that it is not important that code and data objects are contiguous by using the LDF command NO_FORCE_CONTIGUITY. In the first example above, if the LDF file contained the NO_FORCE_CONTIGUITY command, the linker would not issue the warning.
If contiguous placement is not important in any of the output section, disable the warning by using the -w2040 command-line switch.

因為uclinux內核在啟動完成後需要將.init段占用的空間回收,所以它必須是獨立的,在此我選擇使用NO_FORCE_CONTIGUITY命令,.init段就變成了:

.init
{
NO_FORCE_CONTIGUITY
___init_begin = .;

//.init.text
INPUT_SECTION_ALIGN(4096)
. = (. + 4095) / 4096 * 4096;
__sinittext = .;
INPUT_SECTIONS($LIBRARIES_CORE_A(.init.text))
__einittext = .;

//.init.data
INPUT_SECTION_ALIGN(16)
INPUT_SECTIONS($LIBRARIES_CORE_A(.init.data))

} > MEM_SDRAM

Copyright © Linux教程網 All Rights Reserved