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

ARM Linux內(nèi)核啟動(dòng)過程

發(fā)布者:溫馨陽光最新更新時(shí)間:2024-09-25 來源: elecfans關(guān)鍵字:ARM  Linux 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

第14, 15行: 函數(shù)聲明

第16 - 24行: 定義了一些地址,例如第16行存儲(chǔ)的是 mmap_switched 的地址, 第17行存儲(chǔ)的是 data_loc 的地址 ......

第34, 35行: 函數(shù) mmap_switched

第36行: 取 switch_data + 4的地址到r3. 從上文可以看到這個(gè)地址就是第17行的地址.

第37行: 依次取出從第17行到第20行的地址,存儲(chǔ)到r4, r5, r6, r7 中. 并且累加r3的值.當(dāng)執(zhí)行完后, r3指向了第21行的位置.

對(duì)照上文,我們可以得知:
  • r4 - data_loc

  • r5 - data_start

  • r6 - bss_start

  • r7 - end

這幾個(gè)符號(hào)都是在 arch/arm/kernel/vmlinux.lds.S 中定義的變量:

        00102: #ifdef CONFIG_XIP_KERNEL
        00103:         __data_loc = ALIGN(4);                /* location in binary */
        00104:         . = PAGE_OFFSET + TEXT_OFFSET;
        00105: #else
        00106:         . = ALIGN(THREAD_SIZE);
        00107:         __data_loc = .;
        00108: #endif
        00109:
        00110:         .data : AT(__data_loc) {
        00111:                 __data_start = .;        /* address in memory */
        00112:
        00113:                 /*
        00114:                  * first, the init task union, aligned
        00115:                  * to an 8192 byte boundary.
        00116:                  */
        00117:                 *(.init.task)
        
                ......
               
        00158:         .bss : {
        00159:                 __bss_start = .;        /* BSS                                */
        00160:                 *(.bss)
        00161:                 *(COMMON)
        00162:                 _end = .;
        00163:         }

 

對(duì)于這四個(gè)變量,我們簡單的介紹一下:
  • data_loc 是數(shù)據(jù)存放的位置

  • data_start 是數(shù)據(jù)開始的位置

  • bss_start 是bss開始的位置

  • end 是bss結(jié)束的位置, 也是內(nèi)核結(jié)束的位置

其中對(duì)第110行的指令講解一下: 這里定義了.data 段,后面的AT(data_loc) 的意思是這部分的內(nèi)容是在data_loc中存儲(chǔ)的(要注意,儲(chǔ)存的位置和鏈接的位置是可以不相同的). 關(guān)于 AT 詳細(xì)的信息請參考 ld.info

第38行: 比較 data_loc 和 data_start

第39 - 43行: 這幾行是判斷數(shù)據(jù)存儲(chǔ)的位置和數(shù)據(jù)的開始的位置是否相等,如果不相等,則需要搬運(yùn)數(shù)據(jù),從 data_loc 將數(shù)據(jù)搬到 data_start.

其中 bss_start 是bss的開始的位置,也標(biāo)志了 data 結(jié)束的位置,因而用其作為判斷數(shù)據(jù)是否搬運(yùn)完成.

第45 - 48行: 是清除 bss 段的內(nèi)容,將其都置成0. 這里使用 end 來判斷 bss 的結(jié)束位置.

第50行: 因?yàn)樵诘?8行的時(shí)候,r3被更新到指向第21行的位置.因而這里取得r4, r5, r6, sp的值分別是:

  • r4 - processor_id

  • r5 - machine_arch_type

  • r6 - cr_alignment

  • sp - init_thread_union + THREAD_START_SP

processor_id 和 machine_arch_type 這兩個(gè)變量是在 arch/arm/kernel/setup.c 中 第62, 63行中定義的. cr_alignment 是在 arch/arm/kernel/entry-armv.S 中定義的:

        00182:         .globl        cr_alignment
        00183:         .globl        cr_no_alignment
        00184: cr_alignment:
        00185:         .space        4
        00186: cr_no_alignment:
        00187:         .space        4

 

