arm linux 启动之一:汇编启动到start_kernel

发布者:温柔花香最新更新时间:2016-06-16 来源: eefocus关键字:arm  linux  启动 手机看文章 扫描二维码
随时随地手机看文章
描述arm linux启动的概要过程,以S5PV210(Cortex A8)为例,本文描述第一个阶段。

       一、arm linux的引导

       uboot在引导arm linux(uImage镜像)到SDRAM之后,通过bootm命令对uImage镜像的64个字节头进行解释,获取linux的entry入口地址,并赋值给theKernel函数指针(一般该值是0x38),并将uboot的环境变量参数(如平台的内存块区域信息、linux启动命令信息bootargs等)按linux要求的tags形式放置在0x30100起始的地方。接着关掉MMU,清除icache,dcache,最后通过该函数将控制权交给arm linux:

       theKernel (0, machid, bd->bi_boot_params);

       其中,machid是平台的id,其需要与arch/arm/tools/mach_types 中定义的机器ID一致,否则无法启动。 bd->bi_boot_params即0x30100,描述了linux启动所需要的信息。

       二、arm linux启动的第一部分

       该部分是体系相关的汇编部分,代码位于arch\arm\kernel\head.S,入口是ENTRY(stext),其主要完成的工作包括:

       1) 设置当前arm工作模式是svc mode,关中断

       2)__lookup_processor_type 获取对应的CPU信息数据结构地址,主要是arm v7架构相关的信息,如MMU,cache标志值等,数据结构如下:

 

struct proc_info_list {

   unsigned int    cpu_val;

   unsigned int    cpu_mask;

   unsigned long     __cpu_mm_mmu_flags;   /* used by head.S */

   unsigned long     __cpu_io_mmu_flags;   /* used by head.S */

   unsigned long     __cpu_flush;    /* used by head.S */

   const char      *arch_name;

   const char      *elf_name;

   unsigned int    elf_hwcap;

   const char      *cpu_name;

   struct processor   *proc;

   struct cpu_tlb_fns *tlb;

   struct cpu_user_fns   *user;

   struct cpu_cache_fns  *cache;

}; 

       arm linux支持各种CPU体系架构,其描述在.proc.info.init 段,对应S5PV210即arch\arm\mm\proc-v7.S, lookup_processor_type先通过协处理器CP15读出CPU ID并跟cpu_val比较,匹配即可得到数据结构地址。该地址是链接到虚拟地址,而此时MMU是关闭的,需要将该地址转为物理地址访问。

         3)__lookup_machine_type获取对应平台机器的数据结构地址,主要是平台板子相关的数据信息,如内存起始地址和大小,中断和timer初始化函数等,如下:          

 

struct machine_desc {

   unsigned int   nr;      /* architecture number   */

   unsigned int    phys_io; /* start of physicalio  */

   unsigned int    io_pg_offst; /* byte offsetfor io   * page tabe entry */

   const char      *name;  /* architecture name  */

   unsigned long      boot_params; /*tagged list     */

   unsigned int    video_start; /* start of videoRAM */

   unsigned int    video_end;  /* end ofvideo RAM   */

   unsigned int    reserve_lp0 :1; /* never haslp0   */

   unsigned int    reserve_lp1 :1; /* never haslp1   */

   unsigned int    reserve_lp2 :1; /* never haslp2   */

   unsigned int    soft_reboot :1; /* softreboot     */

   void       (*fixup)(struct machine_desc *,   struct tag *, char **,    struct meminfo *);

   void       (*map_io)(void);/* IO mapping function  */

   void       (*init_irq)(void);

   struct sys_timer   *timer;    /* system tick timer  */

