Linux ARMv7中断向量表搬移(2)

发布者:神光骑士最新更新时间:2021-11-24 来源: eefocus关键字:Linux  ARMv7  中断向量表 手机看文章 扫描二维码
随时随地手机看文章

一. Linux ARMv7启动阶段对中断向量表的搬移

1、中断向量表和中断处理部分代码的搬移

经历过kernel的汇编阶段,进入C语言start_kernel后对中断向量表的位置进行搬移,搬移函数是early_trap_init。


early_trap_init函数的调用流程为:

 start_kernel(init/main.c)--->setup_arch(arch/arm/kernel/setup.c)--->paging_init(arch/arm/mm/mmu.c)--->devicemaps_init(arch/arm/mm/mmu.c)--->early_trap_init(arch/arm/kernel/traps.c)


/*

* Set up the device mappings. Since we clear out the page tables for all

* mappings above VMALLOC_START, except early fixmap, we might remove debug

* device mappings. This means earlycon can be used to debug this function

* Any other function or debugging method which may touch any device _will_

* crash the kernel.

*/

static void __init devicemaps_init(const struct machine_desc *mdesc)

{

        struct map_desc map;

        unsigned long addr;

        void *vectors;

        /*

         * Allocate the vector page early.

         *分配两个页的内存空间,arm中每个页的大小为4K,这两个页的内存空间,一个是为保存中断向量

         *表,一个是为了保存中断的处理部分代码,这两部分代码的排布可以在

         *(arch/arm/kernel/vmlinux.lds和arch/arm/kernel/entry-armv.S)中可以具体分析出来

         */

        vectors = early_alloc(PAGE_SIZE * 2);

        early_trap_init(vectors);

 

         /*

          * Clear page table except top pmd used by early fixmaps

          */

         for (addr = VMALLOC_START; addr < (FIXADDR_TOP & PMD_MASK); addr += PMD_SIZE)

                pmd_clear(pmd_off_k(addr));

 

         /*

          * Map the kernel if it is XIP.

          * It is always first in the modulearea.

          */

#ifdef CONFIG_XIP_KERNEL  //此宏未定义

        map.pfn = __phys_to_pfn(CONFIG_XIP_PHYS_ADDR & SECTION_MASK);

        map.virtual = MODULES_VADDR;

        map.length = ((unsigned long)_etext - map.virtual + ~SECTION_MASK) & SECTION_MASK;

        map.type = MT_ROM;

        create_mapping(&map);

#endif

 

 

        /*

         * Map the cache flushing regions.

         */

#ifdef FLUSH_BASE  //此宏未定义

        map.pfn = __phys_to_pfn(FLUSH_BASE_PHYS);

        map.virtual = FLUSH_BASE;

        map.length = SZ_1M;

        map.type = MT_CACHECLEAN;

        create_mapping(&map);

#endif

#ifdef FLUSH_BASE_MINICACHE  //此宏未定义

        map.pfn = __phys_to_pfn(FLUSH_BASE_PHYS + SZ_1M);

        map.virtual = FLUSH_BASE_MINICACHE;

        map.length = SZ_1M;

        map.type = MT_MINICLEAN;

        create_mapping(&map);

#endif

 

 

        /*

         * Create a mapping for the machine vectors at the high-vectors

         * location (0xffff0000). If we aren't using high-vectors, also

         * create a mapping at the low-vectors virtual address.

         */

        /*

         *创建一个页的内存地址映射,虚拟地址为0xffff0000,此地址为中断向量表的高端地址

         *设置中断向量表的高端地址在汇编的v7_setup中,使用的v7_crval设置了cp15的c1寄存器

         *v7_crval定义在arch/arm/mm/proc-v7-2level.S。

         */

        map.pfn = __phys_to_pfn(virt_to_phys(vectors));

        map.virtual = 0xffff0000;

        map.length = PAGE_SIZE;

#ifdef CONFIG_KUSER_HELPERS  //此宏有定义

        map.type = MT_HIGH_VECTORS;

#else

        map.type = MT_LOW_VECTORS;

#endif

        create_mapping(&map);

        /*

         *判断中断向量表的位置是否设置在高端地址,如果中断向量表没有设置在高端地址,

         *在映射低端中断向量表地址。

         */

        if (!vectors_high()) {

                map.virtual = 0;

                map.length = PAGE_SIZE * 2;

                map.type = MT_LOW_VECTORS;

            create_mapping(&map);

        }

 

        /* Now create a kernel read-only mapping */

        map.pfn += 1;

        map.virtual = 0xffff0000 + PAGE_SIZE;

        map.length = PAGE_SIZE;

        map.type = MT_LOW_VECTORS;

        create_mapping(&map);

 

        /*

         * Ask the machine support to map in the statically mapped devices.

         */

        if (mdesc->map_io)

                mdesc->map_io();

        else

                debug_ll_io_init();

                fill_pmd_gaps();

 

        /* Reserve fixed i/o space in VMALLOC region */

        pci_reserve_io();

 

         /*

          * Finally flush the caches and tlb to ensure that we're in a

          * consistent state wrt the writebuffer. This also ensures that

          * any write-allocated cache lines in the vector page are written

          * back. After this point, we can start to touch devices again.

          */

        local_flush_tlb_all();

        flush_cache_all();

 

        /* Enable asynchronous aborts */

        early_abt_enable();

        /*   AT

         *  TFR   EV X F   I D LR    S

         * .EEE ..EE PUI. .T.T 4RVI ZWRS BLDP WCAM

         * rxxx rrxx xxx0 0101 xxxx xxxx x111 xxxx < forced

         *   01    0 110       0011 1100 .111 1101 < we want

         */

        .align  2

        .type   v7_crval, #object

v7_crval:

        crval   clear=0x2120c302, mmuset=0x10c03c7d, ucset=0x00c01c7c

early_trap_init函数的分析


void __init early_trap_init(void *vectors_base)

{

#ifndef CONFIG_CPU_V7M

        unsigned long vectors = (unsigned long)vectors_base;

        extern char __stubs_start[], __stubs_end[];

        extern char __vectors_start[], __vectors_end[];

        unsigned i;

 

        vectors_page = vectors_base;

    

        /*

         * Poison the vectors page with an undefined instruction.  This

         * rly_trap_init instruction is chosen to be undefined for both ARM and Thumb

         * ISAs.  The Thumb version is an undefined instruction with a

         * branch back to the undefined instruction.

         * 将申请的4K先设置为未定义指令,防止在发生其他中断时,没有处理导致cpu错误

         */

        for (i = 0; i < PAGE_SIZE / sizeof(u32); i++)

                ((u32 *)vectors_base)[i] = 0xe7fddef1;/*

         * Copy the vectors, stubs and kuser helpers (in entry-armv.S)

         * into the vector page, mapped at 0xffff0000, and ensure these

         * are visible to the instruction stream.

         */

        /*

         *将中断向量表和中断处理的代码搬移到申请的两页地址空间内

         */

        memcpy((void *)vectors, __vectors_start, __vectors_end - __vectors_start);

        memcpy((void *)vectors + 0x1000, __stubs_start, __stubs_end - __stubs_start);

 

        kuser_init(vectors_base);

 

        flush_icache_range(vectors, vectors + PAGE_SIZE * 2);

#else /* ifndef CONFIG_CPU_V7M */

        /*

         * on V7-M there is no need to copy the vector table to a dedicated

         * memory area. The address is configurable and so a table in the kernel

         * image can be used.

         */

#endif

}

关键字:Linux  ARMv7  中断向量表 引用地址:Linux ARMv7中断向量表搬移(2)

上一篇:I2C协议->裸机程序->adapter驱动程序分析
下一篇:linux arm mmu基础

推荐阅读最新更新时间:2024-10-28 10:50

解决Windows下Arm下Linux下Qt4程序的中文乱码问题
############################################################################### #操作系统:Win7垃圾版 #QT: 4.8.1 #操作系统:Winxp垃圾版 #QT: 4.8.1 #开发板:友善之臂Tiny6410 V1.2 #QT: 4.6.1 #QTE-arm: 4.7.0 #Write By Kinglate 20130806 ############################################################################### 也许这个世界上没有人会像我一样遇到一个问题了,
[单片机]
解决Windows下Arm下<font color='red'>Linux</font>下Qt4程序的中文乱码问题
【MINI2440】linux系统下载全流程
一、首先,需要下载BOOT到NOR FLASH 官方资料给出两种硬件下载方式。JTAG串口下载 和 LPT并口下载。 时代发展至今,笔记本已经不支持并口了。导致软件H-JTAG的LPT下载功能不能正常使用。 使用JTAG方式下载boot程序到开发板的NOR FLASH中。 学习视频 https://www.bilibili.com/video/BV17h411o7TK?p=17&spm_id_from=pageDriver 准备好boot文件 开发板是友善之臂的,bootloader使用他们提供的supervivi文件。提供了两个文件,选择128M的进行下载(我是64M的板子,也下载128M的vivi文件)。为了让下载工具识别
[单片机]
【MINI2440】<font color='red'>linux</font>系统下载全流程
基于TQ2440和Linux的触摸屏的驱动研究
嵌入式技术在工业和日常生活中变得越来越普及,触摸屏作为交互终端已经逐渐取代键盘成为嵌入式系统的输入设备。使用TQ2440开发板,通过对嵌入式Linux内核中触摸屏驱动的研究,编写和移植了触摸屏的驱动程序,校准之后触摸屏可以正常使用。 随着信息查询技术的发展,触摸屏因具有坚固耐用、反应速度快、节省空间、易于交流等优点,而得到了广泛应用 。触摸屏作为一种新兴的电脑输入设备,是目前最简单、方便的一种人机交互设备。 1 硬件简介 1.1 TQ2440开发板简介 天嵌公司生产的TQ2440开发板,微处理器采用Samsung S3C2440AL,板载64 MB SDRAM、256 MB Nand Flash、2 MB Nor Flas
[单片机]
基于TQ2440和<font color='red'>Linux</font>的触摸屏的驱动研究
基于嵌入式Linux 的I2C设备驱动程序的分析
  0 引言   由于I2C总线的通用性,Linux作为一款优秀的嵌入式操作系统,也必须要对其要有很好的支持。在Linux内核源码中对I2C总线的驱动是基于总线设备驱动模型的,其驱动程序用到了特殊的几个数据结构,对I2C总线协议进行了更抽象更通用的定义,极大的增加了设备驱动的可移植性。要编写出自己的I2C 设备驱动程序,必须对这种内核I2C总线驱动的架构有深刻的理解。   1 I2C总线的硬件构成   I2C 总线协议只有两条总线线路,一条是串行数据线(SDA),一条是串行时钟线(SCL)。SDA 负责数据的传输,SCL 负责数据传输的时钟同步。I2C 设备通过这两条总线连接到处理器的I2C总线控制器上,不同设备之间通过7
[单片机]
基于嵌入式<font color='red'>Linux</font> 的I2C设备驱动程序的分析
Microchip通过基于SAMA5D2 MPU的系统模块简化工业级Linux® 的设计
设计用于运行Linux® 操作系统的工业级微处理器(MPU)系统是一件非常困难和复杂的事情。即便是该领域资深的开发人员也要花费大量时间来设计电路板布局以确保DDR存储器和以太网物理层(PHY)高速接口的信号完整性,同时还要满足电磁兼容性(EMC)标准的要求。为了让此类设计变得更加简单,Microchip Technology Inc. (美国微芯科技公司)开发了一种新的基于SAMA5D2 MPU的系统模块(SOM)。 这款ATSAMA5D27-SOM1里面包含了最近发布的ATSAMA5D27C-D1G-CU封装级系统(SiP),通过将电源管理、非易失性自举存储器、以太网物理层和高速DDR2存储器集成在一个小型单面电路板(PCB)上
[半导体设计/制造]
[S3C6410-00]嵌入式linux开发环境搭建
这篇文章是对之前的一个小结,涉及到的东西是从事嵌入式linux开发中最基本的环境搭建问题,后续我会把自己总结的东西都放到网上。闲话少说,开始进入主题。 从事嵌入式linux开发,最基本的工具无非就是Host-Windows系统,VisualMachine-VMWare和Board。本文主要是如何将三者有效结合在一起,提高工作效率。 step00 :准备的软件 Host :Windows XP SP3 VM :VMWare8.0 Board :OK6410 Linux :Fedora13 step01 :安装软件 安装好以上软件,是一件很容易的事,在此就略过。 但在安装Fedora13时,记住最好
[单片机]
port linux 2.6.11.7 kernel to s3c2410(SMDK2410)
1 preparation my board is s3c2410 SMDK2410 a download kernel http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.11.7.tar.gz decompress and no patch is needed b install the gcc compiler ftp://ftp.handhelds.org/projects/toolchain/arm-linux-gcc-3.4.1.tar.bz2 2 modify kernel source a add your nand flash partiti
[单片机]
MathWorks代码生成工具支持Eclipse和Embedded Linux
      MathWorks日前宣布,通过GNU编译器 工具 链,其Target Support Package 和Embedded IDE Link 产品现已能支持Eclipse集成开发环境(IDE)和Embedded Linux Linux   Linux是一套免费使用和自由传播的操作系统,它主要用于基于Intel系列CPU的计算机上。这个系统是由全世界各地的成千上万的程序员设计和实现的,其目的是建立不受任何商品化软件的版权制约的、全世界都能自由使用的Unix兼容产品。 。这样,使用MATLAB和Simulink模型自动生成的代码,工程师们可以在Eclipse中实现项目创建的自动化,还可以在Linux上部
[工业控制]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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