<var id="fnfpo"><source id="fnfpo"></source></var>
<rp id="fnfpo"></rp>

<em id="fnfpo"><object id="fnfpo"><input id="fnfpo"></input></object></em>
<em id="fnfpo"><acronym id="fnfpo"></acronym></em>
  • <th id="fnfpo"><track id="fnfpo"></track></th>
  • <progress id="fnfpo"><track id="fnfpo"></track></progress>
  • <tbody id="fnfpo"><pre id="fnfpo"></pre></tbody>

  • x
    x

    linux內核啟動解析(三)

    發布時間:2012-4-1 09:57    發布者:李寬
    關鍵詞: linux
    freshtree

            1.2 __lookup_machine_type()
            機器類型的查找代碼如下:

            __lookup_machine_type:
                   adr   r3, 3b
                   ldmia       r3, {r4, r5, r6}
                   sub  r3, r3, r4               @ get offset between virt&phys
                   add  r5, r5, r3               @ convert virt addresses to
                   add  r6, r6, r3               @ physical address space
            1:     ldr   r3, [r5, #MACHINFO_TYPE]       @ get machine type
                   teq   r3, r1                           @ matches loader number?
                   beq  2f                         @ found
                   add  r5, r5, #SIZEOF_MACHINE_DESC     @ next machine_desc
                   cmp r5, r6
                   blo   1b
                   mov r5, #0                           @ unknown machine
            2:     mov pc, lr
            ENDPROC(__lookup_machine_type)

            我們可以看到,這和處理器類型查找函數很類似,在這里只進行簡單的解說。

                   .long       __proc_info_begin
                   .long       __proc_info_end
            3:     .long       .
                   .long       __arch_info_begin
                   .long       __arch_info_end



            __arch_info_begin和__arch_info_end在arch/arm/kernel/vlinux.lds.S中定義:
                          __arch_info_begin = .;
                                 *(.arch.info.init)
                          __arch_info_end = .;
            .arch.info.init段我們可以找到在arch/arm/include/asm/mach/arch.h中有引用:
            #define MACHINE_START(_type,_name)                  \
            static const struct machine_desc __mach_desc_##_type    \
             __used                                            \
             __attribute__((__section__(".arch.info.init"))) = {     \
                   .nr          = MACH_TYPE_##_type,            \
                   .name             = _name,

            #define MACHINE_END                            \
            };

            我們可以在arch/arm/mach-*.c文件中找到一系列關于MACHINE_START所定義的結構。

            1.3 __vet_atags()
            函數代碼如下:

            __vet_atags:
                   tst    r2, #0x3                @ aligned?
                   bne  1f

                   ldr   r5, [r2, #0]                   @ is first tag ATAG_CORE?
                   subs r5, r5, #ATAG_CORE_SIZE
                   bne  1f
                   ldr   r5, [r2, #4]
                   ldr   r6, =ATAG_CORE
                   cmp r5, r6
                   bne  1f

                   mov pc, lr                            @ atag pointer is ok

            1:     mov r2, #0
                   mov pc, lr
            ENDPROC(__vet_atags)

            atag是bootloader傳遞給linux內核的參數列表。這個參數列表是以tag的列表形式來表示的。這個列表起始位置的tag是ATAG_CORE,用來表示這是一個有效的tag列表。如果起始tag不是ATAG_CORE,就認為bootloader沒有傳遞tag參數給內核。以下是tag值的定義和描述,以及tag結構的定義。

                                                                           
                                            Tag name
                                                                                   
                                            Value
                                                                                   
                                            Size
                                                                                   
                                            Description
                                                                                                                                   
                                            ATAG_NONE
                                                                                   
                                            0x00000000
                                                                                   
                                            2
                                                                                   
                                            Empty tag used to end list
                                                                                                                   
                                            ATAG_CORE
                                                                                   
                                            0x54410001
                                                                                   
                                            5 (2 if empty)
                                                                                   
                                            First tag used to start list
                                                                                                                   
                                            ATAG_MEM
                                                                                   
                                            0x54410002
                                                                                   
                                            4
                                                                                   
                                            Describes a physical area of memory
                                                                                                                   
                                            ATAG_VIDEOTEXT
                                                                                   
                                            0x54410003
                                                                                   
                                            5
                                                                                   
                                            Describes a VGA text display
                                                                                                                   
                                            ATAG_RAMDISK
                                                                                   
                                            0x54410004
                                                                                   
                                            5
                                                                                   
                                            Describes how the ramdisk will be used in kernel
                                                                                                                   
                                            ATAG_INITRD2
                                                                                   
                                            0x54420005
                                                                                   
                                            4
                                                                                   
                                            Describes where the compressed ramdisk image is placed in memory
                                                                                                                   
                                            ATAG_SERIAL
                                                                                   
                                            0x54410006
                                                                                   
                                            4
                                                                                   
                                            64 bit board serial number
                                                                                                                   
                                            ATAG_REVISION
                                                                                   
                                            0x54410007
                                                                                   
                                            3
                                                                                   
                                            32 bit board revision number
                                                                                                                   
                                            ATAG_VIDEOLFB
                                                                                   
                                            0x54410008
                                                                                   
                                            8
                                                                                   
                                            Initial values for vesafb-type framebuffers
                                                                                                                   
                                            ATAG_CMDLINE
                                                                                   
                                            0x54410009
                                                                                   
                                            2 + ((length_of_cmdline + 3) / 4)
                                                                                   
                                            Command line to pass to kernel
                                           
            struct tag_header {
                   __u32 size;
                   __u32 tag;
            };

            struct tag {
                   struct tag_header hdr;
                   union {
                          struct tag_core              core;
                          struct tag_mem32  mem;
                          struct tag_videotext       videotext;
                          struct tag_ramdisk  ramdisk;
                          struct tag_initrd      initrd;
                          struct tag_serialnr   serialnr;
                          struct tag_revision  revision;
                          struct tag_videolfb  videolfb;
                          struct tag_cmdline  cmdline;
                          struct tag_acorn     acorn;
                          struct tag_memclk  memclk;
                   } u;
            };
                   __vet_atags()函數實現的就是判斷r2是否是有效的tag列表指針,如果不是,就將零指針賦值給r2。
    本文地址:http://www.portaltwn.com/thread-88592-1-1.html     【打印本頁】

    本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
    您需要登錄后才可以發表評論 登錄 | 立即注冊

    廠商推薦

    • Microchip視頻專區
    • EtherCAT®和Microchip LAN925x從站控制器介紹培訓教程
    • MPLAB®模擬設計器——在線電源解決方案,加速設計
    • 讓您的模擬設計靈感,化為觸手可及的現實
    • 深度體驗Microchip自動輔助駕駛應用方案——2025巡展開啟報名!
    • 貿澤電子(Mouser)專區

    相關視頻

    關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
    電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
    快速回復 返回頂部 返回列表
    精品一区二区三区自拍图片区_国产成人亚洲精品_亚洲Va欧美va国产综合888_久久亚洲国产精品五月天婷