init_thread_union 是 init進(jìn)程的基地址. 在 arch/arm/kernel/init_task.c 中:

        00033: union thread_union init_thread_union
        00034:         __attribute__((__section__('.init.task'))) =
        00035:                 { INIT_THREAD_INFO(init_task) };

對(duì)照 vmlnux.lds.S 中的 的117行,我們可以知道init task是存放在 .data 段的開始8k, 并且是THREAD_SIZE(8k)對(duì)齊的

第51行: 將r9中存放的 processor id (在arch/arm/kernel/head.S 75行) 賦值給變量 processor_id

第52行: 將r1中存放的 machine id (見'啟動(dòng)條件'一節(jié))賦值給變量 machine_arch_type

第53行: 清除r0中的 CR_A 位并將值存到r4中. CR_A 是在 include/asm-arm/system.h 21行定義, 是cp15控制寄存器c1的Bit1(alignment fault enable/disable)

第54行: 這一行是存儲(chǔ)控制寄存器的值.

從上面 arch/arm/kernel/entry-armv.S 的代碼我們可以得知. 這一句是將r0存儲(chǔ)到了 cr_alignment 中,將r4存儲(chǔ)到了 cr_no_alignment 中.

第55行: 最終跳轉(zhuǎn)到start_kernel

FIN


[1] [2] [3] [4] [5] [6]
關(guān)鍵字:ARM  Linux 引用地址:ARM Linux內(nèi)核啟動(dòng)過程

上一篇:玩轉(zhuǎn)S3C6410之一 交叉工具鏈制作(gcc4.5.1-armv6-vfp)
下一篇:s3c6410學(xué)習(xí)筆記-燒寫uboot+構(gòu)建文件系統(tǒng)

0

推薦閱讀最新更新時(shí)間:2025-03-25 06:40

