uclinux-2008R1.5-RC3(bf561)到VDSP5的移植(52):__ebss_l1

 

快乐虾

http://blog.csdn.net/lights_joy/

lights@hb165.com

 

本文适用于

ADI bf561 DSP

优视BF561EVB开发板

uclinux-2008r1.5-rc3(smp patch)

Visual DSP++ 5.0(update 5)

 

欢迎转载,但请保留作者信息

 

有一个链接错误:

[Error li1021]  The following symbols referenced in processor 'p0' could not be resolved:

        '_ebss_l1 [__ebss_l1]' referenced from 'arch-kernel.dlb[setup.doj]'

        '_sdata_l1 [__sdata_l1]' referenced from 'arch-kernel.dlb[setup.doj]'

引发这个链接错误的原因在setup_arch函数的末尾,有这样的语句:

 

     /* Copy atomic sequences to their fixed location, and sanity check that

        these locations are the ones that we advertise to userspace.  */

     memcpy((void *)FIXED_CODE_START, &fixed_code_start,

            FIXED_CODE_END - FIXED_CODE_START);

     BUG_ON((char *)&sigreturn_stub - (char *)&fixed_code_start

            != SIGRETURN_STUB - FIXED_CODE_START);

     BUG_ON((char *)&atomic_xchg32 - (char *)&fixed_code_start

            != ATOMIC_XCHG32 - FIXED_CODE_START);

     BUG_ON((char *)&atomic_cas32 - (char *)&fixed_code_start

            != ATOMIC_CAS32 - FIXED_CODE_START);

     BUG_ON((char *)&atomic_add32 - (char *)&fixed_code_start

            != ATOMIC_ADD32 - FIXED_CODE_START);

     BUG_ON((char *)&atomic_sub32 - (char *)&fixed_code_start

            != ATOMIC_SUB32 - FIXED_CODE_START);

     BUG_ON((char *)&atomic_ior32 - (char *)&fixed_code_start

            != ATOMIC_IOR32 - FIXED_CODE_START);

     BUG_ON((char *)&atomic_and32 - (char *)&fixed_code_start

            != ATOMIC_AND32 - FIXED_CODE_START);

     BUG_ON((char *)&atomic_xor32 - (char *)&fixed_code_start

            != ATOMIC_XOR32 - FIXED_CODE_START);

     BUG_ON((char *)&safe_user_instruction - (char *)&fixed_code_start

         != SAFE_USER_INSTRUCTION - FIXED_CODE_START);

在这里,FIXED_CODE_START等几个定义都在include/asm/fixed_code.h中:

///* This file defines the fixed addresses where userspace programs can find

//   atomic code sequences.  */

//

#define FIXED_CODE_START    0x400

//

#define SIGRETURN_STUB      0x400

//

#define ATOMIC_SEQS_START   0x410

//

#define ATOMIC_XCHG32       0x410

#define ATOMIC_CAS32        0x420

#define ATOMIC_ADD32        0x430

#define ATOMIC_SUB32        0x440

#define ATOMIC_IOR32        0x450

#define ATOMIC_AND32        0x460

#define ATOMIC_XOR32        0x470

//

#define ATOMIC_SEQS_END     0x480

//

#define SAFE_USER_INSTRUCTION   0x480

//

#define FIXED_CODE_END      0x490

//

fixed_code_start则是arch/ blackfin/ kernel/fixed_code.s中定义的一个符号。在fixed_code.s中有一段说明:

/*

 * This file contains sequences of code that will be copied to a

 * fixed location, defined in <asm/atomic_seq.h>.  The interrupt

 * handlers ensure that these sequences appear to be atomic when

 * executed from userspace.

 * These are aligned to 16 bytes, so that we have some space to replace

 * these sequences with something else (e.g. kernel traps if we ever do

 * BF561 SMP).

 */

但是实在不明白为什么要将这些代码复制到这个固定的位置??

这段代码引发的__ebss_l1符号链接错误,它的定义在vmlinux.lds.s中:

#if L1_DATA_A_LENGTH

# define LDS_L1_A_DATA  *(.l1.data)

# define LDS_L1_A_BSS   *(.l1.bss)

# define LDS_L1_A_CACHE *(.data_l1.cacheline_aligned)

#else

# define LDS_L1_A_DATA

# define LDS_L1_A_BSS

# define LDS_L1_A_CACHE

#endif

.data_l1 L1_DATA_A_START : AT(LOADADDR(.text_l1) + SIZEOF(.text_l1))

     {

         . = ALIGN(4);

         __sdata_l1 = .;

         LDS_L1_A_DATA

         __edata_l1 = .;

 

         . = ALIGN(4);

         __sbss_l1 = .;

         LDS_L1_A_BSS

 

         . = ALIGN(32);

         LDS_L1_A_CACHE

 

         . = ALIGN(4);

         __ebss_l1 = .;

     }

