新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 位置無關和位置相關

        位置無關和位置相關

        作者: 時間:2016-11-21 來源:網絡 收藏
        1、
        SECTIONS {
        firtst 0x00000000 : { head.o init.o nand.o}
        second 0x30000000 : AT(4096) { main.o }
        }
        對應啟動源碼:
        @將NAND Flash中地址4096開始的1024字節代碼(main.c編譯得到)復制到SDRAM中
        @nand_read_ll函數需要3個參數:
        ldr r0, =0x30000000 @1. 目標地址=0x30000000,這是SDRAM的起始地址
        mov r1, #4096 @2. 源地址 = 4096,連接的時候,main.c中的代碼都存在NAND Flash地址4096開始處
        mov r2, #2048 @3. 復制長度= 2048(bytes),對于本實驗的main.c,這是足夠了
        bl nand_read @調用C函數nand_read
        2、
        SECTIONS {
        . = 0x30000000;
        .text : {
        head.o(.text)
        init.o(.text)
        nand.o
        *(.text)
        }
        .rodata ALIGN(4) : {*(.rodata)}
        .data ALIGN(4) : { *(.data) }
        .bss ALIGN(4) : { *(.bss) *(COMMON) }
        }
        @將NAND Flash中地址4096開始的1024字節代碼(main.c編譯得到)復制到SDRAM中
        @nand_read_ll函數需要3個參數:
        ldr r0, =0x30000000 @1. 目標地址=0x30000000,這是SDRAM的起始地址
        mov r1, #0 @2. 源地址 = 0
        mov r2, #4096 @3. 復制長度= 4096
        bl nand_read @調用C函數nand_read
        總結:S3C2440啟動時硬件會強制的把nand flash中前4K的內容復制到2440片內的RAM中執行,這4K的代碼的任務是初始化nand flash、SDRAM,然后把全部的代碼從nand flash中拷貝到SDRAM中,再跳到SDRAM中執行。
        1、1中head.o init.o nand.o三個文件的鏈接地址是:0x00000000 即片內內存(RAM),當硬件把前4K內容拷貝到2440片內的RAM中時head.o init.o nand.o三文件就在片內執行,實際運行的地址和運行時應該在的地址相同,故這三段代碼中可以使用位置相關碼,即可以使用全局變量,當初始化nand flash、SDRAM完成后只是拷貝了源地址=4096的main.o段;
        2、中head.o init.o nand.o三個文件的鏈接地址是:0x30000000,即片外SDRAM,說明head.o(.text) 、init.o(.text) 、nand.o *(.text)這三段代碼運行時應該在0x30000000地址,但是S3C2440啟動時硬件會強制的把nand flash中前4K的內容復制到2440片內的RAM中執行時它們處于0x00000000 的地址,故只能使用位置無關碼,即不可以使用全局變量,當初始化nand flash、SDRAM完成后程序拷貝了全部的代碼,拷貝過去以后head.o(.text) 、init.o(.text) 、nand.o *(.text)三文件才位于該在的地址:0x30000000。

        注:鏈接地址是程序運行時應該位于的地方,如果程序不在鏈接地址上運行,那么訪問全局變量的時候就會出錯。

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




        關鍵詞: 位置無關位置相

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 望江县| 乌鲁木齐市| 辽中县| 准格尔旗| 富民县| 英山县| 福贡县| 和政县| 金坛市| 凤山县| 平罗县| 孟津县| 平邑县| 浠水县| 九龙县| 五华县| 利川市| 铁力市| 乌鲁木齐县| 库车县| 泸州市| 芜湖县| 麦盖提县| 崇左市| 延吉市| 阿克陶县| 兴山县| 阿荣旗| 芦山县| 临汾市| 平舆县| 台东县| 如东县| 巴东县| 广安市| 铜川市| 时尚| 深州市| 萍乡市| 桐柏县| 稻城县|