物理地址相关说明

来源:互联网 发布:matlab数据分析 编辑:程序博客网 时间:2024/06/06 17:26
steppingstone中的4K代码一个很重要的任务是,将nandflash的最前面区域的bootloader拷贝到SDRAM中去。那么拷贝到SDRAM中的bootloade代码的物理起始地址是多少,这个起始地址是程序员能控制的吗?如果能,怎么控制?

针对这个问题有不同的说法:

1、起始地址要看你mmu的配置,不同处理器都不一样的。

地址肯定可以控制,用链接脚本控制,你可以查查链接脚本相关信息。

2、这个地址是编译的时候定义在一个文件里面的,不同的平台略微不一样。
你可以搜索TEXT_BASE的定义,一般是这个。

3、这个4k是可以控制的
这个地址一般存在与scatter文件中
如果没有就是在编译之前的编译选项里面设置的

4、bootloader运行地址是程序员可以控制的。

首先,要根据处理器的datasheet上的address map来确定sdram的地址空间,然后选择一个sdram上的起始地址,比如0x8000。

其次,编译bootloader时来指定程序的链接地址,这个连接器ld有参数-Ttext来指定,如-Ttext=0x8000。
像uboot,可以配置CONFIG_SYS_TEXT_BASE,其实也是在ld时添加了-Ttext。

最后,程序的链接地址 加载地址 运行地址是一致的。
配置4k代码,让其将bootloader从nand中搬运到0x8000地址上,跳转到0x8000运行就可以了。搬运到sdram其他地址是不能正常运行的。

5、上面的回答都很好,初始地址都是将程序从NAND中前4KB复制到SDRAM中,然后从0开始执行。
下面是一个非常重要的概念:位置无关代码和位置相关代码;具体可以百度
然后如果一直是位置无关代码,然后就一直从0开始到4KB执行;
但是因为很多指令都是位置相关的计算和我们的程序太大了,超过4KB,地址不够了,所以才需要我们跑到DDR中,但是我们的程序还在NAND中,下面还需要作两个工作:初始化DDR和将NAND中程序放到DDR中;

6、

SDRAM的地址映射方式BRC(Bank Row Column)和RBC(Row Bank Column)

https://www.crifan.com/detailed_sdram_address_mapping_brc_bank_row_column_and_rbc_row_bank_column/   可以看看


在实际的mtk平台,如kernel是加载到sdram的什么物理地址出运行的?

Kernel的入口函数是哪个,入口地址在哪,需要根据连接脚本来确定。
在arch/arm/kernel/vmlinux.lds.S,如下:

[plain] view plain copy
  1. OUTPUT_ARCH(arm)  
  2. ENTRY(stext)  
  3.   
  4. #ifndef __ARMEB__  
  5. jiffies = jiffies_64;  
  6. #else  
  7. jiffies = jiffies_64 + 4;  
  8. #endif  
  9.   
  10. SECTIONS  
  11. {  
  12. ........  
  13. #ifdef CONFIG_XIP_KERNEL  
  14.     . = XIP_VIRT_ADDR(CONFIG_XIP_PHYS_ADDR);  
  15. #else  
  16.     . = PAGE_OFFSET + TEXT_OFFSET;  
  17. #endif  
  18. }  
入口函数是head.S中的stext,不采用XIP技术,入口地址是PAGE_OFFSET+TEXT_OFFSET。
./arch/arm/include/asm/memory.h中:
[plain] view plain copy
  1. #define PAGE_OFFSET     UL(CONFIG_PAGE_OFFSET)  
  2. Menuconfig中CONFIG_PAGE_OFFSET = 0xc0000000  
  3. ./arch/arm/Makefile中:  
  4. textofs-y   := 0x00008000  
  5. textofs-$(CONFIG_ARCH_CLPS711X) := 0x00028000  
  6. # We don't want the htc bootloader to corrupt kernel during resume  
  7. textofs-$(CONFIG_PM_H1940)      := 0x00108000  
  8. # SA1111 DMA bug: we don't want the kernel to live in precious DMA-able memory  
  9. ifeq ($(CONFIG_ARCH_SA1100),y)  
  10. textofs-$(CONFIG_SA1111) := 0x00208000  
  11. endif  
  12. textofs-$(CONFIG_ARCH_MSM7X30) := 0x00208000  
  13. textofs-$(CONFIG_ARCH_MSM8X60) := 0x00208000  
  14. textofs-$(CONFIG_ARCH_MSM8960) := 0x00208000  
  15. ......  
  16. # The byte offset of the kernel image in RAM from the start of RAM.  
  17. TEXT_OFFSET := $(textofs-y)  
入口地址是0xc0008000.
但是实际操作中,kernel是加载到0x80008000地址运行的。
(我使用处理器sdram物理起始地址是0x80000000)

在mtk实际代码中:/arch/arm/include/asm/memory.h中:

#define PLAT_PHYS_OFFSET    UL(CONFIG_PHYS_OFFSET)

#ifndef __ASSEMBLY__

/*
 * Physical vs virtual RAM address space conversion.  These are
 * private definitions which should NOT be used outside memory.h
 * files.  Use virt_to_phys/phys_to_virt/__pa/__va instead.
 *
 * PFNs are used to describe any physical page; this means
 * PFN 0 == physical address 0.
 */
#if defined(__virt_to_phys)
#define PHYS_OFFSET    PLAT_PHYS_OFFSET
#define PHYS_PFN_OFFSET    ((unsigned long)(PHYS_OFFSET >> PAGE_SHIFT))

#define virt_to_pfn(kaddr) (__pa(kaddr) >> PAGE_SHIFT)


在logd打印信息中:

[20:25:42.208] [PLFM] boot to LK by ATAG.
[20:25:42.208] boot reason: 0
[20:25:42.208] boot mode: 0
[20:25:42.214] META COM0: 0
[20:25:42.214] rank[0] size: 0x1E6C0000
[20:25:42.214] rank[1] size: 0x20000000
[20:25:42.214] rank[2] size: 0x40000000
[20:25:42.214] tee reserved mem: 0x000000005E6C0000, 0x0000000001940000
[20:25:42.214] md_type[0]: 0x0
[20:25:42.214] md_type[1]: 0x0
[20:25:42.214] boot time: 752
[20:25:42.214] DDR reserve mode: enable = 0, success = 0
[20:25:42.214] dram buffer size: 1688768
[20:25:42.214] SMC: 0x0
[20:25:42.214] LK: 0x6
[20:25:42.214] KERNEL: 0x4
[20:25:42.214] NONSEC SRAM Addr: 0x10DC00
[20:25:42.214] NONSEC SRAM Size: 0x4000


[20:25:42.246] [TZ_INIT] Jump to ATF, then 0x5E700000 and 0x41E00000


[20:25:42.238] [BLDR] Others, jump to ATF
[20:25:42.238]
[20:25:42.238] [BLDR] jump to 0x41E00000


20:25:42.297] INFO:    BL3-1: Preparing for EL3 exit to normal world, LK
[20:25:42.297] INFO:    BL3-1: Next image address = 0x41e00000


[20:25:45.358] [LK]jump to K64 0x40080000

[20:25:45.370] INFO:    BL3-1: Next image address = 0x40080000