ARM汇编---程序获取符号的物理地址

发布者:幸福的人生最新更新时间:2024-12-23 来源: cnblogs关键字:ARM  物理地址 手机看文章 扫描二维码
随时随地手机看文章

在移植u-boot的过程看到过u-boot在重定向时的实现,当时不知道怎么就觉得很好理解就把这个知识点没怎么深入的理解,最近在看华为的鸿蒙OS在Cortex-A平台上的实现过程时再次遇到一时间看不太懂了,所以花了点时间研究了一下这里做一下记录,后续有时间再把u-boot的实现再复盘一下加深理解。具体的代码如下


  1 /*

  2  * Copyright (c) 2013-2019, Huawei Technologies Co., Ltd. All rights reserved.

  3  * Copyright (c) 2020, Huawei Device Co., Ltd. All rights reserved.

  4  *

  5  * Redistribution and use in source and binary forms, with or without modification,

  6  * are permitted provided that the following conditions are met:

  7  *

  8  * 1. Redistributions of source code must retain the above copyright notice, this list of

  9  *    conditions and the following disclaimer.

 10  *

 11  * 2. Redistributions in binary form must reproduce the above copyright notice, this list

 12  *    of conditions and the following disclaimer in the documentation and/or other materials

 13  *    provided with the distribution.

 14  *

 15  * 3. Neither the name of the copyright holder nor the names of its contributors may be used

 16  *    to endorse or promote products derived from this software without specific prior written

 17  *    permission.

 18  *

 19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS

 20  * 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,

 21  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR

 22  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR

 23  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,

 24  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,

 25  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;

 26  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,

 27  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR

 28  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF

 29  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

 30  */

 31 

 32 #define  ASSEMBLY

 33 #include 'arch_config.h'

 34 #include 'los_vm_boot.h'

 35 #include 'los_vm_zone.h'

 36 #include 'los_mmu_descriptor_v6.h'

 37 #undef ASSEMBLY

 38 

 39 

 40     .global __exc_stack_top

 41     .global __irq_stack_top

 42     .global __fiq_stack_top

 43     .global __svc_stack_top

 44     .global __abt_stack_top

 45     .global __undef_stack_top

 46     .global __exc_stack

 47     .global __irq_stack

 48     .global __fiq_stack

 49     .global __svc_stack

 50     .global __abt_stack

 51     .global __undef_stack

 52 

 53     .extern __bss_start

 54     .extern __bss_end

 55     .extern hal_clock_initialize_start

 56     .extern los_bss_init

 57     .extern _osExceptFiqHdl

 58     .extern _osExceptAddrAbortHdl

 59     .extern _osExceptDataAbortHdl

 60     .extern _osExceptPrefetchAbortHdl

 61     .extern _osExceptSwiHdl

 62     .extern _osExceptUndefInstrHdl

 63     .extern __stack_chk_guard_setup

 64     .extern g_firstPageTable

 65     .extern g_mmuJumpPageTable

 66 

 67     .equ MPIDR_CPUID_MASK, 0xffU

 68 

 69     .fpu vfpv4

 70     .arm

 71 

 72 /* param0 is stack bottom, param1 is stack size, r11 hold cpu id */

 73 .macro EXC_SP_SET param0, param1

 74     ldr    r1, =param0

 75     mov    r0, param1

 76     bl     sp_set

 77 .endm

 78 

 79 /* param0 is stack top, param1 is stack size, param2 is magic num */

 80 .macro STACK_MAGIC_SET param0, param1, param2

 81     ldr     r0, =param0

 82     mov     r1, param1

 83     ldr     r2, =param2

 84     bl      excstack_magic

 85 .endm

 86 

 87 /* param0 is physical address, param1 virtual address, param2 is sizes, param3 is flag */

 88 .macro PAGE_TABLE_SET param0, param1, param2, param3

 89     ldr     r6, =param0

 90     ldr     r7, =param1

 91     ldr     r8, =param2

 92     ldr     r10, =param3

 93     bl      page_table_build

 94 .endm

 95     .code   32

 96     .section '.vectors','ax'

 97 

 98 __exception_handlers:

 99     /*

100     *Assumption:  ROM code has these vectors at the hardware reset address.

101     *A simple jump removes any address-space dependencies [i.e. safer]

102     */

103     b   reset_vector

104     b   _osExceptUndefInstrHdl

105     b   _osExceptSwiHdl

106     b   _osExceptPrefetchAbortHdl

107     b   _osExceptDataAbortHdl

108     b   _osExceptAddrAbortHdl

109     b   OsIrqHandler

110     b   _osExceptFiqHdl

