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

歷史上的今天

今天是:2025年02月17日(星期一)

正在發生

2020年02月17日 | ARM linux內核啟動時幾個關鍵地址

發布者:bonbono 來源: eefocus關鍵字:ARM  linux  內核啟動  關鍵地址 手機看文章 掃描二維碼
隨時隨地手機看文章

1.內核啟動地址
1.1.名詞解釋
ZTEXTADDR

解壓代碼運行的開始地址。沒有物理地址和虛擬地址之分,因為此時MMU處于關閉狀態。這個地址不一定時RAM的地址,可以是支持讀寫尋址的flash等存儲中介。


Start address of decompressor. here's no point in talking about virtual or physical addresses here, since the MMU will be off at the time when you call the decompressor code. You normally call   the kernel at this address to start it booting. This doesn't have to be located in RAM, it can be in flash or other read-only or      read-write addressable medium.

      

ZRELADDR

       內核啟動在RAM中的地址。壓縮的內核映像被解壓到這個地址,然后執行。

This is the address where the decompressed kernel will be written, and eventually executed. The following constraint must be valid:


              __virt_to_phys(TEXTADDR) == ZRELADDR

       The initial part of the kernel is carefully coded to be position independent.


TEXTADDR

       內核啟動的虛擬地址,與ZRELADDR相對應。一般內核啟動的虛擬地址為RAM的第一個bank地址加上0x8000。

       TEXTADDR = PAGE_OFFSET + TEXTOFFST


       Virtual start address of kernel, normally PAGE_OFFSET + 0x8000.This is where the kernel image ends up. With the latest kernels, it must be located at 32768 bytes into a 128MB region. Previous kernels placed a restriction of 256MB here.


TEXTOFFSET

       內核偏移地址。在arch/arm/makefile中設定。


PHYS_OFFSET

       RAM第一個bank的物理起始地址。

Physical start address of the first bank of RAM.


PAGE_OFFSET

RAM第一個bank的虛擬起始地址。

       Virtual start address of the first bank of RAM. During the kernel

       boot phase, virtual address PAGE_OFFSET will be mapped to physical

       address PHYS_OFFSET, along with any other mappings you supply.

       This should be the same value as TASK_SIZE.



1.2.內核啟動地址確定
內核啟動引導地址由bootp.lds決定。 Bootp.lds : arch/arm/bootp

OUTPUT_ARCH(arm)

ENTRY(_start)

SECTIONS

{

. = 0;

.text : {

   _stext = .;

   *(.start)

   *(.text)

   initrd_size = initrd_end - initrd_start;

   _etext = .;

}

}


由上 .= 0可以確定解壓代碼運行的開始地址在0x0的位置。ZTEXTADDR的值決定了這個值得選取。



Makefile : arch/arm/boot/compressed


如果設定內核從ROM中啟動的話,可以在make menuconfig 的配置界面中設置解壓代碼的起始地址,否則解壓代碼的起始地址為0x0。實際上,默認從ROM啟動時,解壓代碼的起始地址也是0x0。



feq ($(CONFIG_ZBOOT_ROM),y)

ZTEXTADDR := $(CONFIG_ZBOOT_ROM_TEXT)

ZBSSADDR    := $(CONFIG_ZBOOT_ROM_BSS)

else

ZTEXTADDR :=0                                                       ZBSSADDR := ALIGN(4)

endif


SEDFLAGS    = s/TEXT_START/$(ZTEXTADDR)/;s/BSS_START/$(ZBSSADDR)/                                                                                                                                             

……

$(obj)/vmlinux.lds: $(obj)/vmlinux.lds.in arch/arm/mach-s3c2410/Makefile .config

       @sed "$(SEDFLAGS)" < $< > $@


@sed "$(SEDFLAGS)" < $< > $@ 規則將TEXT_START設定為ZTEXTADDR。TEXT_START在arch/arm/boot/compressed/vmlinux.lds.in 中被用來設定解壓代碼的起始地址。

OUTPUT_ARCH(arm)

ENTRY(_start)

SECTIONS

{

. = TEXT_START;  

_text = .;


.text : {

    _start = .;

    *(.start)

    *(.text)

*(.text.*)

……

}

}



內核的編譯依靠vmlinux.lds,vmlinux.lds由vmlinux.lds.s 生成。從下面代碼可以看出內核啟動的虛擬地址被設置為PAGE_OFFSET + TEXT_OFFSET,而內核啟動的物理地址ZRELADDR在arch/arm/boot/Makefile中設定。



OUTPUT_ARCH(arm)

ENTRY(stext)

SECTIONS

{

#ifdef CONFIG_XIP_KERNEL

       . = XIP_VIRT_ADDR(CONFIG_XIP_PHYS_ADDR);

#else

       . = PAGE_OFFSET + TEXT_OFFSET;   

#endif

       .init : {                  /* Init code and data             */

              _stext = .;

                     _sinittext = .;

                     *(.init.text)

                     _einittext = .;

……

       }

}




# arch/arm/boot/Makefile

# Note: the following conditions must always be true:

#   ZRELADDR == virt_to_phys(PAGE_OFFSET + TEXT_OFFSET)

#   PARAMS_PHYS must be within 4MB of ZRELADDR

#   INITRD_PHYS must be in RAM

ZRELADDR    := $(zreladdr-y)                                      

#---> zrealaddr-y is specified with 0x30008000 in arch/arm/boot/makefile.boot

PARAMS_PHYS := $(params_phys-y)

INITRD_PHYS := $(initrd_phys-y)


export ZRELADDR INITRD_PHYS PARAMS_PHYS


通過下面的命令編譯內核映像,由參數-a, -e設置其入口地址為ZRELADDR,此值在上面ZRELADDR    := $(zreladdr-y)指定。


