嵌入式 uboot引导kernel,kernel引导fs【转】

简介:

转自:http://www.cnblogs.com/lidabo/p/5383934.html#3639633

1、uboot引导kernel:
      u-boot中有个bootm命令,它可以引导内存中的应用程序映像(Kernel),bootm命令对应
common/cmd_bootm.c中的do_bootm()函数,此函数实现下面几个功能:
    1)读flash中的内核映像文件
    2)解压内核
    3)校验内核
    4)跳到内核执行(调用do_bootm_linux()函数)
    {

1、Stage1 start.S代码结构 u-boot的stage1代码通常放在start.S文件中,他用汇编语言写成,其主要代码部分如下

 

(1) 定义入口。: 

该工作通过修改连接器脚本来完成。

(2)设置异常向量(Exception Vector)。 

(3)设置CPU的速度、时钟频率及终端控制寄存器。 

(4)初始化内存控制器。 

(5)将ROM中的程序复制到RAM中。 

(6)初始化堆栈。 

(7)转到RAM中执行,该工作可使用指令ldr pc来完成。

 

2、Stage2 C语言代码部分 lib_arm/board.c中的start arm boot是C语言开始的函数也是整个启动代码中C语言的主函数,同时还是整个u-boot(armboot)的主函数,该函数只要完成如下操作: 

(1)调用一系列的初始化函数。 

(2)初始化Flash设备。 

(3)初始化系统内存分配函数。 

(4)如果目标系统拥有NAND设备,则初始化NAND设备。 

(5)如果目标系统有显示设备,则初始化该类设备。 

(6)初始化相关网络设备,填写IP、MAC地址等。 

(7)进去命令循环(即整个boot的工作循环),接受用户从串口输入的命令,然后进行相应的工作。

}
 
2、kernel引导fs:
    1)获得可运行的Linux内核
    2)内核装载时的内存空间映射
    3)内核启始相关文件分析
    4)arch/i386/boot/bootsect.S
    5)arch/i386/boot/setup.S
    6)arch/i386/boot/compressed/head.S
    7)arch/i386/kernel/head.S
    8)start_kernel
    {

在start_kernel()函数中:

  输出Linux版本信息(printk(_banner))

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

  页表结构初始化(paging_init())

  使用"arch/alpha/kernel/entry.S"中的入口点设置系统自陷入口(trap_init())

  使用alpha_mv结构和entry.S入口初始化系统IRQ(init_IRQ())

  核心进程调度器初始化(包括初始化几个缺省的Bottom-half,sched_init())

  时间、定时器初始化(包括读取CMOS时钟、估测主频、初始化定时器中断等,time_init())

  提取并分析核心启动参数(从环境变量中读取参数,设置相应标志位等待处理,(parse_options())

  控制台初始化(为输出信息而先于PCI初始化,console_init())

  剖析器数据结构初始化(prof_buffer和prof_len变量)

  核心Cache初始化(描述Cache信息的Cache,kmem_cache_init())

  延迟校准(获得时钟jiffies与CPU主频ticks的延迟,calibrate_delay())

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

  创建和设置内部及通用cache("slab_cache",kmem_cache_sizes_init())

  创建uid taskcount SLAB cache("uid_cache",uidcache_init())

  创建文件cache("files_cache",filescache_init())

  创建目录cache("dentry_cache",dcache_init())

  创建与虚存相关的cache("vm_area_struct","mm_struct",vma_init())

  块设备读写缓冲区初始化(同时创建"buffer_head"cache用户加速访问,buffer_init())

  创建页cache(内存页hash表初始化,page_cache_init())

  创建信号队列cache("signal_queue",signals_init())

  初始化内存inode表(inode_init())

  创建内存文件描述符表("filp_cache",file_table_init())

  检查体系结构漏洞(对于alpha,此函数为空,check_bugs())

  SMP机器其余CPU(除当前引导CPU)初始化(对于没有配置SMP的内核,此函数为空,smp_init())

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

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

    }
    9)第一个内核线程 - kernel_init

三、start_kernel函数流程:
 

}












本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sky-heaven/p/7282628.html,如需转载请自行联系原作者



相关文章
|
安全 Linux 调度
嵌入式系统中bootloader、kernel、rootfs 介绍
嵌入式系统中bootloader、kernel、rootfs 介绍
544 0
SPI设备标准驱动源码分析(linux kernel 5.18)
SPI设备标准驱动源码分析(linux kernel 5.18)
SPI设备标准驱动源码分析(linux kernel 5.18)
|
Linux Shell 调度
嵌入式Linux内核kernel学习(基于I.m6ull)
嵌入式Linux内核kernel学习(基于I.m6ull)
267 0
|
Shell C语言 芯片
嵌入式实践教程--使用Buildroot制作Uboot&Kernel&Rootfs
嵌入式实践教程--使用Buildroot制作Uboot&Kernel&Rootfs
嵌入式实践教程--使用Buildroot制作Uboot&Kernel&Rootfs
|
开发工具
Hi3516开发笔记(六):通过HiTools使用USB/串口将uboot、kernel、rootfs和userdata按照分区表烧写镜像
Hi3516开发笔记(六):通过HiTools使用USB/串口将uboot、kernel、rootfs和userdata按照分区表烧写镜像
Hi3516开发笔记(六):通过HiTools使用USB/串口将uboot、kernel、rootfs和userdata按照分区表烧写镜像
|
存储 Linux 芯片
如何编写linux下nand flash驱动-3
【读(read)操作过程详解】 以最简单的read操作为例,解释如何理解时序图,以及将时序图 中的要求,转化为代码。   解释时序图之前,让我们先要搞清楚,我们要做的事情:那就是,要从nand flash的某个页里面,读取我们要的数据。
1062 0
|
存储 算法 Linux
如何编写linux下nand flash驱动-4
2.       软件方面 如果想要在Linux下编写Nand Flash驱动,那么就先要搞清楚Linux下,关于此部分的整个框架。弄明白,系统是如何管理你的nand flash的,以及,系统都帮你做了那些准备工作,而剩下的,驱动底层实现部分,你要去实现哪些功能,才能使得硬件正常工作起来。
950 0
|
存储 Linux 芯片
如何编写linux下nand flash驱动-1
1.       硬件特性: 【Flash的硬件实现机制】 Flash全名叫做Flash Memory,属于非易失性存储设备(Non-volatile Memory Device),与此相对应的是易失性存储设备(Volatile Memory Device)。
966 0
|
Linux 调度 C语言
嵌入式 uboot引导kernel,kernel引导fs【转】
转自:http://www.cnblogs.com/lidabo/p/5383934.html#3639633 1、uboot引导kernel: u-boot中有个bootm命令,它可以引导内存中的应用程序映像(Kernel),bootm命令对应 common/cmd_bootm.
1081 0