111 

112     /* Startup code which will get the machine into supervisor mode */

113     .global reset_vector

114     .type   reset_vector,function

115 reset_vector:

116     /* do some early cpu setup: i/d cache disable, mmu disabled */

117     mrc     p15, 0, r0, c1, c0, 0

118     bic     r0, #(1<<12)

119     bic     r0, #(1<<2 | 1<<0)

120     mcr     p15, 0, r0, c1, c0, 0

121 

122     /* r11: delta of physical address and virtual address */

123     adr     r11, pa_va_offset;此时r11为物理地址  具体原因是硬件决定了第一条指令的地址,当执行到这里pc此时是当前的指令的地址(自然是物理地址)

124                              ;然后而adr伪指令的作用就是得到了当前标识pa_va_offset和当前指令的offset和保存在r11,而代码的实现在这个标识处定

125                              ;义了一个连接地址相关的标识'.'所以按照程序连接指定的运行地址(虚拟的)这里保存的值肯定是连接实际的虚拟运行地址所以r0为虚拟地址

126     ldr     r0, [r11]

127     sub     r11, r11, r0     ;进而物理地址减去虚拟地址(连接地址)即就是物理地址和虚拟地址的差。

128 

129     /* if we need to relocate to proper location or not */

130     adr     r4, __exception_handlers            /* r4: base of load address */

131     ldr     r5, =SYS_MEM_BASE                   /* r5: base of physical address */

132     subs    r12, r4, r5                         /* r12: delta of load address and physical address */

133     beq     reloc_img_to_bottom_done            /* if we load image at the bottom of physical address */

134 

135     /* we need to relocate image at the bottom of physical address */

136     ldr     r7, =__exception_handlers           /* r7: base of linked address (or vm address) */

137     ldr     r6, =__bss_start                    /* r6: end of linked address (or vm address) */

138     sub     r6, r7                              /* r6: delta of linked address (or vm address) */

139     add     r6, r4                              /* r6: end of load address */

140 

141 reloc_img_to_bottom_loop:

142     ldr     r7, [r4], #4

143     str     r7, [r5], #4

144     cmp     r4, r6

145     bne     reloc_img_to_bottom_loop

146     sub     pc, r12

147     nop

148     sub     r11, r11, r12                       /* r11: eventual address offset */

149 

150 reloc_img_to_bottom_done:

151     ldr     r4, =g_firstPageTable               /* r4: physical address of translation table and clear it */

152     add     r4, r4, r11

153     bl      page_table_clear

154 

155     PAGE_TABLE_SET SYS_MEM_BASE, KERNEL_VMM_BASE, KERNEL_VMM_SIZE, MMU_DESCRIPTOR_KERNEL_L1_PTE_FLAGS

156     PAGE_TABLE_SET SYS_MEM_BASE, UNCACHED_VMM_BASE, UNCACHED_VMM_SIZE, MMU_INITIAL_MAP_STRONGLY_ORDERED

[1] [2] [3]
关键字:ARM  物理地址 引用地址:ARM汇编---程序获取符号的物理地址

上一篇:u-boot 移植 --->1、u-boot配置(Kbuild)
下一篇:解决debian (Friendly ARM 嵌入式板)的sudo等一部分命令无法TAB补全

推荐阅读最新更新时间:2025-12-18 12:15

