ecos代码分析(1)
ecos代码分析(1)
前面分析了u-boot,再分析一下ecos,听说ecos比较复杂,所以还是采取挨船下竿的原则,分析u-boot相似的smdk2410这块开发板。
1. 首先找到链接文件
<hal/arm/arm9/smdk2410/v3_0/include/pkgconf/mlt_arm_arm9_smdk2410_romram.ldi>
7 MEMORY
8 {
9 ram : ORIGIN = 0, LENGTH = 0x4000000
10 sram : ORIGIN = 0x40000000, LENGTH = 0x1000
11 }
13 SECTIONS
14 {
15 SECTIONS_BEGIN
16 SECTION_fixed_vectors (ram, 0x20, LMA_EQ_VMA)
17 SECTION_rom_vectors (ram, 0x8000, LMA_EQ_VMA)
18 SECTION_RELOCS (ram, ALIGN (0x1), LMA_EQ_VMA)
19 SECTION_text (ram, ALIGN (0x4), LMA_EQ_VMA)
20 SECTION_fini (ram, ALIGN (0x4), LMA_EQ_VMA)
21 SECTION_rodata (ram, ALIGN (0x4), LMA_EQ_VMA)
22 SECTION_rodata1 (ram, ALIGN (0x4), LMA_EQ_VMA)
23 SECTION_got (ram, ALIGN (0x4), LMA_EQ_VMA)
24 SECTION_fixup (ram, ALIGN (0x4), LMA_EQ_VMA)
25 SECTION_gcc_except_table (ram, ALIGN (0x4), LMA_EQ_VMA)
26 SECTION_data (ram, ALIGN (0x4), LMA_EQ_VMA)
27 SECTION_bss (ram, ALIGN (0x4), LMA_EQ_VMA)
28 CYG_LABEL_DEFN(__heap1) = ALIGN (0x8);
29 SECTIONS_END
30 }
可以看出memory空间的安排 和 sections的安排
其中的宏定义,要看文件
<hal/arm/arch/v3_0/src/arm.ld>
42 STARTUP(vectors.o)
43 ENTRY(reset_vector)
44 INPUT(extras.o)
91 #define SECTIONS_BEGIN \
92 \
93 .debug_aranges 0 : { *(.debug_aranges) } \
94 .debug_pubnames 0 : { *(.debug_pubnames) } \
95 .debug_info 0 : { *(.debug_info) } \
96 .debug_abbrev 0 : { *(.debug_abbrev) } \
97 .debug_line 0 : { *(.debug_line) } \
98 .debug_frame 0 : { *(.debug_frame) } \
99 .debug_str 0 : { *(.debug_str) } \
100 .debug_loc 0 : { *(.debug_loc) } \
101 .debug_macinfo 0 : { *(.debug_macinfo) } \
102 .note.arm.ident 0 : { KEEP (*(.note.arm.ident)) } \
103 /DISCARD/ 0 : { *(.fini_array*) }
345 #define SECTION_bss(_region_, _vma_, _lma_) \
346 .bss _vma_ : _lma_ \
347 { __bss_start = ABSOLUTE (.); \
348 *(.scommon) *(.dynsbss) *(.sbss*) *(.gnu.linkonce.sb.*) \
349 *(.dynbss) *(.bss*) *(.gnu.linkonce.b.*) *(COMMON) \
350 __bss_end = ABSOLUTE (.); } \
351 > _region_
353 #define SECTIONS_END . = ALIGN(4); _end = .; PROVIDE (end = .);
编译过程中会看到
165 arm-eabi-gcc -E -P -Wp,-MD,target.tmp -xc -I/usr/local/ecos/ecos-3.0/build/install/include -I/usr/local/ecos/ecos-3.
0/packages/hal/arm/arch/v3_0 -I/usr/local/ecos/ecos-3.0/packages/hal/arm/arch/v3_0/src -I/usr/local/ecos/ecos-3.0/pac
kages/hal/arm/arch/v3_0/tests -I. -finline-limit=7000 -mcpu=arm9 -Wall -Wpointer-arith -Wstrict-prototypes -Winline -
Wundef -g -O2 -ffunction-sections -fdata-sections -fno-exceptions -mno-thumb-interwork -o /usr/local/ecos/ecos-3.
0/build/install/lib/target.ld /usr/local/ecos/ecos-3.0/packages/hal/arm/arch/v3_0/src/arm.ld
将arm.ld编译生成target.ld,这个作为最终生成文件的链接文件
170 arm-eabi-gcc --no-target-default-spec -Wl,--gc-sections -Wl,-static -g -O2 -nostdlib -mno-thumb-interwork -L/usr/loca
l/ecos/ecos-3.0/build/install/lib -Ttarget.ld -o /usr/local/ecos/ecos-3.0/build/install/bin/redboot.elf /usr/local/ec
os/ecos-3.0/build/install/lib/version.o
看看最终生成的链接文件
1 STARTUP(vectors.o)
2 ENTRY(reset_vector)
3 INPUT(extras.o)
4 GROUP( libtarget.a libgcc.a libsupc++.a )
9 MEMORY
10 {
11 ram : ORIGIN = 0x20000000, LENGTH = 0x2000000
12 sram : ORIGIN = 0x00200000, LENGTH = 0x4000
13 rom : ORIGIN = 0x10000000, LENGTH = 0x200000
14 }
16 SECTIONS
17 {
18 .debug_aranges 0 : { *(.debug_aranges) } .debug_pubnames 0 : { *(.debug_pubnames) } .debug_info 0 : { *(.debug_in
fo) } .debug_abbrev 0 : { *(.debug_abbrev) } .debug_line 0 : { *(.debug_line) } .debug_frame 0 : { *(.debug_frame) }
.debug_str 0 : { *(.debug_str) } .debug_loc 0 : { *(.debug_loc) } .debug_macinfo 0 : { *(.debug_macinfo) } .note.arm.
ident 0 : { KEEP (*(.note.arm.ident)) } /DISCARD/ 0 : { *(.fini_array*) }
19 .fixed_vectors 0x00200020 : { . = .; KEEP (*(.fixed_vectors)) } > sram
20 .rom_vectors 0x20010000 : { __rom_vectors_vma = ABSOLUTE(.); . = .; KEEP (*(.vectors)) } > ram __rom_vectors_lma
= LOADADDR(.rom_vectors);
21 .rel.text : { *(.rel.text) *(.rel.text.*) *(.rel.gnu.linkonce.t*) } > ram .rela.text : { *(.rela.text) *(.rela.te
xt.*) *(.rela.gnu.linkonce.t*) } > ram .rel.data : { *(.rel.data) *(.rel.data.*) *(.rel.gnu.linkonce.d*) } > ram .rel
a.data : { *(.rela.data) *(.rela.data.*) *(.rela.gnu.linkonce.d*) } > ram .rel.rodata : { *(.rel.rodata) *(.rel.rodat
a.*) *(.rel.gnu.linkonce.r*) } > ram .rela.rodata : { *(.rela.rodata) *(.rela.rodata.*) *(.rela.gnu.linkonce.r*) } >
ram .rel.got : { *(.rel.got) } > ram .rela.got : { *(.rela.got) } > ram .rel.ctors : { *(.rel.ctors) } > ram .rela.ct
ors : { *(.rela.ctors) } > ram .rel.dtors : { *(.rel.dtors) } > ram .rela.dtors : { *(.rela.dtors) } > ram .rel.init
: { *(.rel.init) } > ram .rela.init : { *(.rela.init) } > ram .rel.fini : { *(.rel.fini) } > ram .rela.fini : { *(.re
la.fini) } > ram .rel.bss : { *(.rel.bss) } > ram .rela.bss : { *(.rela.bss) } > ram .rel.plt : { *(.rel.plt) } > ram
.rela.plt : { *(.rela.plt) } > ram .rel.dyn : { *(.rel.dyn) } > ram
22 .ARM.extab ALIGN (0x4) : { PROVIDE (__stext = ABSOLUTE(.)); _stext = ABSOLUTE(.) ; . = .; } > ram /DISCARD/ 0 : {
*(.ARM.extab* .gnu.linkonce.armextab.*) } . = ALIGN(8); . = ALIGN(8); __exidx_start = ABSOLUTE(.); .ARM.exidx ALIGN(
8) : AT ((LOADADDR (.ARM.extab) + SIZEOF (.ARM.extab) + (8) - 1) & ~ ((8) - 1)) { . = .; } > ram __exidx_end = ABSOLU
TE(.); /DISCARD/ 0 : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } .text ALIGN(8) : AT ((LOADADDR (.ARM.exidx) + SIZEOF
(.ARM.exidx) + (8) - 1) & ~ ((8) - 1)) { *(.text*) *(.gnu.warning) *(.gnu.linkonce.t.*) *(.init) *(.glue_7) *(.glue_
7t) __CTOR_LIST__ = ABSOLUTE (.); KEEP (*(SORT (.ctors*))) __CTOR_END__ = ABSOLUTE (.); __DTOR_LIST__ = ABSOLUTE (.);
KEEP (*(SORT (.dtors*))) __DTOR_END__ = ABSOLUTE (.); } > ram _etext = .; PROVIDE (__etext = .);
23 .fini ALIGN (0x4) : { . = .; *(.fini) } > ram
24 .rodata ALIGN (0x4) : { . = .; *(.rodata*) *(.gnu.linkonce.r.*) } > ram
25 .rodata1 ALIGN (0x4) : { . = .; *(.rodata1) } > ram
26 .got ALIGN (0x4) : { . = .; *(.got.plt) *(.got) _GOT1_START_ = ABSOLUTE (.); *(.got1) _GOT1_END_ = ABSOLUTE (.);
_GOT2_START_ = ABSOLUTE (.); *(.got2) _GOT2_END_ = ABSOLUTE (.); } > ram
27 .fixup ALIGN (0x4) : { . = .; *(.fixup) } > ram
28 .gcc_except_table ALIGN (0x4) : { . = .; } > ram /DISCARD/ 0 : { *(.gcc_except_table*) }
29 .data ALIGN (0x4) : { __ram_data_start = ABSOLUTE (.); *(.data*) *(.data1) *(.gnu.linkonce.d.*) . = ALIGN (4); KE
EP(*( SORT (.ecos.table.*))) ; . = ALIGN (4); __init_array_start__ = ABSOLUTE (.); KEEP (*(SORT (.init_array.*))) KEE
P (*(SORT (.init_array))) __init_array_end__ = ABSOLUTE (.); *(.dynamic) *(.sdata*) *(.gnu.linkonce.s.*) . = ALIGN (4
); *(.2ram.*) } > ram __rom_data_start = LOADADDR (.data); __ram_data_end = .; PROVIDE (__ram_data_end = .); _edata =
.; PROVIDE (edata = .); PROVIDE (__rom_data_end = LOADADDR (.data) + SIZEOF(.data));
30 .bss ALIGN (0x4) : { __bss_start = ABSOLUTE (.); *(.scommon) *(.dynsbss) *(.sbss*) *(.gnu.linkonce.sb.*) *(.dynbs
s) *(.bss*) *(.gnu.linkonce.b.*) *(COMMON) __bss_end = ABSOLUTE (.); } > ram
31 __heap1 = ALIGN (0x8);
32 . = ALIGN(4); _end = .; PROVIDE (end = .);
33 }
内存分配:
11 ram : ORIGIN = 0x20000000, LENGTH = 0x2000000
12 sram : ORIGIN = 0x00200000, LENGTH = 0x4000
13 rom : ORIGIN = 0x10000000, LENGTH = 0x200000
ram 0x20000000 32M
sram 0x00200000 16K
rom 0x10000000 2M
sections分配就暂时不看了,一大堆的
再看最开头
1 STARTUP(vectors.o)
2 ENTRY(reset_vector)
3 INPUT(extras.o)
4 GROUP( libtarget.a libgcc.a libsupc++.a )
说明要从vectors.o文件的reset_vector开始运行,这就是开始的地方。
2. reset_vector开始
在<hal\arm\arch\v3_0\cdl\hal_arm.cdl>
有和vectors.o相关行: <PREFIX>/lib/vectors.o : <PACKAGE>/src/vectors.S
< hal/arm/arch/v3_0/src/vectors.S >
289 .text
290 // Startup code which will get the machine into supervisor mode
291 .global reset_vector
292 .type reset_vector,function
293 reset_vector:
294 PLATFORM_SETUP1 // Early stage platform initialization
295 // which can set DRAM size at 0x40
296 // see <cyg/hal/hal_platform_setup.h>
代码段
PLATFORM_SETUP1是个宏,作用后面的注释有提到,先期初始化平台
<hal/arm/arm9/smdk2410/v3_0/include/hal_platform_setup.h>
#define PLATFORM_SETUP1 _platform_setup1
122 .macro _platform_setup1
123 #ifndef CYG_HAL_STARTUP_RAM
124 ldr r0,=WTCON // watch dog disable
125 ldr r1,=0x0
126 str r1,[r0]
127 #endif
128 RAW_LED_PORT_INIT_MACRO
130 #ifndef CYG_HAL_STARTUP_RAM
131 ldr r0,=INTMSK
132 ldr r1,=0xffffffff // all interrupt disable
133 str r1,[r0]
135 ldr r0,=INTSUBMSK
136 ldr r1,=0x7ff // all sub interrupt disable
137 str r1,[r0]
139 RAW_LED_MACRO 1
141 // Disable and clear caches
142 mrc p15,0,r0,c1,c0,0
143 bic r0,r0,#0x1000 // disable ICache
144 bic r0,r0,#0x000f // disable DCache, write buffer,
145 // MMU and alignment faults
146 mcr p15,0,r0,c1,c0,0
147 nop
148 nop
149 mov r0,#0
150 mcr p15,0,r0,c7,c6,0 // clear data cache
151 #if 0
152 mrc p15,0,r0,c15,c1,0 // disable streaming
153 orr r0,r0,#0x80
154 mcr p15,0,r0,c15,c1,0
155 #endif
157 // To reduce PLL lock time, adjust the LOCKTIME register.
158 ldr r0,=LOCKTIME
159 ldr r1,=0xffffff
160 str r1,[r0]
162 // We must set ratios, set memctl, then change FCLK.
163 ldr r0,=CLKDIVN // Set ratios 1:2:4 for FCLK:HCLK:PCLK
164 ldr r1,=(3)
165 str r1,[r0]
167 // MMU_SetAsyncBusMode //Must select, since we're setting HDIVN=1
168 #define R1_iA (1<<31)
169 #define R1_nF (1<<30)
170 mrc p15,0,r0,c1,c0,0
171 orr r0,r0,#(R1_nF|R1_iA)
172 mcr p15,0,r0,c1,c0,0
175 // Set memory control registers
176 adr r0,1f
177 ldr r1,=BWSCON // BWSCON Address
178 add r2, r0, #52 // End address of SMRDATA
179 0:
180 ldr r3, [r0], #4
181 str r3, [r1], #4
182 cmp r2, r0
183 bne 0b
184 b 2f
186 1:
187 // Memory configuration should be optimized for best performance
188 // The following parameter is not optimized.
189 // Memory access cycle parameter strategy
190 // 1) The memory settings is safe parameters even at HCLK=75Mhz.
191 // 2) SDRAM refresh period is for HCLK=75Mhz.
192
193 .long (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BW
SCON<<28))
194 .long ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC)) //GCS0
195 .long ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC)) //GCS1
196 .long ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC)) //GCS2
197 .long ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC)) //GCS3
198 .long ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC)) //GCS4
199 .long ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC)) //GCS5
200 .long ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN)) //GCS6
201 .long ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN)) //GCS7
202 .long ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)
203
204 .long 0x32 // SCLK power saving mode, BANKSIZE 128M/128M
205
206 .long 0x30 // MRSR6 CL=3clk
207 .long 0x30 // MRSR7
208 // .long 0x20 // MRSR6 CL=2clk
209 // .long 0x20 // MRSR7
210
211 2:
212 RAW_LED_MACRO 2
213
214 // Configure MPLL
215 ldr r0,=MPLLCON
216 ldr r1,=((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV) // Fin=12MHz,Fout=50MHz
217 str r1,[r0]
218
219 #endif
220
221 // Set up a stack [for calling C code]
222 ldr r1,=__startup_stack
223 ldr r2,=SMDK2410_SDRAM_PHYS_BASE
224 orr sp,r1,r2
225
226 // Create MMU tables
227 RAW_LED_MACRO 3
228 bl hal_mmu_init
229 RAW_LED_MACRO 4
230
231 // Enable MMU
232 ldr r2,=10f
233 #ifdef CYG_HAL_STARTUP_ROMRAM
234 ldr r1,=__exception_handlers
235 ldr r9,=0x80000000
236 sub r1,r2,r1
237 add r2,r9,r1 // r9 has ROM offset
238 #endif
239 ldr r1,=MMU_Control_Init|MMU_Control_M
240 mcr MMU_CP,0,r1,MMU_Control,c0
241 mov pc,r2
242 nop
243 nop
244 nop
245 10:
246 RAW_LED_MACRO 5
247
248 #ifdef CYG_HAL_STARTUP_ROMRAM
249 mov r0,r9 // Relocate FLASH/ROM to RAM
250 ldr r1,=__exception_handlers // ram base & length
251 ldr r2,=__rom_data_end
252 20: ldr r3,[r0],#4
253 str r3,[r1],#4
254 cmp r1,r2
255 bne 20b
256 ldr r0,=30f
257 mov pc,r0
258 nop
259 nop
260 nop
261 nop
262 30:
263 #endif
264 RAW_LED_MACRO 6
265 .endm
这里面都是汇编写的,一个一个写寄存器而已,作用注释很清楚,想了解更详细就要看寄存器手册了。
http://blog.sina.com.cn/s/blog_559f6ffc0100mjlo.html
转载于:https://www.cnblogs.com/kuainiao/archive/2013/01/15/2861351.html
ecos代码分析(1)相关推荐
- ecos代码分析(2)
ecos代码分析(2) 228 bl hal_mmu_init 此前内存初始化好了,sp也设置好了,可以运行C程序 170 void 171 hal_mmu_init(voi ...
- mysql ecos_ecos代码分析(4)
ecos代码分析(4) 下面开始看cyg_start() < redboot/v3_0/src/main.c> void cyg_start(void) :: an no paramete ...
- 20145236《网络攻防》Exp4 恶意代码分析
20145236<网络攻防>Exp4 恶意代码分析 一.基础问题回答 如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪些 ...
- C#中类的继承 override virtual new的作用以及代码分析
继承中override virtual new的作用 virtual 父类中需要注明允许重写的方法: override 子类中必须显示声明该方法是重写的父类中的方法: new 子类中忽略父类的已存在的 ...
- 2017.4.18 静态代码分析工具sonarqube+sonar-runner的安装配置及使用
配置成功后的代码分析页面: 可以看到对复杂度.语法使用.重复度等等都做了分析,具体到了每一个方法和每一句代码. 四种使用方式: sonarqube + sonar-runner sonarqube + ...
- lighttpd1.4.18代码分析
lighttpd1.4.18代码分析(八)--状态机(2)CON_STATE_READ状态 posted @ 2008-09-24 10:50 那谁 阅读(2225) | 评论 (1) 编辑 lig ...
- Device Tree(三):代码分析
2019独角兽企业重金招聘Python工程师标准>>> 一.前言 Device Tree总共有三篇,分别是: 1.为何要引入Device Tree,这个机制是用来解决什么问题的?(请 ...
- 使用Hadoop和ELK进行业务代码分析!分分钟捉到Bug!
大数据是计算领域的新高地,它有望提供一种方法来应对二十一世纪不断增长的数据生成.越来越多的大数据爱好者正在涌现,越来越多的公司正在采用各种大数据平台,并希望提出以客户为中心的解决方案,帮助他们在竞争激 ...
- 20145328 《网络对抗技术》恶意代码分析
20145328 <网络对抗技术>恶意代码分析 ------看到这句话说明还没写完-------- 实践内容: 使用schtasks指令监控系统运行 使用sysmon工具监控系统运行 使用 ...
最新文章
- Swift 中 insetBy(dx: CGFloat, dy: CGFloat) - CGRect 用法详解
- 换npm yarn的源让install超时去死吧
- angular2新手学习笔记(1)概述
- 解决spring boot项目启动后访问接口出现日志乱码
- centeros6.8 mysql_centeros7安装mysql8,以及设置root密码
- Linux内核:容器底层cgroup如何使用
- UI设计素材|底部导航设计的黄金法则
- [代码]获取源页的控件值
- pytorch 实现RBF网络
- shell自定义函数及参数调用解析
- Java知识系统回顾整理01基础01第一个程序05Eclipse中运行Java程序
- hdu 1284 钱币兑换问题 (递推 || DP || 母函数)
- python3获取邮件附件,获取邮件附件到python文件对象
- HTML与CSS面试题
- 期权定价Python实现
- 从入门到成佛--电商平台搭建--前端教程--环境搭建
- eureka-client无法启动com.netflix.discovery.DiscoveryClient : Shutting down DiscoveryClient
- 仪表自动识别方法汇总
- 使用Electron将html网页转为exe可执行文件(全屏, 遮住任务栏, Esc退出, exe的图标/文件名修改)
- Spring实训 个人博客二 详情页
热门文章
- XShell笔记-XShell登录脚本的使用
- Spring学习笔记-构造和Set方法注入Bean及集合和null值的注入
- Linux工作笔记-配置.bashrc或.cshrc使core文件产生(方便gdb调试)
- 【编译原理】:NFA转变为DFA的子集构造法
- python中的fstring的 !r,!a,!s
- http抓包实战 pdf_网络协议HTTP 协议(抓包实战和网络分层)
- db2数据库免费版限制下载地址
- (操作系统题目题型总结)第五章:设备管理
- (计算机组成原理题目题型总结)第五章:中央处理器
- Linux系统编程21:基础IO之全缓冲和行缓冲的区别及深刻理解缓冲区及其作用