娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2024年11月24日(星期日)

正在發生

2021年11月24日 | Linux ARMv7中斷向量表搬移(2)

發布者:神光騎士 來源: 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基礎

推薦閱讀

2018機器人創新生態年度峰會已于11月16日順利結束。本次峰會全天共組織六大主題演講,上午是“初心與展望”、“趨勢與探索”、“資本與機會”,下午為“生態與價值”、“合作與共融”、“創新與落地”。頭部企業、政府領導、知名學者以及優秀投資人分別從技術創新、產品應用、服務連接、資本對話等角度切入了機器人生態的細分領域,不僅為生態未來的發展貢...
(文章來源:中科羅伯特機器人學院) 優傲機器人公司在2005年創立于丹麥歐登塞,自從2008年發布首款協作式機器人(cobot)以來,方便易用的UR協作機器人的銷量呈現大幅增長,協作機器人將會是工業機器人發展中的翹楚。 汽車行業的自動化水平在制造業中一直是排在前列的。大多數汽車制造廠商在焊接、涂裝、沖壓等環節都會采用自動化技術。但隨著生產模式...
近年來,隨著對駕駛安全要求的不斷提升,基于5G、物聯網、人工智能和機器學習的自動駕駛技術已成為未來汽車應用趨勢。何時實現 Level 5?從自動駕駛升級路徑情況來看,現階段處于L3級導入期。L3級為有條件自動駕駛,可以一定程度上解放駕駛員雙手,根據全球各大車企規劃來看,大部分車企在2019-2020年量產上市L3級自動駕駛車型,少部分企業則選擇跳過L3...
當SM2..0 為000 時, SLEEP 指令將使MCU 進入空閑模式。在此模式下,CPU 停止運 行,而SPI、USART、模擬比較器、ADC、兩線接口、定時器/ 計數器、看門狗和中斷 系統繼續工作。這個睡眠模式只停止了clkCPU 和clkFLASH,其他時鐘則繼續工作。內外部中斷都可以喚醒MCU。如果不需要從模擬比較器中斷喚醒MCU,為了減少功耗, 可以切斷比較器的電源。...

史海拾趣

問答坊 | AI 解惑

ARM7一VxWorKs的網絡化實時彩色分析虛擬儀器

     特種光源、彩色顯示等行業的基礎是彩色的還原與傳遞,在光學計量領域屬于光源的光度和色度計量范疇,色坐標和亮度因數是主要的參數之一。光度、色度測試系統的性能,在高清晰度數字電視的白場基準測試、高清晰度數字攝像 ...…

查看全部問答∨

嵌入式amr 清華大學培訓教程

嵌入式amr 清華大學培訓教程…

查看全部問答∨

討論專題——多層電路板的設計與制作

本文來源于:http://www.hellodsp.com/bbs/viewthread.php?tid=574&extra=page%3D1 先從最簡單的說起,感覺多層板也沒有多么神秘   1 原理圖設計 現在的開發板、評估板資料很多,原理圖的設計不是很難的事情(這是對于DSP系統板或者 ...…

查看全部問答∨

電腦公司診斷卡代碼

電腦公司診斷卡代碼…

查看全部問答∨

關于KEIL

如何在KEIL下使用其集成的邏輯分析儀?能給個詳細的說明嗎?  …

查看全部問答∨

請教一個verilog 程序!

前仿沒有問題,用Quater 2編譯也成功了,但后仿時出現網表文件錯誤…… 請高人指教…… 謝謝…… `timescale 1ns/100ps `define clk_cycle 50 module sim_all(clk,rst,rst1,wr_en,rd_en);        input clk,rst,rst1,wr ...…

查看全部問答∨

如何將IE默認的播放器換成自己所寫的播放器

由于IE默認的WMP播放視頻,音頻時卡,所以打算加入自己寫的視頻播放插件?…

查看全部問答∨

信任,但要核實

2010年9月23日 - 美國前總統羅納德•里根在表達對國際軍控問題的觀點時喜歡用上面這句話。這句話也恰好適用于上周由國際能源機構(IEA)下屬的高效終端使用電氣設備(4E)小組所主辦的題為“通過合規性節省更多能源”(Saving More Energy Through ...…

查看全部問答∨

問下:STM的16個大電流驅動

問下:STM的16個大電流高電平驅動光耦,他應該串一個電阻還是該用個上拉電阻? 再一個:用定時器時與定時器對應的口能不能做通用i/o口?…

查看全部問答∨

求個助..為什么我用自帶溫度傳感器獲得溫度總是35.7

也許..這個程序就不大對..是自己按照 <不完全手冊>改的 總感覺程序就不大對..這幾天也沒靜下心看AD.感覺有了庫文件..照著來就是了.幾個通道還是有點亂.高人沒沒事的時候幫我看看吧.謝謝大家啦…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 霞浦县| 中方县| 金秀| 沙田区| 博野县| 乌苏市| 湾仔区| 铁岭市| 周至县| 崇义县| 瑞金市| 乾安县| 承德县| 楚雄市| 安溪县| 崇礼县| 徐水县| 汨罗市| 观塘区| 马公市| 砀山县| 三台县| 克拉玛依市| 洱源县| 无极县| 武宁县| 陆川县| 甘谷县| 遵化市| 寻甸| 建昌县| 垫江县| 屯门区| 德钦县| 宽甸| 朝阳市| 金塔县| 长寿区| 米易县| 海晏县| 宁海县|