[ARM笔记]虚拟地址和物理地址的关系
对于内核物理内存映射区的虚拟内存,使用virt_to_phys()可以实现内核虚拟地址转化为物理地址,phys_to_virt()可以实现物理地址转化为内核虚拟地址。 #define __virt_to_phys(x) ((x) - PAGE_OFFSET + PHYS_OFFSET) static inline unsigned long virt_to_phys(void *x) { return __virt_to_phys((unsigned long)(x)); } 上面的转换过程的PaGE_OFFSET通常为3GB,而PHYS_OFFSET则定义为DRAM内存的基地址。因此,对于LDD6410电路板
[单片机]
IMX6ULL开发板 初识ARM汇编
我们在学习 Linux 嵌入式开发的时候,了解 ARM 汇编是很有必要的,虽然我们使用汇编编写代码的情况很少,但是有些情况下我们需要简单编写一些汇编程序来协助我们调试板子(因为我们的 i.MX6 UL 终结者开发板使用的 cpu 是 ARM Cortex-A7 架构的,cpu 刚上电必须要运行汇编代码,来初始化 cpu 的一些内部功能,然后设置好 C 语言的环境,才能运行 C 语言),比如一块板子焊接回来,我们烧写镜像没有问题,但是烧写完,串口没有打印信息,不能正常启动,这时我们应该不能确定是软件问题还是硬件问题,我们可以在汇编里面通过点灯(点亮板子上的 led)的方式来确定下 cpu 有没有运行,此时我们就要用到汇编,因为 C
[单片机]
IMX6ULL开发板 初识<font color='red'>ARM</font><font color='red'>汇编</font>
ARM 内核 汇编指令 的 8种 寻址方式
str: store register - 指令将寄存器内容存到内存空间中, ldr: load register 将内存内容加载到通用寄存器, ldr/str 组合来实现ARM CPU 和内存数据的 交换! 1、mov r1,r2; //寄存器r2的内容复制到r1中,寄存器寻址方式,(r1,r2 ARM中的通用寄存器) 2、mov r0,#0xFF00; //数0xFF00复制到r0中,立即寻址方式,(#代表后面跟一个数) 3、mov r0,r1,lsl #3; //将r1中的内容左移三位后传送到r0中,寄存器移位寻址,(LSL(或ASL)可完成对通用寄存器中的内容进行逻辑(或算术)的左移操作) 4、ldr r1, ; //
[单片机]
ARM 汇编指令集 特点之一:条件执行后缀
mov r0,r1; moveq r0,r1;//这句代码是否执行 取决于 上几句代码 的运行结果(最后一次CPSR 寄存器 的 高四位 NZCV 的标志位) 条件后缀执行特点: 1、条件后缀执行是否成立,不是取决于本句代码,而是取决于这句代码之前的代码运行后的结果! 2、条件后缀只是决定本句代码是否执行,并不影响下一句代码。 CPSR : 高四位 解释 N:在结果是有符号的二进制补码情况下,如果结果为负数,则N=1;如果结果为非负数,则N=0。 Z:如果结果为0,则Z=1;如果结果为非零,则Z=0。 C:其设置分一下几种情况: 对于加法指令(包含比较指令CMN),如果产生进位,则C=1;否则C=0。
[单片机]
ARM裸机s5pv210 】汇编开栈跳转 C语言
makefile final.bin: start.o led.o arm-linux-ld -Ttext 0x0 -o start.elf $^ arm-linux-objcopy -O binary start.elf final.bin %.o : %.S arm-linux-gcc -o $@ $ -c -nostdlib    //不连接系统标准启动文件和标准库文件,只把指定的文件传递给连接器 %.o : %.c arm-linux-gcc -o $@ $ -c -nostdlib clean: rm *.o *.elf *.bin -f start.S #define W
[单片机]
arm学习之汇编跳转指令总结
目前所知道的跳转指令有 b,bl,bep,bne. 他们共同点是都是以b开头,首先从字面上分析: b:是Branch,表示分支。 bl:是Branch Link表示带连接的分支。 bep:Branch ,Equal bne:Branch ,Not Equal。 B或BL指令引起处理器转移到 子程序名 处开始执行。两者的不同 之处在于BL指令在转移到子程序执行之前将其下一条指令的地址拷贝到 R14(LR,链接寄存器)。由于BL指令保存了下条指令的地址因此使用指令 MOV PC,LR 即可实现子程序的返回。而B指令则无法实现子程序的返回只能实现 单纯的跳转。用户在编程的时候可根据具体应用选用合适的子程序调用语句。 bep和 b
[单片机]
arm学习笔记五(c/c++与arm汇编混合编程)
常见方式: 1 在c/c++程序中嵌入汇编指令 语法格式: __asm { 汇编语言程序 } 2 在汇编程序中访问c/c++定义的全局变量 示例代码如下: test.c #include stdio.h int gVar_1=12; extern asmDouble(void) int main(void){ printf( original value of gVar_1 is %d ,gVar_1); admDouble(); printf( modified value of gVar_1 is %d ,gVar_1); return 0; } test.s AREA asmfil
[单片机]
Part3_lesson1---ARM汇编编程概述
bootloader以及内核需要使用汇编语言,特别是在初始化的时候!以及在效率要求很高的地方会使用。 汇编程序框架: 其入口在_start处,这个入口需要用一个关键字为.global来声明它是一个全局的标号,那么在外部文件才能够引用到它。 .section表示这是一个段,.text表示这是一个代码段。 简化之后的框架 要调试某个文件是把格式为elf的文件烧写到内存里面去调试。 要下载某个文件是要把格式为二进制的文件烧写到nandflash里面去运行。 start.S文件 makefile文件的编写: all:start.o   arm-linux-ld -Ttext 0x50000000 -o start.elf
[单片机]
Part3_lesson1---<font color='red'>ARM</font><font color='red'>汇编</font>编程概述
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved