核心移植之Part1

來源:互聯網
上載者:User

 

 一. 知識要點:

1. 核心打補丁,編譯,UBOOT燒寫實驗

2. 核心功能,目錄結構核心菜單,驅動直接編譯進核心和模組概念,結合Makefile,Kconfig分析

3. 核心的啟動過程分析

   3.1 核心產生過程解析

   3.2 核心解壓縮、 vmlinux啟動流程(難,大致瞭解流程)

   3.3 機器ID的比較

   3.4 UBOOT參數傳遞的啟動參數解析

   3.5 start_kernel()的典型過程

           setup_arch()

           rest_init()

           驅動載入過程

           根檔案系統掛載,第一個應用程式init的執行 

二.核心的編譯過程

編譯:

1. make distclean (徹底清除所有編譯過程中產生的依賴和目標問題,不是每次都做)

2.準備核心配置.config

make fs2410_defconfig

   實際效果arch/arm/configs/fs2410_defconfig ====> .config

3. 編輯核心根目錄下的Makefile,添加體繫結構和交叉工具鏈定義

  ARCH            ?=arm

  CROSS_COMPILE   ?=arm-linux-gnu-

 也可以臨時指定的方式: make ARCH=arm CROSS_COMPILE=arm-linux-gnu- fs2410_defconfig

4.配置核心

  linux-2.6.22.6$ make menuconfig

    System Type  --->  ARM system type (Samsung S3C2410)  ---> 

    菜單中: * :直接編譯進核心   M: 不直接編譯進核心, XXX.ko, 目標板上: insmod xxxx.ko

    exit &save  (寫入.config)

make menuconfig的深入分析:

make menuconfig實際執行:

scripts/kconfig/mconf arch/arm/Kconfig

#

# using defaults found in .config

#

kernel中Makefile和Kconfig的規則: kbuild

#

# Ethernet (10 or 100Mbit)

#

CONFIG_NET_ETHERNET=y

CONFIG_MII=y

CONFIG_CIRRUS=y

CONFIG_DM9000=y

# CONFIG_SMC91X is not set

Kconfig的文法規則

 參考 Documentation\kbuild

drivers/media/video/Kconfig 是一個好的例子

 

.config的作用

1.控制核心中某個檔案或者目錄是否編譯進核心

2.編譯過程中產生include/linux/autoconf.h, 通過這個autoconf.h控制我們核心中的.c檔案某一塊代碼是否編譯進核心

5.核心的編譯:

make uImage

make uImage V=1 (顯示詳細資料)

make uImage V=1 2>&1 |tee compile_log.txt (顯示詳細資料並記錄編譯過程到compile_log.txt)

三、核心的產生過程

arm-linux-gnu-ld -EL  -p --no-undefined -X -o vmlinux -T
arch/arm/kernel/vmlinux.lds
arch/arm/kernel/head.o arch/arm/kernel/init_task.o  init/built-in.o --start-group  usr/built-in.o  arch/arm/kernel/built-in.o  arch/arm/mm/built-in.o  arch/arm/common/built-in.o 
arch/arm/mach-s3c2410/built-in.o  arch/arm/nwfpe/built-in.o  kernel/built-in.o  mm/built-in.o  fs/built-in.o  ipc/built-in.o  security/built-in.o  crypto/built-in.o  lib/lib.a  arch/arm/lib/lib.a  lib/built-in.o  arch/arm/lib/built-in.o 
drivers/built-in.o  sound/built-in.o  net/built-in.o --end-group .tmp_kallsyms3.o

