内核启动流程分析(一)编译体验
目錄
2.打補丁
3.配置
總結
配置方式
配置體驗
4.編譯
鏈接
鏈接腳本
5.燒寫內核
1.總體概述?
2.打補丁
3.配置
總結
配置方式
配置有三種方法:
1、make menuconfig 每一項都配置,非常多的選項,圖形界面配置
2、使用默認配置后執行make menuconfig
? ? ? ? ①查看下默認配置,使用find -name "*defconfig*"搜索,找到很多配置文件,比如在arch/arm下有文件夾configs保存默認配置
./arch/arm/configs/realview_defconfig ./arch/arm/configs/hackkit_defconfig ./arch/arm/configs/lpd270_defconfig ....... ./arch/arm/configs/s3c2410_defconfig? ? ? ②進入這個目錄查看下相關的config,發現?s3c2410_defconfig與我們的單板最為接近
cd arch/arm/configs/ ls make s3c2410_defconfig? ? ?③使用對應的最接近的默認配置make s3c2410_defconfig
? ? ?④執行?make menuconfig.最后提示所有配置項目寫入.config中
book@book-desktop:~/stu/kernel/linux2.6/linux-2.6.22.6$ make s3c2410_defconfig drivers/serial/Kconfig:235:warning: multi-line strings not supported ....... # # configuration written to .config #? ? ? ⑤如果報錯,則是因為make版本過新
book@book-vm:~/work/linux-2.6.22.6$ make s3c2410_defconfig Makefile:416: *** mixed implicit and normal rules: deprecated syntax Makefile:1449: *** mixed implicit and normal rules: deprecated syntax make: *** No rule to make target 's3c2410_defconfig'。 停止。原因:是由于我的系統的make工具太新,make的舊版規則已經無法兼容新版。1.在makefile中將416行代碼 config %config: scripts_basic outputmakefile FORCE 改為 %config: scripts_basic outputmakefile FORCE 2.在makefile中將1449行代碼 / %/: prepare scripts FORCE 改為 %/: prepare scripts FORCE3、使用廠家提供的配置config_ok,直接復制為名為.config,即cp config_ok .config,再執行?make menuconfig實際上方式2最終也是產生這個.config文件,make menuconfig使用到這個.config文件。
配置體驗
輸入Y編譯進內核 輸入N 不包含 輸入M編譯為模塊,所謂模塊就類似于驅動,可以后置加載 輸入?進入查看具體的配置項 輸入 / 搜索比如我們配置網絡DM9000,按下圖進入配置
4.編譯
uboot啟動的是uImage格式的linux kernel, 就是帶有頭部信息的程序文件
make uImage從編譯流程分析下編譯過程
rm vmlinux #先刪除 make uImage V=1 # V=1 表示更加詳細顯示命令摘錄下最后的日志記錄
鏈接
文件的順序在外部定義.第一個文件為arch/arm/kernel/head.o,具體的段由鏈接腳本決定.這個鏈接命令實際也是存在.vmlinux.cmd中的
arm-linux-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/mach-s3c2400/built-in.o arch/arm/mach-s3c2412/built-in.o arch/arm/mach-s3c2440/built-in.o arch/arm/mach-s3c2442/built-in.o arch/arm/mach-s3c2443/built-in.o arch/arm/nwfpe/built-in.o arch/arm/plat-s3c24xx/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 block/built-in.o arch/arm/lib/lib.a lib/lib.a arch/arm/lib/built-in.o lib/built-in.o drivers/built-in.o sound/built-in.o net/built-in.o --end-group .tmp_kallsyms2.o#-T arch/arm/kernel/vmlinux.lds arch/arm/kernel/head.o arch/arm/kernel/init_task.o #這個與makefile中的是對應的 vmlinux-init := $(head-y) $(init-y) head-y := arch/arm/kernel/head$(MMUEXT).o arch/arm/kernel/init_task.o鏈接腳本
arch/arm/kernel/,文件里面的段按照順序,比如代碼段是先放.text.head,**一開始是放“ *”(指所有文件)的 “ .text.head”段。**再放init,文件的順序由外部決定. 鏈接腳本?vmlinux.lds?是由?vmlinux.lds.S?文件生成的。
SECTIONS {. = (0xc0000000) + 0x00008000; #這個是虛擬地址.text.head : { #先放所有文件的 .text.head 段_stext = .;_sinittext = .;*(.text.head)}.init : { /* Init code and data */ #再接著是放所有文件的“ .init.text”段。*(.init.text)_einittext = .;__proc_info_begin = .;*(.proc.info.init)__proc_info_end = .;__arch_info_begin = .;*(.arch.info.init)__arch_info_end = .;__tagtable_begin = .;*(.taglist.init)__tagtable_end = .;. = ALIGN(16);__setup_start = .;*(.init.setup)__setup_end = .;__early_begin = .;*(.early_param.init)__early_end = .;__initcall_start = .;*(.initcall0.init) *(.initcall0s.init) *(.initcall1.init) *(.initcall1s.init) *(.initcall2.init) *(.initcall2s.init) *(.initcall3.init) *(.initcall3s.init) *(.initcall4.init) *(.initcall4s.init) *(.initcall5.init) *(.initcall5s.init) *(.initcallrootfs.init) *(.initcall6.init) *(.initcall6s.init) *(.initcall7.init) *(.initcall7s.init)__initcall_end = .;__con_initcall_start = .;*(.con_initcall.init)__con_initcall_end = .;__security_initcall_start = .;*(.security_initcall.init)__security_initcall_end = .;. = ALIGN(32);__initramfs_start = .;usr/built-in.o(.init.ramfs)__initramfs_end = .;. = ALIGN(4096);__per_cpu_start = .;*(.data.percpu)__per_cpu_end = .;__init_begin = _stext;*(.init.data). = ALIGN(4096);__init_end = .;}5.燒寫內核
編譯完成后在/linux-2.6.22.6/arch/arm/boot生成uImage,在uboot下輸入k進入燒寫,使用dnw燒寫程序,具體的k實現了什么命令,查看下uboot代碼,在cmd_menu.c定義
strcpy(cmd_buf, "usbslave 1 0x30000000; nand erase kernel; nand write.jffs2 0x30000000 kernel $(filesize)");run_command(cmd_buf, 0);然后就可以通過b啟動
轉載:https://www.cnblogs.com/zongzi10010/p/10023694.html
總結
以上是生活随笔為你收集整理的内核启动流程分析(一)编译体验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第005课_字符设备驱动
- 下一篇: 内核启动流程分析(二)配置详解