   void       (*init_machine)(void);

};

          arm linux支持各种平台板子,其描述在.arch.info.init 段,对应S5PV210即\arch\arm\mach-s5pv210\mach-smdkv210.c。UBOOT的machid即用于搜索匹配nr,以取到机器信息。

        4)检查uboot传递过来的tags是否符合标准,并检测machine数据结构的boot_params的值是否等于theKernel传递过来的第三个参数(0x30100)

        5)create_page_tables 创建临时页表,均是以1M为单位进行映射,所以4G空间需要16K,从0x34到0X38。共映射三个部分:

               i. linux内核镜像空间的映射(0xc8***开始的内核空间映射到0x38***)

               ii. 创建页表到开启mmu之间还有一段代码需要运行,因为还需要为linux启动的初始1M空间创建一段直接映射,此时还是0X38+的地址运行,所以映射是0X38+映射到0X38+

               iii. uboot传递过来的tags参数也需要进行映射(虚拟0XC**映射到0X3**),以进行访问。

        6)ldr r13, __switch_data,将 __switch_data数据结构的地址入栈。

        7)add   pc,r10, #PROCINFO_INITFUNC,即将PC改到arch\arm\mm\proc-v7.S的 __v7_setup去执行,跳转前将__enable_mmu放到lr,即 __v7_setup执行完就返回到__enable_mmu。 __v7_setup主要是CPU体系相关的初始化,如icache,dcache等。

        8)__enable_mmu打开MMU,cache等,最后将r13出栈,取出arch/arm/kernel/head-common.S的__switch_data的第一个内容__mmap_switched函数,并赋给PC:

 

__switch_data:

   .long __mmap_switched

   .long__data_loc         @ r4

   .long_data           @ r5

   .long __bss_start        @r6

   .long_end            @ r7

   .long processor_id       @ r4

   .long __machine_arch_type      @ r5

   .long __atags_pointer       @r6

   .long cr_alignment       @ r7

   .long init_thread_union + THREAD_START_SP @ sp

         9)__mmap_switched初始化data,bss等相关段,保存相关的数据结构地址到相关变量。设置以后系统启动init进程的栈空间。

        10)b  start_kernel 跳转到linux启动的第二部分,为C语言编写。

关键字:arm  linux  启动 引用地址:arm linux 启动之一:汇编启动到start_kernel

上一篇:arm linux 启动之二:start_kernel到创建1号进程
下一篇:ARM Linux启动代码分析

推荐阅读最新更新时间:2024-03-16 14:57

IET在华启动“企业合作伙伴”计划
2011年8月16日,北京——欧洲最大、全球第二大专业技术学会英国工程技术学会 (IET) 日前在华启动“企业合作伙伴”计划。这是IET继今年三月在华启动“教育合作伙伴”计划之后的又一重大进展。IET希望通过“企业合作伙伴”计划,同中国企业结成战略合作关系,协助企业提升其工程师和技术人员专业化水平,达到国际工程师标准,从而提升企业整体技术竞争力以及国际知名度。 企业为了适应不断变化的竞争环境,保持自身在国际市场的可持续竞争力,一直在寻找提高其工程师和技术人员专业能力的方法和途径,以帮助他们达到国际化工程人才标准。IET“企业合作伙伴”计划不但能够满足企业的人才发展需求,同时也能满足企业的国际化发展需求。根据此计划,IET将为企业
[半导体设计/制造]
基于linux的navicat破解
关于linux简介 Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。 Linux操作系统诞生于1991 年10 月5 日(这是第一次正式向外公布时间)。Linux存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。   严格来讲,Linux这个词本身只表
[嵌入式]
ARM linux系统调用的实现原理
  大家都知道linux的应用程序要想访问内核必须使用系统调用从而实现从usr模式转到svc模式。下面咱们看看它的实现过程。   系统调用是os操作系统提供的服务,用户程序通过各种系统调用,来引用内核提供的各种服务,系统调用的执行让用户程序陷入内核,该陷入动作由swi软中断完成。   at91rm9200处理器对应的linux2.4.19内核系统调用对应的软中断定义如下:   #if defined(__thumb__) //thumb模式   #define __syscall(nAME) \\   "push {r7} \\t" \\   "mov r7, #" __sys1(__NR_##name) " \\t"
