找回密码
 注册
关于网站域名变更的通知
查看: 307|回复: 1
打印 上一主题 下一主题

《uboot教程 Exynos4412》-第3章-汇编之源码分析(1)

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-10-24 09:29 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
本帖最后由 阳阳天 于 2019-10-24 09:31 编辑
6 ?3 B* |! m: A/ O$ R5 I* f, x+ I. z& O2 k( ~) u& `% F
在第一章中,介绍了Exynos4412的iROM、启动方式、源码组成等;在第二章中,介绍2 k, \8 Z; ]; t! j' C, X. j5 B! }
uboot 编译等。通过前面对编译的详细分析,了解到 uboot 源码中有以下几个文件是非常重0 @3 |0 o2 P! G. i1 k
要的:
) W+ f4 N4 S2 F9 k“cpu/ARM_cortexa9/start.S”
0 d1 c% @# {6 _* G& m! j“board/samsung/smdkc210/lowlevel_init_SCP.S 或者 lowlevel_init_POP.S”
1 N9 w' u0 d  F5 ]* E: ~$ ]“include/configs/itop_4412_android.h 或者 itop_4412_ubuntu.h”. x6 |  _* @/ W# z8 x) ]
其中“cpu/arm_cortexa9/start.S”是 uboot 代码入口文件,分析 uboot 一般是从
: [5 S' t. @/ Y) \“start.S”文件开始,“lowlevel_init_SCP.S”文件是内存初始化、时钟初始化和串口初始化
+ h- b: O. [; d( i! ]等的文件,start.S 文件在运行过程中会跳到这个文件中。
7 U5 ^# {7 ?" {“itop_4412_android.h 或者 itop_4412_ubuntu.h”文件是重要的配置头文件,里面的
2 _4 Z. b8 k& ]/ c  X7 J; y3 c3 }* i宏配置,会影响以上文件如何编译和运行,包括在下一章节中 uboot 源码的 C 语言部分,很
) e# L9 S& p. U, R. {+ k& u多代码编译和运行都会受到这个头文件的影响。
: c+ }4 D5 L( G- R. w+ T% a4 C7 m. d本章主要内容是,从“start.S”文件开始分析所有汇编代码,截止于 uboot 开始执行 C
  Q! `- v! O# \$ y: X4 a8 l代码。其中涉及到很多不常用概念,需要我们去了解和掌握;涉及到汇编语法,需要我们去了+ o) U' j4 o1 `' x" W
