新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM Linux啟動過程學習

        ARM Linux啟動過程學習

        作者: 時間:2016-11-09 來源:網絡 收藏
        linux根目錄中的vmlinux.o為arm-linux-ld link得到的一個elf格式的文件,這個文件包含kernel下的head.o+driver+MM+FS+net等其他

        o文件。

        本文引用地址:http://www.104case.com/article/201611/318007.htm

        使用kernel目錄下的vmlinux.lds link腳本生成vmlinux elf格式的可執行文件

        Vmlinux使用arm-linux-objcopy生成bin格式的文件image。僅僅包含指令和數據。

        可以load到sdram的0x30008000地址運行。為什么非要load到這個地址呢?通過跟蹤

        Head.S執行,發現在__lookup_machine_type函數中,如果load地址不是0x30008000,

        Ldmia r3, {r4, r5, r6}會出現錯誤,r4的內容出現錯誤

        為了分析linux啟動過程,生成一個最小的kernel,然后使用AXD+JTAG來進行單步跟蹤

        生成一個tiny kernel使用axd跟蹤500+K的bin文件,load到0x30008000地址進行跟蹤

        首先執行的代碼為compressed head.S中的start.S unzip了一些代碼,重新放入0x30008000,然后再次從0x30008000地址重新執行新的代碼

        問了得到kernel中的函數虛擬地址,需要生成system.map文件。

        下面的命令可以得到system.map

        NM=arm-linux-nm/bin/sh /hdd/linux-2.6.28/scripts/mksysmap vmlinux System.map

        ARM Linux啟動過程:

        在CPU執行kernel中的第一個指令之前,bootloader必須完成一些工作:

        1初始化CPU進入SVC模式關閉IRQ/FIQ disable

        2初始化一個串口kernel會輸出調試信息

        Kernel中的head.S流程:

        確保ARM CPU運行在SVC模式并且IRQ disable

        從協處理器中得到CPU的ID

        Bl指令調用__lookup_processor_type函數查找proc info lds link腳本根據autoconf.h中配置的CPU類型,把proc-arm920.S文件中的信息存放到__proc_info_begin和__proc_info_end之間,根據CPU的ID查找CPU類型是否支持

        Bl調用__lookup_machine_type,根據arch number查找。方式類似proc的查找。使用MACHINE_START來把mach info通過lds腳本存放在.arch.info.init。mach-smdk2440.c中的內容

        Bl調用__vet_atags查找bootloader傳入的tags地址

        Bl調用__create_page_tables建立pagetable

        返回地址設置為__enable_mmu

        執行__arm920_setup



        關鍵詞: ARMLinux啟動過

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 体育| 宣武区| 双鸭山市| 定兴县| 普定县| 西丰县| 宜州市| 黑山县| 嘉祥县| 乌恰县| 康保县| 五台县| 永新县| 阳新县| 泌阳县| 天长市| 信丰县| 元氏县| 永济市| 静宁县| 隆回县| 鄂尔多斯市| 石家庄市| 宁夏| 互助| 含山县| 平凉市| 讷河市| 荥经县| 鄯善县| 海盐县| 云浮市| 曲松县| 西乌珠穆沁旗| 永吉县| 大同市| 丰县| 多伦县| 岢岚县| 石泉县| 普兰县|