===>在核心的根目錄下產生vmlinux(~24M,ELF )
echo 'cmd_vmlinux := arm-linux-gnu-ld -EL  -p --no-undefined -X -o vmlinux -T arch/arm/kernel/vmlinux.lds arch/arm/kernel/head.o arch/arm/kernel/init_task.o  init/built-in.o --start-group  usr/built-in.o  arch/arm/kernel/built-in.o  arch/arm/mm/built-in.o 
arch/arm/common/built-in.o  arch/arm/mach-s3c2410/built-in.o  arch/arm/nwfpe/built-in.o  kernel/built-in.o  mm/built-in.o  fs/built-in.o  ipc/built-in.o  security/built-in.o  crypto/built-in.o  lib/lib.a  arch/arm/lib/lib.a  lib/built-in.o  arch/arm/lib/built-in.o 
drivers/built-in.o  sound/built-in.o  net/built-in.o --end-group .tmp_kallsyms3.o' > ./.vmlinux.cmd
echo '  /bin/sh /home/shyi/s3c2410/fs2410/kernel/linux-2.6.14/scripts/mksysmap System.map' && /bin/sh /home/shyi/s3c2410/fs2410/kernel/linux-2.6.14/scripts/mksysmap vmlinux
System.map; if [ $? -ne 0 ]; then rm -f vmlinux; /bin/false; fi;
  /bin/sh /home/shyi/s3c2410/fs2410/kernel/linux-2.6.14/scripts/mksysmap System.map
echo '  /bin/sh /home/shyi/s3c2410/fs2410/kernel/linux-2.6.14/scripts/mksysmap .tmp_System.map' && /bin/sh /home/shyi/s3c2410/fs2410/kernel/linux-2.6.14/scripts/mksysmap .tmp_vmlinux3 .tmp_System.map
  /bin/sh /home/shyi/s3c2410/fs2410/kernel/linux-2.6.14/scripts/mksysmap .tmp_System.map
cmp -s System.map .tmp_System.map || (echo Inconsistent kallsyms data; echo Try setting CONFIG_KALLSYMS_EXTRA_PASS; rm .tmp_kallsyms* ; /bin/false )
rm -f .old_version
make -f scripts/Makefile.build obj=arch/arm/boot MACHINE=arch/arm/mach-s3c2410/ arch/arm/boot/uImage
  arm-linux-gnu-objcopy -O binary -R .note -R .comment -S  vmlinux arch/arm/boot/Image
  Kernel: arch/arm/boot/Image is ready
make -f scripts/Makefile.build obj=arch/arm/boot/compressed arch/arm/boot/compressed/vmlinux
  gzip -f -9 < arch/arm/boot/compressed/../Image > arch/arm/boot/compressed/piggy.gz
  arm-linux-gnu-gcc -Wp,-MD,arch/arm/boot/compressed/.piggy.o.d  -nostdinc -isystem /opt/crosstool/gcc-3.4.5-glibc-2.3.6/arm-linux-gnu/lib/gcc/arm-linux-gnu/3.4.5/include -D__KERNEL__ -Iinclude  -mlittle-endian
-D__ASSEMBLY__ -Wa,-L -gdwarf-2 -mapcs-32 -mno-thumb-interwork -D__LINUX_ARM_ARCH__=4 -march=armv4 -mtune=arm9tdmi -msoft-float    -c -o arch/arm/boot/compressed/piggy.o
arch/arm/boot/compressed/piggy.S
  arm-linux-gnu-ld
-EL   --defsym zreladdr=0x30008000 --defsym params_phys=0x30000100 -p --no-undefined -X /opt/crosstool/gcc-3.4.5-glibc-2.3.6/arm-linux-gnu/lib/gcc/arm-linux-gnu/3.4.5/libgcc.a
-T arch/arm/boot/compressed/vmlinux.lds
arch/arm/boot/compressed/head.o

arch/arm/boot/compressed/piggy.o arch/arm/boot/compressed/misc.o
-o arch/arm/boot/compressed/vmlinux
  arm-linux-gnu-objcopy -O binary -R .note -R .comment -S  arch/arm/boot/compressed/vmlinux
arch/arm/boot/zImage
  Kernel: arch/arm/boot/zImage is ready
  /bin/sh /home/shyi/s3c2410/fs2410/kernel/linux-2.6.14/scripts/mkuboot.sh
-A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008000 -n 'Linux-2.6.14' -d
arch/arm/boot/zImage
arch/arm/boot/uImage
Image Name:   Linux-2.6.14
Created:      Wed Aug 31 15:08:47 2011
Image Type:   ARM Linux Kernel Image (uncompressed)
Data Size:    1568348 Bytes = 1531.59 kB = 1.50 MB
Load Address: 30008000
Entry Point:  30008000
  Image arch/arm/boot/uImage is ready
注意: 要正確產生uImage, 必須先把u-boot編譯後的tools/mkimage 放到系統路徑下,比如/usr/bin目錄下

待續……

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.