很明显,它将L1_DATA_A这块内存划分为普通数据,BSS数据和CACHE

因此相应地在LDF文件中进行修改:

      L1_data_a_1

      {

         INPUT_SECTION_ALIGN(4)

         ___l1_data_cache_a = 0;

         INPUT_SECTIONS($OBJECTS_CORE_A(L1_data_a) $LIBRARIES_CORE_A(L1_data_a))

         INPUT_SECTIONS($OBJECTS_CORE_A(.data_l1.cacheline_aligned) $LIBRARIES_CORE_A(.data_l1.cacheline_aligned))

        

         /*$VDSG<insert-input-sections-at-the-start-of-l1_data_a>  */

         /* Text inserted between these $VDSG comments will be preserved */

         /*$VDSG<insert-input-sections-at-the-start-of-l1_data_a>  */

        

         RESERVE(heaps_and_stack_in_L1_data_a, heaps_and_stack_in_L1_data_a_length = 2048,4)

      } > MEM_A_L1_DATA_A

 

      L1_data_a_bsz ZERO_INIT

      {

         INPUT_SECTION_ALIGN(4)

         INPUT_SECTIONS( $OBJECTS_CORE_A(L1_bsz) $LIBRARIES_CORE_A(L1_bsz))

      } > MEM_A_L1_DATA_A

 

      L1_data_a

      {

         INPUT_SECTION_ALIGN(4)

               __sdata_l1 = .;

               

               INPUT_SECTIONS($OBJECTS_CORE_A{DualCoreMem("CoreA")}(cplb_data) $LIBRARIES_CORE_A{DualCoreMem("CoreA")}(cplb_data))

         INPUT_SECTIONS($OBJECTS_CORE_A(cplb_data) $LIBRARIES_CORE_A(cplb_data))

         INPUT_SECTIONS($OBJECTS_CORE_A(voldata) $LIBRARIES_CORE_A(voldata))

         INPUT_SECTIONS($OBJECTS_CORE_A(constdata) $LIBRARIES_CORE_A(constdata))

         INPUT_SECTIONS($OBJS_LIBS_INTERNAL_CORE_A(data1))

         INPUT_SECTIONS($OBJS_LIBS_NOT_EXTERNAL_CORE_A(data1))

         INPUT_SECTIONS($OBJECTS_CORE_A(data1) $LIBRARIES_CORE_A(data1))

         INPUT_SECTIONS($OBJECTS_CORE_A(.edt) $LIBRARIES_CORE_A(.edt))

         INPUT_SECTIONS($OBJECTS_CORE_A(.cht) $LIBRARIES_CORE_A(.cht))

         INPUT_SECTIONS($OBJECTS_CORE_A(.l1.data) $LIBRARIES_CORE_A(.l1.data))

        

         /*$VDSG<insert-input-sections-at-the-end-of-l1_data_a>  */

         /* Text inserted between these $VDSG comments will be preserved */

         /*$VDSG<insert-input-sections-at-the-end-of-l1_data_a>  */

               __edata_l1 = .;

      } > MEM_A_L1_DATA_A

 

      bsz_L1_data_a ZERO_INIT

      {

         INPUT_SECTION_ALIGN(4)

               __sbss_l1 = .;

               

               INPUT_SECTIONS($OBJECTS_CORE_A(bsz) $LIBRARIES_CORE_A(bsz))

               INPUT_SECTIONS($OBJECTS_CORE_A(.l1.bss) $LIBRARIES_CORE_A(.l1.bss))

               

               __ebss_l1 = .;

             

      } > MEM_A_L1_DATA_A

 

      L1_data_a_stack_heap

      {

         INPUT_SECTION_ALIGN(4)

         RESERVE_EXPAND(heaps_and_stack_in_L1_data_a, heaps_and_stack_in_L1_data_a_length , 0, 4)

         ldf_heap_space = heaps_and_stack_in_L1_data_a;

         ldf_heap_end = (ldf_heap_space + (heaps_and_stack_in_L1_data_a_length - 4)) & 0xfffffffc;

         ldf_heap_length = ldf_heap_end - ldf_heap_space;

      } > MEM_A_L1_DATA_A

在这里仍然保留了VDSP向导对heap的定义,因为不知道要引用的VDSP库中是否要使用malloc这样的函数来分配内存。

 

 

1       参考资料

uclinux-2008R1.5-RC3(bf561)VDSP5的移植(47)per_cpu的奇怪问题(2009-1-22)

uclinux-2008R1.5-RC3(bf561)VDSP5的移植(48)__start___param(2009-1-22)

uclinux-2008R1.5-RC3(bf561)VDSP5的移植(49)likely(2009-1-24)

uclinux-2008R1.5-RC3(bf561)VDSP5的移植(50).spinlock.text(2009-1-24)

uclinux-2008R1.5-RC3(bf561)VDSP5的移植(51)CONFIG_LOG_BUF_SHIFT(2009-1-24)

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌云阁主

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值