quiet_cmd_uimage= UIMAGE $@                                                                     

      cmd_uimage = $(CONFIG_SHELL) $(MKIMAGE) -A arm -O linux -T kernel

                 -C none -a $(ZRELADDR) -e $(ZRELADDR)

                 -n 'Linux-$(KERNELRELEASE)' -d $< $@

1.3.小結
從上面分析可知道,linux內核被bootloader拷貝到RAM后,解壓代碼從ZTEXTADDR開始運行(這段代碼是與位置無關的PIC)。內核被解壓縮到ZREALADDR處,也就是內核啟動的物理地址處。相應地,內核啟動的虛擬地址被設定為TEXTADDR,滿足如下條件:

TEXTADDR = PAGE_OFFSET + TEXT_OFFSET

內核啟動的物理地址和虛擬地址滿足入下條件:

ZRELADDR == virt_to_phys(PAGE_OFFSET + TEXT_OFFSET)= virt_to_phys(TEXTADDR)


假定開發板為smdk2410,則有:

內核啟動的虛擬地址

TEXTADDR     = 0xC0008000

內核啟動的物理地址  

ZRELADDR     = 0x30008000

如果直接從flash中啟動還需要設置ZTEXTADDR地址。


2.內核啟動過程分析
內核啟動過程經過大體可以分為兩個階段:內核映像的自引導;linux內核子模塊的初始化。

start

Decompress_kernel()

Call_kernel

Stext:

Prepare_namespace

Do_basic_setup

init

Rest_init

Setup_arch ……

Start_kernel

_enable_mmu

Execve(“/sbin/init”))

內核啟動流程圖


2.1.內核映像的自引導
這階段的主要工作是實現壓縮內核的解壓和進入內核代碼的入口。

Bootloader完成系統引導后,內核映像被調入內存指定的物理地址ZTEXTADDR。典型的內核映像由自引導程序和壓縮的VMlinux組成。因此在啟動內核之前需要先把內核解壓縮。內核映像的入口的第一條代碼就是自引導程序。它在arch/arm/boot/compressed/head.S文件中。


Head.S文件主要功能是實現壓縮內核的解壓和跳轉到內核vmlinux內核的入口。Decompress_kernel(): arch/arm/boot/compressed/misc.c 和call_kernel這兩個函數實現了上述功能。在調用decompress_kernel()解壓內核之前,需要確保解壓后的內核代碼不會覆蓋掉原來的內核映像。以及設定內核代碼的入口地址ZREALADDR。

              .text

              adr   r0, LC0

              ldmia       r0, {r1, r2, r3, r4, r5, r6, ip, sp}

              .type       LC0, #object


LC0:              .word      LC0               @ r1

              .word      __bss_start            @ r2

              .word      _end                     @ r3

              .word      zreladdr          @ r4

              .word      _start                    @ r5

              .word      _got_start              @ r6

              .word      _got_end        @ ip

[1] [2]
關鍵字:ARM  linux  內核啟動  關鍵地址 引用地址:ARM linux內核啟動時幾個關鍵地址

上一篇:ARM指令集----雜項指令
下一篇:libxml2 ARM 交叉編譯

推薦閱讀

全球領先的邊緣計算解決方案提供商 -- 凌華科技宣布加入工業機器人操作系統聯盟(ROS-Industrial Consortium),并且成為該聯盟亞太地區首位成員。機器人操作系統(ROS)是一項全球性的合作計劃,旨在簡化機器人平臺開發的復雜性。工業機器人操作系統(Robot Operating System)支持開源,可將機器人操作系統軟件的先進功能擴展到生產制造端。凌華...
前言:近幾年,隨著“智能家居”概念的逐漸普及,在十幾年前看似高大上的智能設備,逐漸走入尋常百姓家中。而在這塊剛剛萌芽即群雄逐鹿的市場中,小米占得先機,且做得繪聲繪色。今天樓主要展示的這兩款產品(米家小白 攝像頭+萬能遙控器),正是小米生態鏈中不可或缺的一部分。產品開箱:醒目的極果 Logo,真的是討喜又好看本次測評的內容是一組套裝產...
格力電器工會近日透過官微發布了這份通報。 通報稱,公司疫情防控工作領導小組接到運輸公司的反饋,該單位大巴車司機馮某為新冠肺炎確診病例的密切接觸者,接到該反饋后,公司立即安排該司機及所在班組同事停工隔離,并同步對該司機所駕駛線路接送員工情況進行排查和落實隔離措施,截止目前排查和隔離工作仍在緊張開展中。格力電器疫情防控領導小組發布一...
集微網消息,針對Nvidia-Arm收購案引發了大規模的反對,包括Alphabet旗下的谷歌,微軟和高通等科技企業正在向美國反壟斷監管機構投訴Nvidia收購Arm,他們一致認為該交易將損害對其業務至關重要的行業領域的競爭,并要求進行干預。據彭博社報道,了解這一過程的人士表示,至少有一家公司希望扼殺這筆交易。科技企業認為,這項收購將使Nvidia控制一個半導體...

史海拾趣

小廣播
設計資源 培訓 開發板 精華推薦

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

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

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 察哈| 边坝县| 通化县| 历史| 蕉岭县| 宁安市| 噶尔县| 上犹县| 同德县| 金门县| 高台县| 安泽县| 乌兰浩特市| 唐河县| 彭山县| 嘉黎县| 丰原市| 台东市| 兴仁县| 望谟县| 鹿邑县| 紫金县| 桑植县| 竹山县| 潍坊市| 辽宁省| 平遥县| 壶关县| 保德县| 富源县| 千阳县| 丁青县| 四会市| 孟津县| 盱眙县| 阿巴嘎旗| 吉林市| 高邑县| 昌吉市| 广安市| 辽宁省|