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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 阳阳天 于 2019-10-24 09:31 编辑 7 i* Y! b) a( W+ M: H' ^0 ?  C: M
" U" A+ l- T; F8 m
在第一章中,介绍了Exynos4412的iROM、启动方式、源码组成等;在第二章中,介绍4 q# y, O, G5 I0 I
uboot 编译等。通过前面对编译的详细分析,了解到 uboot 源码中有以下几个文件是非常重, {% s% t% ^3 v, o. p% o. N
要的:
& u; a: _4 D* _“cpu/ARM_cortexa9/start.S”
$ ^# q" Q, {, V& M& Y) i  }“board/samsung/smdkc210/lowlevel_init_SCP.S 或者 lowlevel_init_POP.S”
; \) K* i2 L4 i1 S. _2 O( C6 j( ~“include/configs/itop_4412_android.h 或者 itop_4412_ubuntu.h”
, c2 q* I# s$ E: l' ^5 I其中“cpu/arm_cortexa9/start.S”是 uboot 代码入口文件,分析 uboot 一般是从5 N6 b3 o* P- Q6 B
“start.S”文件开始,“lowlevel_init_SCP.S”文件是内存初始化、时钟初始化和串口初始化; W4 r4 |* O8 {4 Z- E6 Q
等的文件,start.S 文件在运行过程中会跳到这个文件中。
+ \$ h' ^% X7 j“itop_4412_android.h 或者 itop_4412_ubuntu.h”文件是重要的配置头文件,里面的
; L  k) R  a: ?. l# v宏配置,会影响以上文件如何编译和运行,包括在下一章节中 uboot 源码的 C 语言部分,很7 ^$ m# x$ q; d! |+ e
多代码编译和运行都会受到这个头文件的影响。7 Z* r# z4 Q3 l
本章主要内容是,从“start.S”文件开始分析所有汇编代码,截止于 uboot 开始执行 C
) T' Y8 q+ |' ^2 g9 b, z, b5 ~7 F代码。其中涉及到很多不常用概念,需要我们去了解和掌握;涉及到汇编语法,需要我们去了
' M- p  k5 O, c  g4 G3 g# F解。
8 d3 p0 K- Z( m7 d0 q$ }+ E3.1 分析 uboot 汇编源码必要的知识和学习方法汇总) n% B5 F2 n. n+ {. B4 Y8 U
本小节,结合 datasheet 介绍 4412 的物理地址概念,这部分和单片机中类似;介绍汇编! ^/ C+ m1 E' |* x; i; @
语法如何学习以及要掌握到什么程度;汇编部分调试方法。) ?' W& U1 x! D( E/ f! l! i
3.1.1 4412 的物理地址和虚拟地址介绍& p, r5 ]5 E5 m' m) k# L9 }/ z) X
如果用户学习过迅为的 linux 驱动教程,其中有一期,专门介绍物理地址和虚拟地址的概' L  [* Z. q1 k3 V7 U
念。几乎在所有现代操作系统中,物理地址都是通过 MMU(内存管理单元)映射为虚拟地0 [# Q5 n0 k, S0 ^+ K* `
址。但是在 uboot 汇编部分,还是直接操作物理地址的。1 u0 x2 t! I# J9 E3 m
物理地址的概念。# x. L3 d. b6 g2 d) G. L
MPU 地址总线传来的地址,由硬件电路控制其具体含义。物理地址中很大一部分是留给# R" H( f2 _2 P
内存条中的内存的。物理地址空间,一部分给内存用,一部分给总线用,这是由硬件设计来决: z4 z5 g5 s- h6 o3 K3 Y; f" P
定的,因此在 32 bits 地址线的处理器中,物理地址空间是 2 的 32 次方,即 4GB,但物理
1 u; ^! D; i( ARAM 一般不能上到 4GB,因为还有一部分要给总线用(总线上还挂着别的许多设备)。7 y% ^7 c' p) z# a; L* p4 _  r
对于有单片机基础的用户来说,物理地址还是比较好理解,例如在 51 单片机中,P0.0 表( t* s$ O% c# f) u8 ?
示小灯的输出寄存器,给这个寄存器写 1 小灯灭,写 0 小灯亮,寄存器 P0.0 的地址就是物理% N" o1 X3 V8 g. h
地址。! c! g  ?/ d0 A7 ^4 H
  1. <p>P0 = 0xfe;//小灯亮</p><p>P0 = 0xff;//小灯灭</p>
复制代码
P0 在 51 寄存器头文件中,有一个宏定义它的实际地址,也就是物理地址。
3 {7 w8 p! y" Q在 4412 中,物理地址太多了,根本没有办法全部介绍,2000 多页的 datasheet 中大部
2 S. e& s) q" t$ @* w  o' F分都是介绍寄存器,一个一个介绍是无法实现的。但是我们有必要掌握和理解其中的寄存器框
# G( P& `, h3 r& {- H1 \$ A架和典型寄存器。* G# @( _% Z5 E3 W
在 4412datasheet 第三章“Memory Map”中,如下图所示,这是 4412 全部基地址的描述。) k. h" S( ?3 R

3 S0 Q* I7 l& ?1 S% v; y7 _. z, D注意上表中,0x4000_0000~0xA000_0000,0xA000_0000~0x0000_0000 这两个地址9 c' [# P( q% Y( ]
区间,这两个区间是 DMC 内存控制器的寻址地址,也就是内存的物理地址。实际上 4412 最  z" e+ D: U1 u. l! _* n
大支持的内存可以达到 3G,32 位处理器理论上可以支持 2 的 32 次方(最大 4G),如上表
9 J" X  ?) E" z# ~所示,其中 1G 的地址给了 iROM、iRAM 等等这些 MPU 内部寄存器使用,所以 32 位 MPU# d) H$ m3 J. m0 N  I% d3 r
是不可能达到 4G 内存的。8 A9 e2 c% N7 v# U' ^+ J" g5 k
现代操作系统普遍采用虚拟内存管理(Virtual Memory Management)机制,这需要
, Z. y5 L$ ^  W7 Q8 s8 SMMU(Memory Management Unit)的支持。MMU 通常是 CPU 的一部分,如果处理器) `& ]) p. h7 n' ?! d: I5 }
没有 MMU,或者有 MMU 但没有启用,CPU 执行单元发出的内存地址将直接传到芯片引脚, M! R" s- h( X$ w
上,被内存芯片(物理内存)接收,这称为物理地址(Physical Address),如果处理器启用
6 c& r7 f4 H; \% Y了 MMU,CPU 执行单元发出的内存地址将被 MMU 截获,从 CPU 到 MMU 的地址称为虚拟
9 {: Y6 P. T. K5 Z1 M, l' c; n地址(Virtual Address),而 MMU 将这个地址翻译成另一个地址发到 CPU 芯片的外部地址
: U7 K8 w" P* x9 G引脚上,也就是将虚拟地址映射成物理地址。通过内存管理单元,可以实现 4G 的虚拟内存。! r7 z- b# M* {8 _3 G
在 uboot 代码中,需要多次用到以上地址的概念,其中内存管理单元被开启或者关闭,# F# u' ^. P: n; K: [+ W
所以有必要先介绍一下这几个地址的概念。0 ]: G9 m" s  J# F
3.1.2 关于汇编语法' y+ G( X+ B* L  M3 j, |
如果学习过单片机课程,会发现大部分都是使用 C 语言去编码,汇编使用的非常少了。
1 S- O. r8 }0 Q3 i9 a那么还有必要去学习汇编么?其实是没有必要的,因为在 uboot 中汇编代码量非常少,以
7 G! {, }$ t0 d4 V4412 的 uboot 源码为例,其中有效的汇编代码不足 200 行,我们根本不需要为了读懂 200
" y5 c8 d6 V8 y! j; }. j1 m行代码专门去学习一门编程语言。7 [. Z4 N5 a8 K# Y
作者这里建议,首先我们的目标是一定要把这些代码读明白,如果不明白会影响后面 C5 {) g0 r7 h3 d
代码的阅读,以及 uboot 的移植;其次,我们要弄清楚每一行有效汇编代码的语法。
6 p+ c! O( Q. e: T% K; A现在我们已经知道汇编是从“cpu/arm_cortexa9/start.S”这个文件开始执行,那么我们, x' Z9 g- N" b) t, G
就从第一行代码的语法开始学习,代码执行到或者跳到哪一行,我们就学习这一行代码的语" x% t% z, l9 V5 o; ^
法。5 `5 @; o6 U- y- m! S+ R
在手册的附录部分,我们会依次介绍汇编代码中出现的语法,大家也可以通过互联网学习
% f' c: M# a8 P! B2 q$ N- N每一行执行的汇编语法。- J0 E0 y. a6 p& j& S; q' \& M
3.1.3 uboot 汇编代码初始化串口之前的简易调试方法
( `! n0 n2 |; v; c% K& C在前面教程中我们介绍过,从 A9 开始,开发板一般都不配 jtag,jtag 价格昂贵,在 A95 x& @  c. I6 B4 X) {* K; [8 Z
之前,由于引导程序 uboot 必须通过 jtag 来烧写,但是在 A9 处理器上,大部分都是支持 tf4 e0 U* o0 Z8 T* R! n
卡引导,这样可以免去 jtag 的费用,烧写变的简单高效。
: O* |8 F! d* [% D  Y9 Y那么没有 jtag,对于 uboot 的调试,我们没法单步调试,如果有一行代码我们不是很确
- ^  k4 f8 k( U) P  c2 T定到底执行了没,或者跳到哪一行。如果代码已经执行到串口初始化阶段,当然是可以通过串
8 M3 S4 c3 {9 d" d2 T9 w口打印字符来实现,在串口初始化之前,其实可以通过控制 LED 灯来跟踪代码。' K2 d8 }2 F3 a$ z& d  b
以下是开发板上两个小灯控制的代码,可以将小灯点亮。# n7 n4 \$ o/ d. t
点亮 LED2 灯:ldr r0, =0x11000104 /* GPL2(0) */% `( z3 m+ i2 M: k
ldr r1, =0x00000001 /* GPL2(0 output high) */1 `5 Z. A- f7 G: {
str r1, [r0]
" t0 v1 T' ?4 W! pldr r0, =0x11000100 /* GPL2(0) */- M) ^) C/ R) l& q& v
ldr r1, =0x00000001 /* GPL2(0 output high) */
) p4 V- ?8 X0 h) A8 X/ gstr r1, [r0]  A& X1 }, A, E: a
点亮 LED3:& d: {% v2 D/ Z# ]# l
ldr r0, =0x11000060; {+ m  ?5 ~- m7 q
ldr r1, =0x00000010
' g0 n" j( w+ e+ B. ^( ystr r1, [r0]6 R$ }' A, b" q  W, Q
ldr r0, =0x11000064/ p) g$ X7 [# y) K
ldr r1, =0x00000002
+ ]' z- E: f% Q% W: X0 u! |str r1, [r0]
9 [8 {  d3 n  Z: x这里简单介绍下这几行汇编代码的含义。
7 E. j* q1 G3 Y* g% V6 Vldr r0, =0x110001043 k. O. `+ L, q* W/ [9 }* w" R) O
ldr 是将 0x11000104 值赋给 r0 寄存器。这个值地址为 GPL2DAT。. {: V: _% }6 o5 _. S% q1 }
ldr r1, =0x00000001
0 ]2 {% k7 R0 u* E9 kldr 是取 0x11000104 地址的值赋给 r1 寄存器。
' I4 S; h7 L) v1 M5 ^$ Jstr r1, [r0]5 R# [7 J1 h) l" X) `
str 是将 r1 的值写入到 r0 数值对应物理地址寄存器中。将 0x00000001 写入到/ v. X% p# l4 ~6 {. Q
0x11000104 地址寄存器中,0x11000104 地址是 GPL2DAT 寄存器。' F0 T; ]/ ?. I! q" [% |
ldr r0, =0x11000100 /* GPL2(0) */: _. k5 x) w& h! R9 Z9 x
ldr r1, =0x00000001 /* GPL2(0 output high) */" Q- U2 w( f4 u' P( e; o8 C; T
str r1, [r0]
* u  c( `  d3 g' m1 o5 A5 j将 0x00000001 写入到 0x11000100 地址寄存器中,0x11000100 地址是 GPL2CON 寄
3 ?# `7 }# ^( ?1 m存器。执行这两步就可以将 LED2 点亮。
; R" s5 z: ]3 E$ S+ x( C点亮 LED3 和点亮 LED2 类似。) c3 v+ ^8 r4 I# q* a
在串口初始化之前可以通过点灯来实现调试,串口初始化之后可以通过打印字符来跟踪调( |4 s3 M. `: F' }2 ^/ R4 n7 g
试代码。
: g/ `  u7 R4 M" N' O' i  m3 ~2 _* J  a+ _6 L
- B% t7 _( [6 Z4 c4 Z
# b, V9 v- b- l" U( `# E/ K& F

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-24 11:32 , Processed in 0.140625 second(s), 26 queries , Gzip On.

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

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

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