uclinux启动过程详细分析

uclinux启动过程详细分析,第1张

  uclinux表示micro-control linux.即“微控制器领域中的Linux系统”,是Lineo公司的主打产品,同时也是开放源码的嵌入式Linux的典范之作。uCLinux主要是针对目标处理器没有存储管理单元MMU(Memory Management Unit)的嵌入式系统而设计的。它已经被成功地移植到了很多平台上。由于没有MMU,其多任务的实现需要一定技巧。

  uClinux启动过程

  uCinux的启动主要经历三个阶段。首先,必须完成CPU存储器的硬件初始化,在系统RAM中建立程序堆栈和数据段,建立程序的运行时的环境。初始化完成之后,uClinux内核就取得了CPU的控制权,开始 *** 作系统自身的初始化,这包括建立RAM中断矢量表、加载设备驱动程序、内存管理模块等等。这一切完成后,uClinux启动一个最初的init线程,进入到第三阶段,这时内核已经正常运行,外围模块也都就绪,开始执行一些脚本文件(如/etc/rc脚本文件)。

  一.kernel代码段之前的系统初始化

  1. uClinux-dist/linux-2.4.x/arch/armnommu/boot/compressed/head.S

  开发板从上电开始,最开始执行的程序放在uClinux-dist/linux-2.4.x/arch/armnommu/boot/compressed/head.S中。

  (1) 切换模式,关闭中断。 (line 96 )

  (2) 首先程序要先给SYSCFG,EXTDBWTH,ROMCON0等一系列系统控制寄存器赋值,此时flash地址在 0X0,DRAM地址在0X1000000.(line 141 )

  (4) 把在flash上的image复制到DRAM上。(line 161 )

  (5) 执行remap,把flash地址映射为0X1000000,DRAM地址映射为0.(line 172 )

  (6) 打开cache和write buffer.(line 196 )

  (7) 设置好64K堆栈。(line 204 )

  (8) 跳转到decompress_kernel函数(line 217 ),此处的跳转为带返回的跳转,以便于执行完此函数跳转回来。

  2. uClinux-dist/linux-2.4.x/arch/armnommu/boot/compressed/misc.c

  此时的函数decompress_kernel是用C语言写的,line 297 。

  (1) makecrc();进行crc校验。

  (2) puts(“Uncompressing Linux.。.”); 输出linux起动后的第一句话。

  (3) gunzip();解压缩kernel.

  (4) puts(“ done, booTIng the kernel./n”);

  3. uClinux-dist/linux-2.4.x/arch/armnommu/boot/compressed/head.S

  执行完decompress_kernel函数后,kernel又跳转回head.S中,因为此时我们还要检验解压缩之后的kernel起始地址是否紧接着kernel image,如果是,beq call_kernel(line 220),执行解压后的kernel.

  如果解压缩之后的kernel起始地址不是紧接着kernel image,执行relocate(line 236),将其拷贝到紧接着kernel image的地方,然后跳转,执行解压后的kernel.

  二.kernel执行

  1.uClinux-dist/linux-2.4.x/init/main.c中的start_kernel() (line 352)

  系统启动过程到此,转入体系结构无关的通用C代码中,start_kernel() 中调用了一系列初始化函数,以完成kernel本身的设置。这些动作有的是公共的,有的则是需要配置的才会执行的。

  (1) 输出Linux版本信息(printk(linux_banner))

  (2) 设置与体系结构相关的环境(setup_arch())

  (3) parse_opTIons(command_line);解析command_line,将其转化为环境变量。

  (4) 初始化系统IRQ(init_IRQ())

  (5) 核心进程调度器初始化(sched_init())

  (6) 软中段初始化sofTIrq_init();

  (7) 时间、定时器初始化(包括估测主频、初始化定时器中断等,TIme_init())

  (8) 控制台初始化console_init();

  (9) 核心CACHE初始化kmem_cache_init();

  (10)延迟校准calibrate_delay();

  (11)内存初始化(设置内存上下界和页表项初始值,mem_init())

  (12)文件,目录,块设备读写缓冲区初始化

  (13)检查体系结构漏洞(check_bugs())

  (14)启动init过程(创建第一个核心线程,调用init()函数,原执行序列调用cpu_idle() 等待调度,init())

  至此start_kernel()结束,基本的核心环境已经建立起来了。

  2.uClinux-dist/linux-2.4.x/init/main.c中的init() (line 548)

  现在我们进入内核引导第二部分,init()函数作为核心线程,首先锁定内核(仅对SMP机器有效,我们为空函数),然后调用 do_basic_setup() (line 551)完成外设及其驱动程序的加载初始化。

  过程如下:

  * 网络初始化(初始化网络数据结构,包括sk_init()、skb_init()和proto_init()三部分,在proto_init()中,将调用protocols结构中包含的所有协议的初始化过程,sock_init())

  * 创建事件管理核心线程(start_context_thread()函数,这是系统创建的第二个内核线程,名叫“keventd”。其代码context_thread()也在kernel/context.c中,)

  启动任何使用__initcall标识的函数(方便核心开发者添加启动函数,此时由do_initcalls()函数启动)。

  此时系统开始加载外部设备的初始化程序,如:在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()等。

  至此do_basic_setup()函数返回init(),在释放启动内存段(free_initmem())并给内核解锁以后,init()打开/dev/console设备,重定向stdin、stdout和stderr到控制台,最后,搜索文件系统中的init程序(或者由init=命令行参数指定的程序),并使用 execve()系统调用加载执行init程序。(line 576) 。

  init()函数到此结束,内核的引导部分也到此结束了,

  3. uClinux-dist/linux-2.4.x/init/main.c中的execve(“/etc/init”,argv_init,envp_init); (line 579)

  init进程是系统所有进程的起点,内核在完成核内引导以后,即在本线程(进程)空间内加载init程序,它的进程号是1。

  init程序需要读取/vendors/SAMSUNG/4510B/inittab文件作为其行为指针,然后执行。

  4.系统执行rc脚本。

  hostname Samsung

  /bin/expand /etc/ramfs.img /dev/ram0

  /bin/expand /etc/ramfs2048.img /dev/ram1

  mount -t proc proc /proc

  mount -t ext2 /dev/ram0 /var

  mount -t ext2 /dev/ram1 /ramdisk

  chmod 777 /ramdisk

  mkdir /var/config

  mkdir /var/tmp

  mkdir /var/log

  mkdir /var/run

  mkdir /var/lock

  ifconfig lo 127.0.0.1

  route add -net 127.0.0.0 netmask 255.255.255.0 lo

  dhcpcd &

  cat /etc/motd

  rc程序执行完毕后,系统环境已经设置好了,下面就该用户登录系统了。

  5.运行Sash command shell

  uclinux启动的详细过程有着诸多的信息可以给我们巨大的启发,我们在这里讨论的就是要对这些信息做一个具体细致的分析,通过我们的讨论,大家会对uclinux启动过程中出现的、以前感觉熟悉的、但却又似是而非的东西有一个确切的了解,并且能了解到这些输出信息的来龙去脉。

  uclinux的启动过程,它是一幅缩影图,对它有了一个详细的了解后,有助于指导我们更加深入地了解uclinux的核心。

  大家对uclinux的启动应该都比较熟悉,作为一名嵌入系统开发者,你一定遇到过下面的情景:在某论坛上看到一篇帖子,上面贴着uclinux开发板启动时的一堆信息,然后大家在帖子里讨论着这个启动过程中出现的问题,随机举例如下:

  Linux version 2.4.20-uc1 (root@Local) (gcc version 2.95.3

  20010315 (release)(ColdFire patches - 20010318 from http://f

  (uClinux XIP and shared lib patches from http://www.snapgear.com/)) #20 三 6月 1

  8 00:58:31 CST 2003

  Processor: Samsung S3C4510B revision 6

  Architecture: SNDS100

  On node 0 totalpages: 4096

  zone(0): 0 pages.

  zone(1): 4096 pages.

  zone(2): 0 pages.

  Kernel command line: root=/dev/rom0

  Calibrating delay loop.。. 49.76 BogoMIPS

  Memory: 16MB = 16MB total

  Memory: 14348KB available (1615K code, 156K data, 40K init)

  Dentry cache hash table entries: 2048 (order: 2, 16384 bytes)

  Inode cache hash table entries: 1024 (order: 1,

  Mount-cache hash table entries: 512 (order: 0, 4096 bytes)

  Buffer-cache hash table entries: 1024 (order: 0, 4096 bytes)

  Page-cache hash table entries: 4096 (order: 2, 16384 bytes)

  POSIX conformance testing by UNIFIX

  Linux NET4.0 for Linux 2.4

  Based upon Swansea University Computer Society NET3.039

  Initializing RT netlink socket

  Starting kswapd

  Samsung S3C4510 Serial driver version 0.9 (2001-12-27) with no serial options en

  abled

  ttyS00 at 0x3ffd000 (irq = 5) is a S3C4510B

  ttyS01 at 0x3ffe000 (irq = 7) is a S3C451

  Blkmem copyright 1998,1999 D. Jeff Dionne

  Blkmem copyright 1998 Kenneth Albanowski

  Blkmem 1 disk images:

  0: BE558-1A5D57 [VIRTUAL BE558-1A5D57] (RO)

  RAMDISK driver initialized: 16 RAM disks of 1024K size 1024 blocksize

  Samsung S3C4510 Ethernet driver version 0.1 (2002-02-20) 《mac@os.nctu.edu.tw》

  eth0: 00:40:95:36:35:34

  NET4: Linux TCP/IP 1.0 for NET4.0

  IP Protocols: ICMP, UDP, TCP

  IP: routing cache hash table of 512 buckets, 4Kbytes

  TCP: Hash tables configured (established 1024 bind 1024)

  VFS: Mounted root (romfs

  Freeing init memory: 40K

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/dianzi/2717366.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-17
下一篇 2022-08-17

发表评论

登录后才能评论

评论列表(0条)

保存