您的位置 首页 数字

uclinux发动进程详细分析

uclinux表示micro-control linux.即ldquo;微控制器领域中的Linux系统rdquo;,是Lineo公司的主打产品,同时也是开放源码的嵌入式Linux的典范之作。u

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 )

(3) 点亮I/O口的指示灯。 (line 152 )

(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文件作为其行为指针,然后履行。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/shuzi/136699.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部