日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

内核启动流程分析(一)编译体验

發布時間:2025/4/5 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 内核启动流程分析(一)编译体验 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

2.打補丁

3.配置

總結

配置方式

配置體驗

4.編譯

鏈接

鏈接腳本

5.燒寫內核


1.總體概述?

2.打補丁

  • 解壓?tar xjf linux-2.6.22.6.tar.bz2
  • 打補丁,cat下補丁文件知道需要忽略第一個/?patch -p1 < linux-2.6.22.6_jz2440.patch
  • 打包下生成的文件tar cjvf linux2.6.22_ok.tar.bz2 linux-2.6.22.6
  • 3.配置

    總結

  • .config通過make自動生成autoconf.h和auto.conf
  • 源代碼中通過autoconf.h決定代碼編譯,無論配置為m或者y都編譯,因為頭文件都定義為1
  • 子目錄的makefile通過auto.conf中的y/m決定編譯為模塊.ko還是編譯到內核.這個文件是被頂層的Makefile包含
  • 配置方式

    配置有三種方法:

    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 FORCE

    3、使用廠家提供的配置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

    總結

    以上是生活随笔為你收集整理的内核启动流程分析(一)编译体验的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。