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

電子發燒友App

硬聲App

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示
電子發燒友網>電子資料下載>嵌入式開發>Linux內核移植相關代碼解析

Linux內核移植相關代碼解析

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

資料介紹

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

評論

查看更多

下載排行

本周

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

本月

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

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費
  3. 2protel99se軟件下載(可英文版轉中文版)
  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十天學會AVR單片機與C語言視頻教程 下載
  14. 158M  |  183278次下載  |  免費
  15. 8proe5.0野火版下載(中文版免費下載)
  16. 未知  |  138040次下載  |  免費
主站蜘蛛池模板: 久久久久综合中文字幕 | 亚洲成人精品在线 | a亚洲天堂| 亚洲人成影院在线高清 | 亚洲狠狠婷婷综合久久久图片 | 色综合久久88色综合天天 | 欧美在线视频免费 | 在线成人免费 | 日本免费不卡视频一区二区三区 | 自偷自拍亚洲欧美清纯唯美 | 午夜艹逼 | 男女爱爱福利 | a中文字幕1区 | 欧美xxx69| 色偷偷.com | 三级在线观看视频 | 欧美性黄色 | 嘿嘿嘿视频在线观看网站 | 欧美一级乱理片免费观看 | 久操免费在线 | 被公侵犯肉体中文字幕一区二区 | 222aaa天堂 | 美女好紧好大好爽12p | 天天操天天做 | 亚洲五月综合缴情婷婷 | 好吊788gaoco| 2021av网站| 黄色aaa大片| 国产精品一区牛牛影视 | 亚洲欧美v视色一区二区 | 亚洲伊人久久大香线蕉影院 | 在线亚洲欧美性天天影院 | 午夜精品视频在线 | 国产精品手机在线 | 男人午夜视频在线观看 | 亚洲精品亚洲人成毛片不卡 | 羞羞色院91精品网站 | 日本加勒比在线视频 | 美女张开腿让男生桶出水 | 久久综合九色综合精品 | 色综合色狠狠天天综合色hd |