linux 2.6.32 在arm9(s3c2440)平臺(tái)的移植 - 標(biāo)題要長(2)
(1) s3c2440平臺(tái)關(guān)于nand flash部分的代碼, 在你弄清楚移植代碼的每一個(gè)步驟是為什么之前,不要去做所謂的移植,那是毫無意義的 *****/arch/arm/plat-s3c24xx/common-smdk.c***** static struct mtd_partition smdk_default_nand_part = { = { .name = supervivi , .size = 0x00040000, .offset = 0, }, = { .name =
[單片機(jī)]
LinuxARM(IMX6U)裸機(jī)匯編LED驅(qū)動(dòng)實(shí)驗(yàn)--燒寫bin文件到SD卡運(yùn)行
代碼燒寫 I.MX6U 雖然內(nèi)部有 96K 的 ROM,但是這 96K 的 ROM 是 NXP自己用的,不向用戶開放。所以相當(dāng)于說 I.MX6U 是沒有內(nèi)部 flash 的,但是我們的代碼得有地方存放啊,為此,I.MX6U 支持從外置的 NOR Flash、NAND Flash、SD/EMMC、SPI NOR Flash和 QSPI Flash 這些存儲(chǔ)介質(zhì)中啟動(dòng),所以我們可以將代碼燒寫到這些存儲(chǔ)介質(zhì)中中。在這些存儲(chǔ)介質(zhì)中,除了 SD 卡以外,其他的一般都是焊接到了板子上的,我們沒法直接燒寫。但是 SD卡是活動(dòng)的,是可以從板子上插拔的,我們可以將 SD 卡插到電腦上,在電腦上使用軟件將.bin文件燒寫到 SD 卡中,然后再插到板子
[單片機(jī)]
<font color='red'>Linux</font>之<font color='red'>ARM</font>(IMX6U)裸機(jī)匯編LED驅(qū)動(dòng)實(shí)驗(yàn)--燒寫bin文件到SD卡運(yùn)行
基于ARMLinux的路徑記憶循跡小車
引言 智能車是近年來發(fā)展起來的一門新興的綜合技術(shù),在軍事領(lǐng)域得到了廣泛應(yīng)用,而且在生產(chǎn)和生活中的應(yīng)用也日趨普遍 。 目前智能小車的自主移動(dòng)方式有兩種:循跡和避障。一般的循跡功能可以通過算法使其能精確地在黑線上行駛,但是由于一些室內(nèi)環(huán)境的因素,要實(shí)施黑線的布置并不符合實(shí)際要求 。一般的避障功能僅僅是通過探測前方障礙物而進(jìn)行躲避,通過算法可以完成從出發(fā)點(diǎn)到定點(diǎn)的行駛 ,但是算法運(yùn)算量大且放在不同的環(huán)境,就需要更改程序,這對(duì)實(shí)際應(yīng)用帶來很大的不便。 基于這種背景,設(shè)計(jì)了一種利用超聲波測距避障功能以及Linux文件系統(tǒng)的路徑記憶循跡智能小車,通過人為地設(shè)置障礙物來規(guī)劃小車的行走路線,并將路線記錄入庫。小車只需讀取庫中的數(shù)據(jù)即可
[單片機(jī)]
基于<font color='red'>ARM</font>和<font color='red'>Linux</font>的路徑記憶循跡小車
ARM Linux系統(tǒng)的時(shí)鐘機(jī)制
1. Linux下有兩類時(shí)鐘: 1.1 實(shí)時(shí)鐘RTC 它由板上電池驅(qū)動(dòng)的“Real Time Clock”也叫做RTC或者叫CMOS時(shí)鐘,硬件時(shí)鐘。當(dāng)操作系統(tǒng)關(guān)機(jī)的時(shí)候,用這個(gè)來記錄時(shí)間,但是對(duì)于運(yùn)行的系統(tǒng)是不用這個(gè)時(shí)間的。 1.2 系統(tǒng)時(shí)鐘 “System clock”也叫內(nèi)核時(shí)鐘或者軟件時(shí)鐘,是由軟件根據(jù)時(shí)間中斷來進(jìn)行計(jì)數(shù)的,內(nèi)核時(shí)鐘在系統(tǒng)關(guān)機(jī)的情況下是不存在的,所以,當(dāng)操作系統(tǒng)啟動(dòng)的時(shí)候,內(nèi)核時(shí)鐘是要讀取RTC時(shí)間來進(jìn)行時(shí)間同步. 2. 標(biāo)準(zhǔn)計(jì)時(shí)器 2.1 時(shí)鐘滴答計(jì)時(shí)(jiffies)的幾個(gè)基本參數(shù) 2.1.1 時(shí)鐘周期(clock cycle)的頻率-晶振頻率 計(jì)時(shí)器Timer晶體振蕩器在1秒
[單片機(jī)]
ARM-Linux模塊編譯與加載
在linux下加載一個(gè)簡單的模塊方法以及步驟: 運(yùn)行環(huán)境:linux-2.6.12 編譯環(huán)境:arm-linux-gcc(3.4.1) 運(yùn)行平臺(tái):S3C2440 1.編寫模塊程序Module.c #include linux/init.h #include linux/kernel.h #include linux/module.h static int hello_init(void) { printk( Hello, SmallBox! This is the first test module!\n ); return 0; } static void hello_exit(void) {
[單片機(jī)]
arm linux 啟動(dòng)之一:匯編啟動(dòng)到start_kernel
描述arm linux啟動(dòng)的概要過程,以S5PV210(Cortex A8)為例,本文描述第一個(gè)階段。 一、arm linux的引導(dǎo) uboot在引導(dǎo)arm linux(uImage鏡像)到SDRAM之后,通過bootm命令對(duì)uImage鏡像的64個(gè)字節(jié)頭進(jìn)行解釋,獲取linux的entry入口地址,并賦值給theKernel函數(shù)指針(一般該值是0x38),并將uboot的環(huán)境變量參數(shù)(如平臺(tái)的內(nèi)存塊區(qū)域信息、linux啟動(dòng)命令信息bootargs等)按linux要求的tags形式放置在0x30100起始的地方。接著關(guān)掉MMU,清除icache,dcache,最后通過該函數(shù)將控制權(quán)交給arm linux: t
[單片機(jī)]
ARM9+Linux下電子紙驅(qū)動(dòng)的設(shè)計(jì)與實(shí)現(xiàn)
為實(shí)現(xiàn)在ARM9+Linux系統(tǒng)下對(duì)電子紙的快速、有效控制,設(shè)計(jì)了一種基于電子紙顯示控制芯片(GD6210E)的電子紙驅(qū)動(dòng)。根據(jù)S3C2440 ARM9處理器和GD6210E的接口特點(diǎn),利用S3C2440的GPIO口來擴(kuò)展GD6210E,最后利用Linux為顯示設(shè)備提供的幀緩沖專用接口編寫驅(qū)動(dòng)程序,完成電子紙的驅(qū)動(dòng)。該驅(qū)動(dòng)有利于電子紙的普及應(yīng)用。 電子紙可以實(shí)現(xiàn)顯示內(nèi)容的重寫,具有對(duì)比度高、重量輕、可以適當(dāng)彎曲,且在斷電的情況下,能保持原有的顯示內(nèi)容等優(yōu)點(diǎn)。Linux是一種具有開放性、多用戶、多任務(wù)、設(shè)備獨(dú)立性、系統(tǒng)可靠安全、良好移植性等優(yōu)點(diǎn)的操作系統(tǒng) ,其內(nèi)核可根據(jù)具體的運(yùn)行平臺(tái)進(jìn)行適當(dāng)?shù)牟眉簦@對(duì)于資源有限的嵌入式系統(tǒng)至關(guān)重
[單片機(jī)]
<font color='red'>ARM</font>9+<font color='red'>Linux</font>下電子紙驅(qū)動(dòng)的設(shè)計(jì)與實(shí)現(xiàn)
基于嵌入式ARM-Linux無線ZigBee協(xié)調(diào)器驅(qū)動(dòng)設(shè)計(jì)
農(nóng)田中大范圍的環(huán)境信息監(jiān)測已成為網(wǎng)絡(luò)應(yīng)用范圍重點(diǎn)之一。針對(duì)農(nóng)田布線不便的特點(diǎn),ZigBee無線節(jié)點(diǎn)網(wǎng)絡(luò)成為農(nóng)田信息采集系統(tǒng)的首選,可對(duì)其所分布區(qū)域內(nèi)的各種環(huán)境和檢測對(duì)象的信息進(jìn)行實(shí)時(shí)的監(jiān)控 。然而,控制下層整個(gè)網(wǎng)絡(luò)狀態(tài)的核心是上位機(jī)ARM處理器,而且上位機(jī)與下位機(jī)通信大多以串口模式來實(shí)現(xiàn) 。但串口通信模式存在串口傳輸速率低(波特率雙方一致)、傳送距離短 、數(shù)據(jù)冗余差(數(shù)據(jù)校驗(yàn))以及設(shè)計(jì)串口協(xié)議繁瑣(幀格式)等不足。因此本文研究了ZigBee在ARM9內(nèi)核中的協(xié)調(diào)器字符驅(qū)動(dòng),利用I/O傳輸數(shù)據(jù),控制具有協(xié)調(diào)器驅(qū)動(dòng)的設(shè)備在農(nóng)田任何位置即可組網(wǎng),以減少協(xié)調(diào)器的布局,實(shí)現(xiàn)方便快捷的動(dòng)態(tài)數(shù)據(jù)監(jiān)測。 1 田間監(jiān)測系統(tǒng)的要求  因監(jiān)測節(jié)點(diǎn)需要
[工業(yè)控制]
基于嵌入式<font color='red'>ARM</font>-<font color='red'>Linux</font>無線ZigBee協(xié)調(diào)器驅(qū)動(dòng)設(shè)計(jì)
添点儿料...
无论热点新闻、行业分析、技术干货……
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 娄底市| 福鼎市| 临沭县| 江口县| 金沙县| 大埔县| 岳西县| 方山县| 黑龙江省| 泽普县| 韩城市| 瑞安市| 周至县| 松江区| 定边县| 巴彦县| 中方县| 庄浪县| 新晃| 辉县市| 吴旗县| 方城县| 商南县| 安图县| 舒城县| 南部县| 新竹市| 清丰县| 渝中区| 锡林浩特市| 汶上县| 石首市| 衡阳市| 临桂县| 米脂县| 华坪县| 囊谦县| 祁阳县| 青神县| 郴州市| 漳州市|