[单片机]
PLC的启动方式在什么模块上进行设置?
plc的启动方式在CPU模块参数的启动特性(SETUP)选项中设置。热启动(Hotrestart)、暖启动(Warmrestart)、冷启动(Clodrestart)为S7系列PLC根据EN61131标准定义的,在PLC-CPU重新启动时的三种新的启动方式名称。在S7系列PLC中,三种启动方式的启动过程如下: 热启动:在PLC-CPU重新启动时,执行主循环OB1前,首先处理组织块OB101。启动时全部CPU数据均被备份,所有数据区(包括定时器、计数器、标志寄存器等,不分保持区与非保持区)的内容全部被保留。 暖启动:在PLC-CPU重新启动时,执行主循环OB1前,首先处理组织块OB100。启动时全部PLC数据块(DB)的内容
[嵌入式]
ARM的学习和开发都需要学习哪些软件
总结起来最主要的有以下几个吧 1 ADS调试用 确切的说是ADS+AXD。ADS里包含AXD。原来都用SDT后来arm公司停止对SDT支持了,改支持ADS了,还是用ADS吧。 有的人的程序发布的仍然是SDT版本的,但基本都可以找到相应ADS的,新人在这里不要发蒙。ADS是编译器,AXD是调试器。编译成AXF以后再在arm的RAM里调试。 2 FLASHPGM FLASH烧写的软件。AXD在RAM里调试,掉电就没有了,方便程序修改。调试好的程序再下到FLASH里,上电直接运行。 同类的软件还有很多,什么FLUTED了、FLSHP了都是,但FLASHPGM最好,要是有人还问FLASH不支持BIN格式文件的问题就要看我写的FLA
[单片机]
ARM7的MVB_CAN网关设计方案
0 引言 随着网络技术和控制技术的发展,机车信息化控制技术向着更高的方向发展。为此,IEC制定出新的列车通信网路国际标准TCN(机车通信网络),以满足列车微机控制系统中对车载数据通信网提出的新要求。 按照TCN标准,列车通信网可分为两级:第一级是WTB绞线式列车总线(Wired Train Bus),可实现车辆间的数据通信;第二级是MVB(Mul-tifunction Vehicle bus)多功能车辆总线,主要实现同一个车辆内各个功能控制单元之间的数据通信。 多功能车辆总线(MVB)是主要用于有互操作性和互换性要求的互连设备之间进行串行数据通信的一种总线,MVB以其高实时性、高可靠性及可管理性等多方面的优势而广泛的应用在
[单片机]
<font color='red'>ARM</font>7的MVB_CAN网关设计方案
ARM IP产品集团总裁揭秘与中国合资背后
集微网消息,据日经新闻报道,ARM知识产权产品集团总裁Rene Haas表示,ARM与中国成立合资企业旨在培育安全的芯片技术。  Rene Haas表示,合资公司的意图是为中国合作伙伴开发适合中国市场的产品,特别在西方公司可能无法做的技术领域。ARM将与中国合作伙伴在几个月内组建合资企业,帮助中国企业开发半导体技术,包括可能使用军事或监控的产品。 Rene Haas说,例如,如果企业正在为中国军队或监控领域开发一个芯片系统,鉴于中国安全要求必须非常高,政府只与具备这种安全资质的企业合作,有了合资企业,过去我们无法做到的事情,现在都可以进入。 根据2016年12月出版的的美国国防贸易刊物《军事和航空航天电子》的介绍,英特尔微处
[手机便携]
基于ARM7的RTU微控制器的设计
引言 随着我国在水情数据采集系统的信息化和现代化步伐的加快,需要采集的数据种类增多,采集的站点数增加,对数据采集的速度和质量都提出了新的要求,传统的水情数据测报系统的RTU(远端数据采集器)已不能适应新的要求,亟需开发新的产品。 新开发的RTU,其处理能力要比较强,可扩展性要比较好,运行的软件系统具有可移植性,可以移植到不同的硬件平台,可以根据需要配置不同的传感器。为此技术上选用成熟可靠的RTOS 和层次化、构件化的设计思想构建平台软件,保证软件稳定、可靠,扩充新业务功能时软件结构体系保持不变。 RTU 对外有各种类型的传感器接口及通信接口,平时处于守侯状态,当有外部事件或定时处理事件时,由中断信号唤醒CPU 进行相应的处理
[单片机]
基于<font color='red'>ARM</font>7的RTU微控制器的设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved