在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>嵌入式開發(fā)>Linux內(nèi)核移植相關(guān)代碼解析

Linux內(nèi)核移植相關(guān)代碼解析

2017-11-07 | rar | 0.1 MB | 次下載 | 1積分

資料介紹

本文通過整理之前研發(fā)的一個項目(ARM7TDMI +uCLinux),分析內(nèi)核啟動過程及需要修改的文件,以供內(nèi)核移植者參考。整理過程中也同時參考了眾多網(wǎng)友的帖子,在此謝過。由于整理過程匆忙,難免錯誤及講解的不夠清楚之處,請各位網(wǎng)友指正,這里提前謝過。本文分以下部分進行介紹:
  1. Bootloader及內(nèi)核解壓
  2. 內(nèi)核啟動方式介紹
  3. 內(nèi)核啟動地址的確定
  4. arch/armnommu/kernel/head-armv.S分析
  5. start_kernel()函數(shù)分析
  1. Bootloader及內(nèi)核解壓
  Bootloader將內(nèi)核加載到內(nèi)存中,設(shè)定一些寄存器,然后將控制權(quán)交由內(nèi)核,該過程中,關(guān)閉MMU功能。通常,內(nèi)核都是以壓縮的方式存放,如zImage,這里有兩種解壓方法:
  使用內(nèi)核自解壓程序。
  arch/arm/boot/compressed/head.S或arch/arm/boot/compressed/head-xxxxx.S
  arch/arm/boot/compressed/misc.c
  在Bootloader中增加解壓功能。
  使用該方法時內(nèi)核不需要帶有自解壓功能,而使用Bootloader中的解壓程序代替內(nèi)核自解壓程序。其工作過程與內(nèi)核自解壓過程相似:Bootloader把壓縮方式的內(nèi)核解壓到內(nèi)存中,然后跳轉(zhuǎn)到內(nèi)核入口處開始執(zhí)行。
  2. 幾種內(nèi)核啟動方式介紹
  XIP (EXECUTE IN PLACE) 是指直接從存放代碼的位置上啟動運行。
  2.1 非壓縮,非XIP
  非XIP方式是指在運行之前需對代碼進行重定位。該類型的內(nèi)核以非壓縮方式存放在Flash中,啟動時由Bootloader加載到內(nèi)存后運行。
  2.2 非壓縮,XIP
  該類型的內(nèi)核以非壓縮格式存放在ROM/Flash中,不需要加載到內(nèi)存就能運行,Bootloader直接跳轉(zhuǎn)到其存放地址執(zhí)行。Data段復(fù)制和BSS段清零的工作由內(nèi)核自己完成。這種啟動方式常用于內(nèi)存空間有限的系統(tǒng)中,另外,程序在ROM/Flash中運行的速度相對較慢。
  2.3 RAM自解壓
  壓縮格式的內(nèi)核由開頭一段自解壓代碼和壓縮內(nèi)核數(shù)據(jù)組成,由于以壓縮格式存放,內(nèi)核只能以非XIP方式運行。RAM自解壓過程如下:壓縮內(nèi)核存放于ROM/Flash中,Bootloader啟動后加載到內(nèi)存中的臨時空間,然后跳轉(zhuǎn)到壓縮內(nèi)核入口地址執(zhí)行自解壓代碼,內(nèi)核被解壓到最終的目的地址然后運行。壓縮內(nèi)核所占據(jù)的臨時空間隨后被Linux回收利用。這種方式的內(nèi)核在嵌入式產(chǎn)品中較為常見。
  2.4 ROM自解壓
  解壓縮代碼也能夠以XIP的方式在ROM/Flash中運行。ROM自解壓過程如下:壓縮內(nèi)核存放在ROM/Flash中,不需要加載到內(nèi)存就能運行,Bootloader直接跳轉(zhuǎn)到其存放地址執(zhí)行其自解壓代碼,將壓縮內(nèi)核解壓到最終的目的地址并運行。ROM自解壓方式存放的內(nèi)核解壓縮速度慢,而且也不能節(jié)省內(nèi)存空間。
  3. 內(nèi)核啟動地址的確定
  內(nèi)核自解壓方式
  Head.S/head-XXX.S獲得內(nèi)核解壓后首地址ZREALADDR,然后解壓內(nèi)核,并把解壓后的內(nèi)核放在ZREALADDR的位置上,最后跳轉(zhuǎn)到ZREALADDR地址上,開始真正的內(nèi)核啟動。
  arch/armnommu/boot/Makefile,定義ZRELADDR和ZTEXTADDR。ZTEXTADDR是自解壓代碼的起始地址,如果從內(nèi)存啟動內(nèi)核,設(shè)置為0即可,如果從Rom/Flash啟動,則設(shè)置ZTEXTADDR為相應(yīng)的值。ZRELADDR是內(nèi)核解壓縮后的執(zhí)行地址。
  arch/armnommu/boot/compressed/vmlinux.ld,引用LOAD_ADDR和TEXT_START。
  arch/armnommu/boot/compressed/Makefile, 通過如下一行:
  SEDFLAGS = s/TEXT_START/$(ZTEXTADDR)/;s/LOAD_ADDR/$(ZRELADDR)/;
  使得TEXT_START = ZTEXTADDR,LOAD_ADDR = ZRELADDR。
  說明:
  執(zhí)行完decompress_kernel函數(shù)后,代碼跳回head.S/head-XXX.S中,檢查解壓縮之后的kernel起始地址是否緊挨著kernel image。如果是,beqcall_kernel,執(zhí)行解壓后的kernel。如果解壓縮之后的kernel起始地址不是緊挨著kernelimage,則執(zhí)行relocate,將其拷貝到緊接著kernel image的地方,然后跳轉(zhuǎn),執(zhí)行解壓后的kernel。
  Bootloader解壓方式
  Bootloader把解壓后的內(nèi)核放在內(nèi)存的TEXTADDR位置上,然后跳轉(zhuǎn)到TEXTADDR位置上,開始內(nèi)核啟動。
  arch/armnommu/Makefile,一般設(shè)置TEXTADDR為PAGE_OFF+0x8000,如定義為0x00008000, 0xC0008000等。
  arch/armnommu/vmlinux.lds,引用TEXTADDR
  4. arch/armnommu/kernel/head-armv.S
  該文件是內(nèi)核最先執(zhí)行的一個文件,包括內(nèi)核入口ENTRY(stext)到start_kernel間的初始化代碼,主要作用是檢查CPUID,Architecture Type,初始化BSS等操作,并跳到start_kernel函數(shù)。在執(zhí)行前,處理器應(yīng)滿足以下狀態(tài):
  r0 - should be 0
  r1 - unique architecture number
  MMU - off
  I-cache - on or off
  D-cache – off
  /* 部分源代碼分析 */
  /* 內(nèi)核入口點 */
  ENTRY(stext)
  /* 程序狀態(tài),禁止FIQ、IRQ,設(shè)定SVC模式 */
  mov r0, #F_BIT | I_BIT | MODE_SVC@ make sure svc mode
  /* 置當前程序狀態(tài)寄存器 */
  msr cpsr_c, r0 @ and all irqs disabled
  /* 判斷CPU類型,查找運行的CPU ID值與Linux編譯支持的ID值是否支持 */
  bl __lookup_processor_type
  /* 跳到__error */
  teq r10, #0 @ invalid processor?
  moveq r0, #‘p’ @ yes, error ‘p’
  beq __error
  /* 判斷體系類型,查看R1寄存器的Architecture Type值是否支持 */
  bl __lookup_architecture_type
  /* 不支持,跳到出錯 */
  teq r7, #0 @ invalid architecture?
  moveq r0, #‘a(chǎn)’ @ yes, error ‘a(chǎn)’
  beq __error
  /* 創(chuàng)建核心頁表 */
  bl __create_page_tables
  adr lr, __ret @ return address
  add pc, r10, #12 @ initialise processor
  /* 跳轉(zhuǎn)到start_kernel函數(shù) */
  b start_kernel
  __lookup_processor_type這個函數(shù)根據(jù)芯片的ID從proc.info獲取proc_info_list結(jié)構(gòu),proc_info_list結(jié)構(gòu)定義在include/asm-armnommu/proginfo.h中,該結(jié)構(gòu)的數(shù)據(jù)定義在arch/armnommu/mm/proc-arm*.S文件中,ARM7TDMI系列芯片的proc_info_list數(shù)據(jù)定義在arch/armnommu/mm/proc-arm6,7.S文件中。函數(shù)__lookup_architecture_type從arch.info獲取machine_desc結(jié)構(gòu),machine_desc結(jié)構(gòu)定義在include/asm-armnommu/mach/arch.h中,針對不同arch的數(shù)據(jù)定義在arch/armnommu/mach-*/arch.c文件中。
  在這里如果知道processor_type和architecture_type,可以直接對相應(yīng)寄存器進行賦值。
  5. start_kernel()函數(shù)分析
  下面對start_kernel()函數(shù)及其相關(guān)函數(shù)進行分析。
  5.1 lock_kernel()
  /* Getting the big kernel lock.
  * This cannot happen asynchronously,
  * so we only need to worry about other
  * CPU‘s.
  */
  extern __inline__ void lock_kernel(void)
  {
  if (!++current-》lock_depth)
  spin_lock(&kernel_flag);
  }
  kernel_flag是一個內(nèi)核大自旋鎖,所有進程都通過這個大鎖來實現(xiàn)向內(nèi)核態(tài)的遷移。只有獲得這個大自旋鎖的處理器可以進入內(nèi)核,如中斷處理程序等。在任何一對lock_kernel/unlock_kernel函數(shù)里至多可以有一個程序占用CPU。進程的lock_depth成員初始化為-1,在kerenl/fork.c文件中設(shè)置。在它小于0時(恒為-1),進程不擁有內(nèi)核鎖;當大于或等于0時,進程得到內(nèi)核鎖。
  5.2 setup_arch()
  setup_arch()函數(shù)做體系相關(guān)的初始化工作,函數(shù)的定義在arch/armnommu/kernel/setup.c文件中,主要涉及下列主要函數(shù)及代碼。
  5.2.1 setup_processor()
  該函數(shù)主要通過
  for (list = &__proc_info_begin; list 《 &__proc_info_end ; list++)
  if ((processor_id & list-》cpu_mask) == list-》cpu_val)
  break;
  這樣一個循環(huán)來在.proc.info段中尋找匹配的processor_id,processor_id在head_armv.S文件
  中設(shè)置。
  5.2.2 setup_architecture(machine_arch_type)
  該函數(shù)獲得體系結(jié)構(gòu)的信息,返回mach-xxx/arch.c 文件中定義的machine結(jié)構(gòu)體的指針,包含以下內(nèi)容:
  MACHINE_START (xxx, “xxx”)
  MAINTAINER (“xxx”)
  BOOT_MEM (xxx, xxx, xxx)
  FIXUP (xxx)
  MAPIO (xxx)
  INITIRQ (xxx)
  MACHINE_END
  5.2.3內(nèi)存設(shè)置代碼
  if (meminfo.nr_banks == 0)
  {
  meminfo.nr_banks = 1;
  meminfo.bank[0].start = PHYS_OFFSET;
  meminfo.bank[0].size = MEM_SIZE;
  }
  meminfo結(jié)構(gòu)表明內(nèi)存情況,是對物理內(nèi)存結(jié)構(gòu)meminfo的默認初始化。nr_banks指定內(nèi)存塊的數(shù)量,bank指定每塊內(nèi)存的范圍,PHYS_OFFSET指定某塊內(nèi)存塊的開始地址,MEM_SIZE指定某塊內(nèi)存塊長度。PHYS_OFFSET和MEM_SIZE都定義在include/asm-armnommu/arch-XXX/memory.h文件中,其中PHYS_OFFSET是內(nèi)存的開始地址,MEM_SIZE就是內(nèi)存的結(jié)束地址。這個結(jié)構(gòu)在接下來內(nèi)存的初始化代碼中起重要作用。
