物理地址相关说明
来源:互联网 发布:matlab数据分析 编辑:程序博客网 时间:2024/06/06 17:26
针对这个问题有不同的说法:
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,如下:
- OUTPUT_ARCH(arm)
- ENTRY(stext)
- #ifndef __ARMEB__
- jiffies = jiffies_64;
- #else
- jiffies = jiffies_64 + 4;
- #endif
- SECTIONS
- {
- ........
- #ifdef CONFIG_XIP_KERNEL
- . = XIP_VIRT_ADDR(CONFIG_XIP_PHYS_ADDR);
- #else
- . = PAGE_OFFSET + TEXT_OFFSET;
- #endif
- }
./arch/arm/include/asm/memory.h中:
- #define PAGE_OFFSET UL(CONFIG_PAGE_OFFSET)
- Menuconfig中CONFIG_PAGE_OFFSET = 0xc0000000
- ./arch/arm/Makefile中:
- textofs-y := 0x00008000
- textofs-$(CONFIG_ARCH_CLPS711X) := 0x00028000
- # We don't want the htc bootloader to corrupt kernel during resume
- textofs-$(CONFIG_PM_H1940) := 0x00108000
- # SA1111 DMA bug: we don't want the kernel to live in precious DMA-able memory
- ifeq ($(CONFIG_ARCH_SA1100),y)
- textofs-$(CONFIG_SA1111) := 0x00208000
- endif
- textofs-$(CONFIG_ARCH_MSM7X30) := 0x00208000
- textofs-$(CONFIG_ARCH_MSM8X60) := 0x00208000
- textofs-$(CONFIG_ARCH_MSM8960) := 0x00208000
- ......
- # The byte offset of the kernel image in RAM from the start of RAM.
- TEXT_OFFSET := $(textofs-y)
但是实际操作中,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
- 物理地址相关说明
- 虚拟地址与物理地址的相关概念
- 物理地址
- 物理地址
- 相关说明
- 页描述符与物理地址(相关主题帖子总结)
- 总线地址、物理地址、虚拟地址相关概念澄清
- 页描述符与物理地址(相关主题帖子总结)
- GPIO驱动相关函数及物理地址,虚拟地址映射
- 总线地址、物理地址、虚拟地址相关概念澄清
- 总线地址、物理地址、虚拟地址相关概念澄清
- 总线地址、物理地址、虚拟地址相关概念澄清
- 总线地址、物理地址、虚拟地址相关概念澄清
- CMPP相关参数说明
- QT相关名词说明
- SOCKET相关API说明
- logrotate相关说明
- const 相关说明
- 矩阵乘法
- list编码问题python-2.7
- PHP 5 SimpleXML 函数
- java的System.getProperty()方法可以获取的值,仅供参考
- Android基础_帧动画 补间动画 属性动画(十一)
- 物理地址相关说明
- 十五、基础教程-图表缩放(Zoom)
- java 浮点类型计算
- 二维码研究摘要
- Mina中遇到SLF4J: Failed to load class的问题及解决
- addslashes 和 stripslashes
- Linux下lvm中PV丢失找回方法
- 监控setOutsideTouchable点击
- android Inflater