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

uclinux启动过程详细分析

[复制链接]

该用户从未签到

跳转到指定楼层
1#
 楼主| 发表于 2024-11-29 15:50 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

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

x
& Q7 u6 z2 n$ B: E3 z1 ]
1 B0 m9 \: x% w5 v8 @8 K  T
uclinux表示micro-control linux.即“微控制器领域中的Linux系统”,是Lineo公司的主打产品,同时也是开放源码的嵌入式Linux的典范之作。uCLinux主要是针对目标处理器没有存储管理单元MMU(Memory Management Unit)的嵌入式系统而设计的。它已经被成功地移植到了很多平台上。由于没有MMU,其多任务的实现需要一定技巧。, U. D: M% T+ X" H6 U

7 h; c3 z6 n% A- j8 @& j- ^% Z; A
# \; [% g1 w& T. _uClinux启动过程6 ~2 R2 o% B& t; i8 C7 J6 D
9 `! \# l& a8 }' W) v* Y' S3 T) }, y
uCinux的启动主要经历三个阶段。首先,必须完成CPU和存储器的硬件初始化,在系统RAM中建立程序堆栈和数据段,建立程序的运行时的环境。初始化完成之后,uClinux内核就取得了CPU的控制权,开始操作系统自身的初始化,这包括建立RAM中断矢量表、加载设备驱动程序、内存管理模块等等。这一切完成后,uClinux启动一个最初的init线程,进入到第三阶段,这时内核已经正常运行,外围模块也都就绪,开始执行一些脚本文件(如/etc/rc脚本文件)。; W- u1 H7 j9 P, _: ^" T$ k; ~

  T: i% ]. W! |. J5 q' J) A- N一.kernel代码段之前的系统初始化$ Q6 C# j) w; E# F1 v
, R) k: s- g5 e: R( d6 ?8 @
1. uClinux-dist/linux-2.4.x/arch/ARMnommu/boot/compressed/head.S
1 x) M5 {' J7 j2 J! Z/ H$ Z6 i7 A  i: J# k( N2 x* k
开发板从上电开始,最开始执行的程序放在uClinux-dist/linux-2.4.x/arch/armnommu/boot/compressed/head.S中。$ m7 L$ W+ [6 U& J, y. k# a
5 P+ Y' n- a+ ^+ b5 p
(1) 切换模式,关闭中断。 (line 96 )
: a$ _# b( ^2 I: Z7 b4 M
6 b! Z% ^8 i% d/ e  H3 Z: {; u(2) 首先程序要先给SYSCFG,EXTDBWTH,ROMCON0等一系列系统控制寄存器赋值,此时flash地址在 0X0,DRAM地址在0X1000000.(line 141 )
  L3 I0 T- j* ^/ b5 ~  p
5 `' x7 E& w! z! \(3) 点亮I/O口的指示灯。 (line 152 )
8 M4 k2 q* ~0 U
+ p1 G2 ]! U1 i/ c9 h" y1 l& z(4) 把在flash上的image复制到DRAM上。(line 161 )% P- b0 e( e1 |% |3 M1 d) p
- |& A- {3 f0 J4 s9 K7 a
(5) 执行remap,把flash地址映射为0X1000000,DRAM地址映射为0.(line 172 )
4 v2 Y& ^, W% m  v/ n+ s; l
: \( J6 V3 G$ i$ ^8 `: u( ~6 y, s9 l  _( }(6) 打开cache和write buffer.(line 196 )
  @# R( d" n" U7 A0 X
7 n2 w% r$ W3 M7 y5 ^" F* H(7) 设置好64K堆栈。(line 204 )
+ u. v% F" U6 f
% k; p/ t3 Y' S6 s(8) 跳转到decompress_kernel函数(line 217 ),此处的跳转为带返回的跳转,以便于执行完此函数跳转回来。
: }$ ?" S, _, N$ O' t+ L$ U
  D5 J+ E  v+ Q$ f9 q. f# o. R2. uClinux-dist/linux-2.4.x/arch/armnommu/boot/compressed/misc.c0 e; e) ^2 N( ~7 z# \; S
/ L  m+ v, N9 y3 ]" R' _% R
此时的函数decompress_kernel是用C语言写的,line 297 。
) |+ u' U, I# M/ u6 X6 q5 A- l/ C
9 U, H5 W: \2 j4 I(1) makecrc();进行crc校验。
4 E% U7 Z3 K- i: g( m$ T9 }/ z5 G+ I5 q* B
(2) puts(“Uncompressing Linux.。.”); 输出linux起动后的第一句话。
3 |. B4 @9 |) i  S# W1 n
, y: Z6 U1 H2 i. m7 ?2 }( B- k(3) gunzip();解压缩kernel.( e0 o5 [3 p) R) ^. j

& ?8 Y, t9 I5 ~. Q4 ~( X(4) puts(“ done, booTIng the kernel./n”);
+ M- [, U- ^1 Y& c) Q7 o3 |: V- Q: I
3. uClinux-dist/linux-2.4.x/arch/armnommu/boot/compressed/head.S
% B' _6 c  I# ^* P" h; V( N1 Y) n6 D- l. {5 |3 `! C& Q& p$ j
执行完decompress_kernel函数后,kernel又跳转回head.S中,因为此时我们还要检验解压缩之后的kernel起始地址是否紧接着kernel image,如果是,beq call_kernel(line 220),执行解压后的kernel.
5 ~9 f# l" _/ @9 g' Y) A6 r/ V2 t+ w, m/ @. I% ]+ x1 ^
如果解压缩之后的kernel起始地址不是紧接着kernel image,执行relocate(line 236),将其拷贝到紧接着kernel image的地方,然后跳转,执行解压后的kernel.
7 N& [: t7 L2 B- e* P9 ^2 _5 c- n& M6 t7 @2 ^, G+ Q
二.kernel执行
! k$ v* G, X4 t: {/ P. X$ Z; G; q3 ^
/ d7 o3 T' Z6 m! {7 i1.uClinux-dist/linux-2.4.x/init/main.c中的start_kernel() (line 352)
2 ]2 y. w  C( l) b. V
5 V; r! R7 V, {系统启动过程到此,转入体系结构无关的通用C代码中,start_kernel() 中调用了一系列初始化函数,以完成kernel本身的设置。这些动作有的是公共的,有的则是需要配置的才会执行的。
5 C0 m2 t/ E  }% V3 ?
9 B& b4 T8 k5 E+ |" {(1) 输出Linux版本信息(printk(linux_banner)). M1 f* u+ k$ t
6 z# V+ V7 A/ G
(2) 设置与体系结构相关的环境(setup_arch())+ X, H  v+ a' b* v( S  B
3 o+ P! G( G/ k/ s/ f- F& U
(3) parse_opTIons(command_line);解析command_line,将其转化为环境变量。3 s: w& l  r7 R- ~  r# f) X
2 h' c3 B' u( T9 \% \2 @4 P5 ]8 f
(4) 初始化系统IRQ(init_IRQ())& e: p4 R/ E+ W5 V; \8 m

( e& M$ d1 C: b% F8 K  y(5) 核心进程调度器初始化(sched_init())
; Z- ~, b0 q  n
/ o, n: f4 q9 s- Q% w1 s. k! R0 H( T(6) 软中段初始化sofTIrq_init();
8 Q8 p; ~# r% o: |4 s; d
% K3 X- [, P9 U$ A, ](7) 时间、定时器初始化(包括估测主频、初始化定时器中断等,TIme_init())/ L6 e2 V4 }! _+ L

( E& |% f1 l4 \3 ]0 o) f; F+ O(8) 控制台初始化console_init();
$ h: D# _1 c' ]* M' `8 W5 E6 n
4 F. L3 ^2 H7 v$ U+ J(9) 核心CACHE初始化kmem_cache_init();  u! G( V  V  s" u( v0 I, ^6 E

- s' y* M4 J; U0 ?# A/ R6 v(10)延迟校准calibrate_delay();0 E9 g2 C% q. X# ~+ y

$ e) ~0 ~3 V% G: t0 k(11)内存初始化(设置内存上下界和页表项初始值,mem_init()): O' V9 l  Q" Q/ v4 v  i# ?8 }& v

9 P8 T6 \# v6 w, y' u/ O& Q, {) J(12)文件,目录,块设备读写缓冲区初始化' r; x  X" T# u6 \5 ?

$ W4 Z+ k+ \* g, g) w(13)检查体系结构漏洞(check_bugs())
% G1 y6 R: V4 f) l+ W, e5 P& F% m7 r2 ~+ ^  v! W" A! M
(14)启动init过程(创建第一个核心线程,调用init()函数,原执行序列调用cpu_idle() 等待调度,init()); s" a; o7 o* k: e4 ]
0 B' I1 m! b" B6 n. e! M4 A
至此start_kernel()结束,基本的核心环境已经建立起来了。
# V; b! j& p/ ]0 ]3 Y
( E- t. H  _) D# |3 d2.uClinux-dist/linux-2.4.x/init/main.c中的init() (line 548)
  p" M! i$ N+ _7 E. b8 a$ k  ^+ x* a9 M$ w
现在我们进入内核引导第二部分,init()函数作为核心线程,首先锁定内核(仅对SMP机器有效,我们为空函数),然后调用 do_basic_setup() (line 551)完成外设及其驱动程序的加载初始化。
- f# G. E2 O( m' U% i% i
" D5 `% K1 Y/ s过程如下:
( V& }5 u" T2 M4 C
% n) U* A' p0 b3 A. S! N. F# e* 网络初始化(初始化网络数据结构,包括sk_init()、skb_init()和proto_init()三部分,在proto_init()中,将调用protocols结构中包含的所有协议的初始化过程,sock_init())' {* L; G- t" S- `2 e! A
" E+ \9 S4 u* u( p( h* ]* F
* 创建事件管理核心线程(start_context_thread()函数,这是系统创建的第二个内核线程,名叫“keventd”。其代码context_thread()也在kernel/context.c中,)5 l( h) H( q6 f' o
$ W% B3 [% E& E; Z
启动任何使用__initcall标识的函数(方便核心开发者添加启动函数,此时由do_initcalls()函数启动)。5 q% C' P, I+ M; D* ]! H% |
; w, m5 i8 b  c
此时系统开始加载外部设备的初始化程序,如:在linux-2.4.x/driver/block/genhd.c中的device_init()函数,在genhd.c中由__initcall(device_init)标识在此时调用,device_init()函数是所有外部设备初始化的总入口,包括了块设备的初始化blk_dev_init,网络设备的初始化net_dev_init()和atmdev_init()等。
% T: n7 i3 E* l7 A; i  u; }8 ^0 F- b  {) P4 G
至此do_basic_setup()函数返回init(),在释放启动内存段(free_initmem())并给内核解锁以后,init()打开/dev/console设备,重定向stdin、stdout和stderr到控制台,最后,搜索文件系统中的init程序(或者由init=命令行参数指定的程序),并使用 execve()系统调用加载执行init程序。(line 576) 。$ }( u( \. b! ]! {8 i+ n1 }9 R
, ]( g0 [( h  D8 r; \
init()函数到此结束,内核的引导部分也到此结束了,# L& E. E! F/ V# f

* B6 g0 G) @1 f0 g, v# A# }3. uClinux-dist/linux-2.4.x/init/main.c中的execve(“/etc/init”,argv_init,envp_init); (line 579)
( W) U2 t. y/ z$ y, ]2 `& b* N! }  x1 {/ x- U1 ^
init进程是系统所有进程的起点,内核在完成核内引导以后,即在本线程(进程)空间内加载init程序,它的进程号是1。$ j! I" e) _2 Q. l4 }3 l
4 v. q. M! G4 i8 }& f( h! ?
init程序需要读取/vendors/SAMSUNG/4510B/inittab文件作为其行为指针,然后执行。
2 a& L8 A/ V8 e2 w7 i! T, }
  Y' Z1 n+ ?, y; V
1 W( m: n+ s! J
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-19 21:07 , Processed in 0.140625 second(s), 27 queries , Gzip On.

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

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

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