下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1TC358743XBG評估板參考手冊
  2. 1.36 MB  |  330次下載  |  免費
  3. 2開關(guān)電源基礎(chǔ)知識
  4. 5.73 MB  |  6次下載  |  免費
  5. 3100W短波放大電路圖
  6. 0.05 MB  |  4次下載  |  3 積分
  7. 4嵌入式linux-聊天程序設(shè)計
  8. 0.60 MB  |  3次下載  |  免費
  9. 5基于FPGA的光纖通信系統(tǒng)的設(shè)計與實現(xiàn)
  10. 0.61 MB  |  2次下載  |  免費
  11. 6基于FPGA的C8051F單片機開發(fā)板設(shè)計
  12. 0.70 MB  |  2次下載  |  免費
  13. 751單片機窗簾控制器仿真程序
  14. 1.93 MB  |  2次下載  |  免費
  15. 8基于51單片機的RGB調(diào)色燈程序仿真
  16. 0.86 MB  |  2次下載  |  免費

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費
  3. 2555集成電路應(yīng)用800例(新編版)
  4. 0.00 MB  |  33564次下載  |  免費
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費
  7. 4開關(guān)電源設(shè)計實例指南
  8. 未知  |  21548次下載  |  免費
  9. 5電氣工程師手冊免費下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費
  11. 6數(shù)字電路基礎(chǔ)pdf(下載)
  12. 未知  |  13750次下載  |  免費
  13. 7電子制作實例集錦 下載
  14. 未知  |  8113次下載  |  免費
  15. 8《LED驅(qū)動電路設(shè)計》 溫德爾著
  16. 0.00 MB  |  6653次下載  |  免費

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537796次下載  |  免費
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420026次下載  |  免費
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費
  11. 6電路仿真軟件multisim 10.0免費下載
  12. 340992  |  191185次下載  |  免費
  13. 7十天學(xué)會AVR單片機與C語言視頻教程 下載
  14. 158M  |  183278次下載  |  免費
  15. 8proe5.0野火版下載(中文版免費下載)
  16. 未知  |  138040次下載  |  免費
主站蜘蛛池模板: 国产美女精品在线| 天天操夜操| 久久久久久夜精品精品免费| 国产精品区在线12p| 天堂资源中文官网| 黄色aaa大片| 欧美成人天天综合天天在线| 日本在线不卡一区| 日本a级影院| 天天摸夜夜添狠狠添2018| 91亚洲视频| 日本免费色视频| 天天舔天天干天天操| 中文字幕123| 欧美性天堂| 日本高清视频色| 自拍你懂的| 国产剧情麻豆三级在线观看| 国产午夜精品一区二区三区| 亚洲色图 在线视频| 国产成人久视频免费| 性夜影院爽黄e爽在线观看| 四虎永久地址4hu紧急入口| 91大神大战丝袜美女在线观看| 免费高清在线视频色yeye| 色老头影视| 天天操天天擦| 最新天堂| brazzersvideosex欧美高清| h视频免费观看| 欧美大片一区| 色综合欧美| 午夜痒痒网| 资源新版在线天堂| 国产成人精品免费视频大全可播放的| 日本69xxⅹxxxxxx19| 日韩免费看| 国产在线免| 日日噜夜夜噜| 欧美成人猛男性色生活| 婷婷99视频精品全部在线观看|