解。
2 I/ B5 W! O( I3.1 分析 uboot 汇编源码必要的知识和学习方法汇总
: G0 [2 \6 n6 f6 z" R本小节,结合 datasheet 介绍 4412 的物理地址概念,这部分和单片机中类似;介绍汇编: x' o/ @/ H# H) O  g, R, Q! r
语法如何学习以及要掌握到什么程度;汇编部分调试方法。
+ T& U8 Y/ A0 u% {3.1.1 4412 的物理地址和虚拟地址介绍
/ |% q/ k; K: j9 _0 W+ x如果用户学习过迅为的 linux 驱动教程,其中有一期,专门介绍物理地址和虚拟地址的概
, D; P. y: A8 n2 y念。几乎在所有现代操作系统中,物理地址都是通过 MMU(内存管理单元)映射为虚拟地5 J( z; G! N( j4 e. t
址。但是在 uboot 汇编部分,还是直接操作物理地址的。& D7 I, |: S8 u1 |0 V/ V
物理地址的概念。
& ?: H' v8 H" Q9 ?6 rMPU 地址总线传来的地址,由硬件电路控制其具体含义。物理地址中很大一部分是留给
# k8 b1 Q3 h$ i$ o内存条中的内存的。物理地址空间,一部分给内存用,一部分给总线用,这是由硬件设计来决) c. L& L; X9 B( M
定的,因此在 32 bits 地址线的处理器中,物理地址空间是 2 的 32 次方,即 4GB,但物理
. c0 s$ @7 W& x) A$ ~3 ?3 oRAM 一般不能上到 4GB,因为还有一部分要给总线用(总线上还挂着别的许多设备)。
5 a6 h+ _6 J- \' e# c9 v对于有单片机基础的用户来说,物理地址还是比较好理解,例如在 51 单片机中,P0.0 表
/ _. q5 [7 Y6 ^2 ]2 c9 t. F" n示小灯的输出寄存器,给这个寄存器写 1 小灯灭,写 0 小灯亮,寄存器 P0.0 的地址就是物理% _- m$ u, B; k
地址。
* T0 r& J" Q+ d/ o
  1. <p>P0 = 0xfe;//小灯亮</p><p>P0 = 0xff;//小灯灭</p>
复制代码
P0 在 51 寄存器头文件中,有一个宏定义它的实际地址,也就是物理地址。
8 E9 X! F! U+ B  T& z0 X在 4412 中,物理地址太多了,根本没有办法全部介绍,2000 多页的 datasheet 中大部! @8 V, H* C0 o% z
分都是介绍寄存器,一个一个介绍是无法实现的。但是我们有必要掌握和理解其中的寄存器框
- B6 f+ U$ y7 @7 Y/ O- p" M架和典型寄存器。
1 e& R0 J5 b3 f8 ^( ^在 4412datasheet 第三章“Memory Map”中,如下图所示,这是 4412 全部基地址的描述。
2 y: B* T1 a8 {; {. I+ F' {+ {
. F+ I6 H" U) X$ Q注意上表中,0x4000_0000~0xA000_0000,0xA000_0000~0x0000_0000 这两个地址
. x0 l2 o- B) ~' C区间,这两个区间是 DMC 内存控制器的寻址地址,也就是内存的物理地址。实际上 4412 最
' V1 n9 ?" O3 R9 P: M, Y大支持的内存可以达到 3G,32 位处理器理论上可以支持 2 的 32 次方(最大 4G),如上表
# b% R/ \1 I. b' S  V. s) d所示,其中 1G 的地址给了 iROM、iRAM 等等这些 MPU 内部寄存器使用,所以 32 位 MPU
& u, X; `4 |) J& |是不可能达到 4G 内存的。
: O+ Y# w0 t* x' X现代操作系统普遍采用虚拟内存管理(Virtual Memory Management)机制,这需要
4 l4 K) P. R9 F: b# Y2 r0 kMMU(Memory Management Unit)的支持。MMU 通常是 CPU 的一部分,如果处理器9 v% u( T/ Z5 r1 n) ^  y
没有 MMU,或者有 MMU 但没有启用,CPU 执行单元发出的内存地址将直接传到芯片引脚
" h3 {- d: @' ]; ]* _上,被内存芯片(物理内存)接收,这称为物理地址(Physical Address),如果处理器启用& X9 ^* K7 p  w" k% `/ l5 m
了 MMU,CPU 执行单元发出的内存地址将被 MMU 截获,从 CPU 到 MMU 的地址称为虚拟6 o, ~# G5 C3 M3 n' O$ K- A* l! o$ C
地址(Virtual Address),而 MMU 将这个地址翻译成另一个地址发到 CPU 芯片的外部地址9 y& y6 v, W; A0 p7 A- b0 E* Y
引脚上,也就是将虚拟地址映射成物理地址。通过内存管理单元,可以实现 4G 的虚拟内存。* F* ^" @1 q1 d' D
在 uboot 代码中,需要多次用到以上地址的概念,其中内存管理单元被开启或者关闭,& s: M9 z- B( W* `  u$ V* Z( E
所以有必要先介绍一下这几个地址的概念。
9 s  Q6 w6 z9 }. d. H+ n* I' `3.1.2 关于汇编语法, `( |! r7 b7 R4 [4 g! Q
如果学习过单片机课程,会发现大部分都是使用 C 语言去编码,汇编使用的非常少了。5 a9 l7 p$ z& a% Y* ~
那么还有必要去学习汇编么?其实是没有必要的,因为在 uboot 中汇编代码量非常少,以) P$ o" I9 X  ?, N: J/ k' P
4412 的 uboot 源码为例,其中有效的汇编代码不足 200 行,我们根本不需要为了读懂 2007 [: C( Z  m) F9 h
行代码专门去学习一门编程语言。1 `9 w- p7 N. @* l' N; W+ j
作者这里建议,首先我们的目标是一定要把这些代码读明白,如果不明白会影响后面 C
' t$ z$ i: ~+ b/ v6 a) S8 p代码的阅读,以及 uboot 的移植;其次,我们要弄清楚每一行有效汇编代码的语法。
) u1 t+ r; @! K! h" \现在我们已经知道汇编是从“cpu/arm_cortexa9/start.S”这个文件开始执行,那么我们1 n/ m- r7 G' j7 Y$ X2 z
就从第一行代码的语法开始学习,代码执行到或者跳到哪一行,我们就学习这一行代码的语5 h" I9 H, d( L8 v8 i, b
法。
. S3 N4 S. Z# J2 W3 W4 d在手册的附录部分,我们会依次介绍汇编代码中出现的语法,大家也可以通过互联网学习- v5 G8 B7 S0 N% n( i7 D- n
每一行执行的汇编语法。
5 r9 \( T! Q" k3.1.3 uboot 汇编代码初始化串口之前的简易调试方法
7 K( M( o, [; [% t2 W; f在前面教程中我们介绍过,从 A9 开始,开发板一般都不配 jtag,jtag 价格昂贵,在 A9
; r* C+ O6 m/ @7 ]2 h+ |1 v之前,由于引导程序 uboot 必须通过 jtag 来烧写,但是在 A9 处理器上,大部分都是支持 tf& `0 k! Q" ~3 u6 |  D+ B
卡引导,这样可以免去 jtag 的费用,烧写变的简单高效。
8 |2 Y% p$ d; D7 g! ?7 B那么没有 jtag,对于 uboot 的调试,我们没法单步调试,如果有一行代码我们不是很确
. B+ I9 S3 I2 ?; x! F定到底执行了没,或者跳到哪一行。如果代码已经执行到串口初始化阶段,当然是可以通过串
/ r) z5 n3 c, e! h9 Y  H口打印字符来实现,在串口初始化之前,其实可以通过控制 LED 灯来跟踪代码。3 W+ \- L+ K, y$ b3 H
以下是开发板上两个小灯控制的代码,可以将小灯点亮。7 U( \6 O& n- ]! ~# x/ Q+ ~" L. D3 l
点亮 LED2 灯:ldr r0, =0x11000104 /* GPL2(0) */6 y& e% \5 R* x3 l) o8 g4 {! W% {4 l
ldr r1, =0x00000001 /* GPL2(0 output high) */, W: H' x1 p4 f! W
str r1, [r0]# d/ k- M* r) q
ldr r0, =0x11000100 /* GPL2(0) */6 J# [/ I# L3 T1 c; m
ldr r1, =0x00000001 /* GPL2(0 output high) */
8 ~8 e8 g8 G% P  p0 ]: }# y% s! Ostr r1, [r0]
# ~! R& e7 I0 }  h点亮 LED3:5 M$ C9 Z0 z' P- C9 n) v' t
ldr r0, =0x11000060
# s' |! {4 B9 z. i) oldr r1, =0x00000010
/ D2 g* v# W% |+ @; Zstr r1, [r0]
* b9 B$ s' m6 N9 K/ Uldr r0, =0x110000647 l+ w+ e5 C: ]2 t" R
ldr r1, =0x000000025 S" A- w+ W; X$ c. f1 r8 r
str r1, [r0]* S' C, j8 ?2 P" N+ B
这里简单介绍下这几行汇编代码的含义。7 \- b8 u6 j" q6 e2 v
ldr r0, =0x11000104' B5 g  E% ]$ n: }2 b4 b7 z. M( I
ldr 是将 0x11000104 值赋给 r0 寄存器。这个值地址为 GPL2DAT。
4 o& X! E) L: D* s. yldr r1, =0x00000001
1 Z# L9 c5 @6 n! i. Q4 P: @3 zldr 是取 0x11000104 地址的值赋给 r1 寄存器。
! W6 y( p- I! Z. \str r1, [r0]( f) C  I! A. {5 ]. E6 d
str 是将 r1 的值写入到 r0 数值对应物理地址寄存器中。将 0x00000001 写入到
+ H! N& M( S) V9 B0 L0x11000104 地址寄存器中,0x11000104 地址是 GPL2DAT 寄存器。
+ `6 N7 Q- S/ lldr r0, =0x11000100 /* GPL2(0) */5 I- ~' l9 b+ e' |. e1 [6 J- b
ldr r1, =0x00000001 /* GPL2(0 output high) */
4 G; B. E8 y5 B' o. ^str r1, [r0]( R& ~3 P; @4 l& V& h
将 0x00000001 写入到 0x11000100 地址寄存器中,0x11000100 地址是 GPL2CON 寄# k6 M$ H  I. r* X; n) y( F
存器。执行这两步就可以将 LED2 点亮。
+ @7 `/ f8 v; k( w/ E: V( ~点亮 LED3 和点亮 LED2 类似。, i! u/ }3 |* f) F% B9 K) j
在串口初始化之前可以通过点灯来实现调试,串口初始化之后可以通过打印字符来跟踪调& g1 b  H. _- H
试代码。' j, ~* ^" R1 s; k7 C+ Z* n

( r0 Q/ C8 Z8 {, F' E/ g! i1 I' h/ m# w5 p/ i# q# t

7 ]! D' I5 j9 X0 f

该用户从未签到

2#
发表于 2019-10-24 19:51 | 只看该作者
好东东必须顶。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-25 02:10 , Processed in 0.171875 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表