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

ARM平台下Uboot启动Linux内核前的必备条件

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-6-10 16:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

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

x
! [' z3 ?1 F6 ?  f5 p' H
Linux内核是由Uboot进行调用的,在执行内核前,需要满足什么条件呢?( m/ z- U7 H) M7 u

* W  q9 l  q5 R- \: Q3 s$ O5 r8 F我们来看下内核文档Documentation/ARM/booting。内核版本为3.7.6。
, }. H* Y* y. U& A' g
' F2 t  t1 T: y& ^。。。。。。+ O4 y) i" d9 |5 R  `  u
& |$ h2 ?. y9 X+ J

& @! c" Z; T6 W) O3 P  n: X& H+ Y, K) W5 U1 |5 |( t
5. Calling the kernel image$ M1 u) s# v# y% M- q4 k
---------------------------
8 Q& I* M/ Y/ o/ B% D4 B* F/ ^% {0 J2 z
Existing boot loaders:        MANDATORY6 _# l5 m* [* c; m, T% n
New boot loaders:        MANDATORY$ i; S! P# y& _8 Z7 h! }
. k& q( m+ n  y7 t
There are two options for calling the kernel zImage.  If the zImage# Q& s, F0 [$ p$ l
is stored in flash, and is linked correctly to be run from flash," L7 i* J- C6 _* Q! f. |2 o: e
then it is legal for the boot loader to call the zImage in flash
  R$ r/ C- `  W& T- G2 P) {2 zdirectly.
7 V0 U, q8 O# p7 S2 \( {" N8 R+ j
- q5 k( i  x7 W  }/ k# |+ tThe zImage may also be placed in system RAM (at any location) and
- `% e' k2 {: d- D8 ccalled there.  Note that the kernel uses 16K of RAM below the image
) v) W4 ~6 S7 L: F! q  Eto store page tables.  The recommended placement is 32KiB into RAM.
2 `3 [% y( F; i6 n% G: f+ Z! M7 w* [4 G" F/ V- [/ T" C
In either case, the following conditions must be met:$ a& Y( ?! t" Z7 _) L2 e: X
  c( O6 i+ s7 |0 S: [9 i) u. a0 H
- Quiesce all DMA capable devices so that memory does not get4 t6 _5 n' T" ]% f  ]: S
  corrupted by bogus network packets or disk data. This will save
. u: p  t$ _; [2 ^& W# a  you many hours of debug.
6 S8 q5 X) v- k7 s
1 t" ^4 w7 U2 Q, H- CPU register settings. Z. X% r5 i- O0 i" Y3 A  x& c
  r0 = 0,1 ~2 x$ {/ o6 n
  r1 = machine type number discovered in (3) above.( b- t4 T4 }& S( U% L: ~
  r2 = physical address of tagged list in system RAM, or) }& f% d1 h8 e% v0 {4 ^
       physical address of device tree block (dtb) in system RAM! J* v, [7 r' X+ {7 ]" c1 @

' t4 B  ]7 t# s# w0 Z4 u- CPU mode
5 {2 O9 [  m% G# j: w  All forms of interrupts must be disabled (IRQs and FIQs)) X% ]* L( s* Z* T+ Y0 X. T
$ X' e: S! e: A2 n( O5 e
  For CPUs which do not include the ARM virtualization extensions, the
$ x0 _2 T& b; X) h' b. c5 I  CPU must be in SVC mode.  (A special exception exists for Angel)
! n" d# q* q7 N! Q4 ?. U6 }" N4 g- N& s1 G# i/ d: m" [
  CPUs which include support for the virtualization extensions can be
" ~5 ^6 E5 v1 {$ J; {- ]) W  entered in HYP mode in order to enable the kernel to make full use of2 g; i* Y( C- T& J: e
  these extensions.  This is the recommended boot method for such CPUs,8 {' k1 k4 E5 O8 e  k3 W$ w6 R
  unless the virtualisations are already in use by a pre-installed& _: M/ ?( Q$ H9 l4 p! D6 O* p% {
  hypervisor.
0 `/ W6 s0 u- R( u, w7 B3 f: X
; q! i/ X/ j1 E$ E  If the kernel is not entered in HYP mode for any reason, it must be
( f( O0 y7 n% s& c7 h  entered in SVC mode.0 i" S5 ^, a0 h: P2 N$ J+ z! ?  y
, s! {. Z! }3 P( c* R
- Caches, MMUs
5 f2 R7 e- K1 r  The MMU must be off.! A4 e. o& W7 n6 N3 Q
  Instruction cache may be on or off." g4 p7 c6 s7 |/ e
  Data cache must be off.& S% \+ P8 }) W/ E1 L  B% ?+ ~
& J% m1 _/ e7 Q5 b
  If the kernel is entered in HYP mode, the above requirements apply to
0 V1 [0 [5 e- X0 I6 o  the HYP mode configuration in addition to the ordinary PL1 (privileged: D! Y( a+ u" F
  kernel modes) configuration.  In addition, all traps into the! u6 n- ^+ c/ |2 k" e3 |% A4 p
  hypervisor must be disabled, and PL1 access must be granted for all8 ]0 _! l* z+ h& y$ j/ u- |& o
  peripherals and CPU resources for which this is architecturally
" a0 c1 G' T4 B1 u  possible.  Except for entering in HYP mode, the system configuration
9 ?% ?: e  N9 t5 {# |, [6 |  should be such that a kernel which does not include support for the
% p  x: [' T& Y) L. L  virtualization extensions can boot correctly without extra help.
0 O8 u6 |6 [# b) c2 o
4 b3 O3 }$ [7 B: ~7 V# R' l- The boot loader is expected to call the kernel image by jumping+ E1 \9 u  ?( J7 T; L$ q3 c, U
  directly to the first instruction of the kernel image.+ L1 X  n; u" O: M- g# L1 U

- L8 j7 Y4 x: y  i  On CPUs supporting the ARM instruction set, the entry must be
6 x) O0 A, ?* B0 \; T% z% ]  made in ARM state, even for a Thumb-2 kernel.
# s$ W9 D7 z8 ^8 Z% h! C& N# l- U( T9 `; j/ H  H0 O6 u3 ]% H* ]7 X  ~- e
  On CPUs supporting only the Thumb instruction set such as
- c, @( R. z& S# Z% x2 n5 B2 f; s% b  Cortex-M class CPUs, the entry must be made in Thumb state.
3 g0 V) b1 ]  \2 e4 g( E8 U& Y$ ]7 ]. D( \" E

: C4 K) `& \( {3 n7 K8 _, K这里,省略了该文档中不感兴趣的部分。
" U9 }9 S1 U1 m# ?+ H
; n* V, f7 D- i9 G$ Y根据文档,5 n. v( A- O1 x$ l! \9 q* I* ^

( C; Z2 T& ^4 `; d! L8 ~, K第一, 必须禁止所有使用DMA的设备。 感觉这个有点多余,Uboot使用的设备,包括网卡之类的,一般都不会使用DMA。
; _- A- Z% d6 `2 y' T  A9 Q( `2 g1 P: B2 d& j
第二,必须设置r0,r1和r2寄存器为相应的值。这个是由下面的函数调用实现的。/ x3 n0 |. e  c. t) w
: [' }2 E& x& U6 a
该函数在Uboot/lib_arm/armlinux.c的do_bootm_linux函数中被调用。
1 Q- N  L' ~# Z; h1 ^# v8 e8 a0 n4 ?. `, i) \' Z% \, t# C
    theKernel (0, bd->bi_arch_number, bd->bi_boot_params);7 g% L1 Z( F. l4 S5 I, @3 G

4 O* D. z- C) t  b+ G: A8 B1 Y根据ATPCS的规则,函数的实参将分别传入r0到r3寄存器。这里有正好传入三个参数对应着0,机器码和参数列表的地址。1 H/ W; r8 _; M8 Q2 n. t
% g7 g" A7 o, }
第三,必须禁止中断,并且将CPU置入SVC(管理)模式。这些工作已经由start.S完成了。
* P0 n5 [* o0 Z4 A* ^. x
  {8 W+ {* h4 R第四,必须禁止数据cache和MMU,可以使能或禁止指令cache。这个是由下面的函数调用实现的。
2 n/ v6 `& u. w1 [. u% ^0 e6 E1 p! v$ m
该函数位在Uboot/lib_arm/armlinux.c的do_bootm_linux函数中被调用。0 \5 v$ M. b, x5 s. m& t

; I( J5 w/ L3 x; b, ?5 h下列函数位于:Uboot/cpu/arm920t/cpu.c中。
! W# K" w; [/ a3 d- T( R* e' R, s* j& F* X8 k
int cleanup_before_linux (void)
& C6 c/ i$ h' S. W+ u1 H4 |  E{" n  I) G* D, B
        /*4 V! o3 G5 n1 Q1 V! y
         * this function is called just before we call linux0 E6 u/ ?. |/ f0 [! R9 i
         * it prepares the processor for linux" I9 l7 t& b. |9 e! b
         *
. I/ }& k7 l# q- F- g8 i7 {" h6 \$ D         * we turn off caches etc ...
1 S& F8 j1 q% W5 n' f         */$ k0 E$ {& o) W( I

. }  k4 J1 M4 v6 {, t        unsigned long i;* N+ v( U2 n2 ?

6 A. J1 `$ s: ?8 R, n) L; b        disable_interrupts ();
% h5 ?! j* ~& o; U  f ( u4 m, G3 x* ?$ q
        /* turn off I/D-cache */6 Q- q  E; G1 P- |, y
        asm ("mrc p15, 0, %0, c1, c0, 0":"=r" (i));; N9 S; M3 a2 }6 ]2 H
        i &= ~(C1_DC | C1_IC);9 l8 @/ t2 F( I0 O
        asm ("mcr p15, 0, %0, c1, c0, 0": :"r" (i));
7 y6 q6 w4 m$ I$ C9 G ( f+ T+ C% _. u  j; \
        /* flush I/D-cache */" Z1 x/ v5 A8 F) ~  W  g' a7 F4 q
        i = 0;6 Z3 {! m( L7 X. L3 F5 C' B8 Q9 W
        asm ("mcr p15, 0, %0, c7, c7, 0": :"r" (i));
; N8 O7 {( v0 S- E1 R& g9 U  r8 Q- b , b' F0 A: A0 u3 W4 ], F; w
        return (0);
0 u2 d; b% S  T# @" `}
2 ~( r) y+ ^( v: v6 @; }# D4 k  R) H
可以看出该函数禁止了数据和指令cache,同时冲刷了cache。% o( R  J: }% c. Y
这里并没有禁止MMU,MMU禁止是在start.S中完成的。
+ R4 m8 B6 p( G
/ E( W- N# j( S! j6 F+ [  v* B) R2 O- i! Q
! A- r2 Q! H$ m& U9 H4 O% G) L
7 g% {! @6 P& F/ V

; U  U9 B! v# |. J! l2 W3 O. s
6 K3 c; n) Z( v  @7 G5 N* U
) V& M& r3 y6 H7 e9 d7 e3 ~+ X% K1 b% `1 |0 F
' b- \* P/ S1 X  R

该用户从未签到

2#
发表于 2020-6-10 19:05 | 只看该作者
ARM平台下Uboot启动Linux内核前的必备条件
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-30 08:07 , Processed in 0.093750 second(s), 23 queries , Gzip On.

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

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

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