色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

電子發燒友App

硬聲App

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

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

3天內不再提示
電子發燒友網>電子資料下載>嵌入式開發>linux內核編譯kbuild系統詳解

linux內核編譯kbuild系統詳解

2017-11-02 | rar | 0.5 MB | 次下載 | 1積分

資料介紹

眾所周知,內核的編譯系統kbuild是個很龐大的系統。但是,它所使用的make和我們平時用的make是一模一樣的。kbuild只是通過預定義一些變量(obj-m,obj-y等等)和目標(bzImage ,menuconfig等等),使內核的編譯和擴展變得十分方便。我們不妨yy一下kbuild的一些功能:
  1.考慮到Linux能夠方便地移植到各個硬件平臺,kbuild也必須很容易添加對某個新的平臺的支持,同時上層的Makefile不需要做大的改動。
  2.Linux下有眾多驅動設備。它們的Makefile希望能夠盡可能簡潔。簡潔到只要指定要編譯的.o文件就行。(這方面kbuild定義了很多有用的變量如obj-m obj-y,-objs等等,用戶只要為這些變量賦值,kbuild會自動把代碼編譯到內核或者編譯成模塊)
  3.要有方便的可定制性。很多參數可以讓用戶指定。這方面kbuild也提供了大量的變量如EXTRA_CFLAGS,用戶如果想include自己的頭文件或者加其它編譯參數,只要設置一下EXTRA_CFLAGS就可以。
  4.有能力遞歸地調用Makefile。因為內核是一個龐大的軟件。它的源代碼的目錄層次很深。要提供一種簡潔的機制,使上層的Makefile能方便地調用下層的Makefile。在這過程中,面向對象的思想也許值得借鑒。
  5.在配置內核時,要提供友好的用戶界面。這方面kbuild也提供了不少工具,如常用的make menuconfig等等。
  我們完全可以把kbuild想象成一個類庫,它為普通的內核開發人員提供了接口(obj-m obj-y EXTRA_CFLAGS等等),為用戶提供了定制工具(make menuconfig)
  如果想了解kbuild的使用方法,可以參閱源代碼自帶的文檔:
  Documentation/kbuild/makefiles.txt
  Documentation/kbuild/modules.txt
  一般情況下是不需要知道具體的編譯順序的。除了在個別情況下,如do_initcalls()中就和函數在.initcall.init section中的順序有關。不過喜歡尋根究底的我,還是想理一下編譯內核時幾個常用的命令,如make bzImage,make menuconfig等等,進而了解kbuild的架構。先看make bzImage吧。
  它的大概脈絡是怎樣的呢?可以用以下命令查看。
  make -n bzImage
  如果嫌內容太多,可以過濾掉多余的信息
  make -n bzImage | grep “make -f”
  可以猜到:
  先作一些準備工作
  make -f scripts/Makefile.build obj=scripts/basic
  然后依次遞歸地調用源代碼中的Makefile
  make -f scripts/Makefile.build obj=init
  make -f scripts/Makefile.build obj=usr
  make -f scripts/Makefile.build obj=arch/i386/kernel
  make -f scripts/Makefile.build obj=arch/i386/kernel/acpi
  make -f scripts/Makefile.build obj=arch/i386/kernel/cpu
  make -f scripts/Makefile.build obj=arch/i386/kernel/cpu/cpufreq
  make -f scripts/Makefile.build obj=arch/i386/kernel/cpu/mcheck
  make -f scripts/Makefile.build obj=arch/i386/kernel/cpu/mtrr
  make -f scripts/Makefile.build obj=arch/i386/kernel/timers
  。。。
  最后壓縮內核,生成bzImage
  make -f scripts/Makefile.build obj=arch/i386/boot arch/i386/boot/bzImage
  make -f scripts/Makefile.build obj=arch/i386/boot/compressed IMAGE_OFFSET=0x100000 arch/i386/boot/compressed/vmlinux
  好,我們從頭開始。找make bzImage的入口:
  第一反應,自然是在/usr/src/linux/Makefile中找
  bzImage:
  。..
  可惜沒找到。
  不過沒關系,用lxr搜索一下,可知bzImage定義在arch/i386/Makefile,所以可以猜測,該makefile一定是被include了。果然,在/usr/src/linux/Makefile中有:
  447 include $(srctree)/arch/$(ARCH)/Makefile
  又因為在arch/i386/Makefile中定義有
  141 zImage bzImage: vmlinux
  142 $(Q)$(MAKE) $(build)=$(boot) $(KBUILD_IMAGE)
  其中這個$(build)定義在/usr/src/linux/Makefile中
  1335 build := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj
  我們在之前查看make -n bzImage信息和之后會經常看到。我們會發現kbuild通常不會直接去調用某個目錄下的Makefile,而是讓該目錄作為scripts/Makefile.build 的參數。scripts/Makefile.build 會對該目錄下的Makefile中的內容(主要是obj-m和obj-y等等)進行處理。由此看來 scripts/Makefile.build這個文件很重要。看看它做了什么:
  由于scripts/Makefile.build后面沒跟目標,所以默認為第一個目標:
  007 .PHONY: __build
  008 __build:
  009
  010 # Read .config if it exist, otherwise ignore
  011 -include .config
  012
  013 include $(if $(wildcard $(obj)/Kbuild), $(obj)/Kbuild, $(obj)/Makefile)
  014
  015 include scripts/Makefile.lib
  這里可以看到,scripts/Makefile.build執行時會include .config文件。.config是make menuconfig后生成的內核配置文件。
  里面有如下語句:
  CONFIG_ACPI_THERMAL=y
  CONFIG_ACPI_ASUS=m
  CONFIG_ACPI_IBM=m
  。。。
  以前我一直對它的格式表示奇怪,現在很清楚了,它們是作為makefile的一部分,通過讀取CONFIG_XXX的值就可以知道他們是作為模塊還是作為內核的一部分而編譯的。
  此外,還包含了$(obj)/Makefile。這就是通過在make時傳遞目錄名$(obj)間接調用Makefile的手法。對于內核普通代碼所對應的Makefile而言,里面只是對obj-m obj-y,-objs等變量進行賦值操作。
  接下去是include scripts/Makefile.lib
  。正如它的文件名所示,這類似于一個庫文件。它負責對obj-m obj-y,-objs等變量進行加工處理。從中提取出subdir-ym等變量,這是個很重要的變量,記錄了需要遞歸調用的子目錄。以后遞歸調用Makefile全靠它了。這里也充分體現了GNU make對字符串進行操作的強大功能。
  回到Makefile.build。這時,重要變量$(builtin-target),$(subdir-ym)等都已經計算完畢。開始列依賴關系和具體操作了。
  079 __build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y)) \
  080 $(if $(KBUILD_MODULES),$(obj-m)) \
  081 $(subdir-ym) $(always)
  082 @:
  $(builtin-target)是指當前目錄下的目標文件,即$(obj)/built-in.o
  如前文所說,$(subdir-ym)用來遞歸調用子目錄的Makefile
  306 # Descending
  307 # ---------------------------------------------------------------------------
  308
  309 .PHONY: $(subdir-ym)
  310 $(subdir-ym):
  311 $(Q)$(MAKE) $(build)=$@
  通過這種方式,實現了對某個目錄及其子目錄的編譯。
  分析完Makefile.build,回過頭來再看bzImage.從arch/i386/Makefile中可以看到,bzImage是在vmlinux基礎上加以壓縮拼接而成。從vmlinux到bzImage的過程在《讀核感悟-
  Linux內核
  啟動-內核的生成》中已經有介紹。現在看看vmlinux是如何生成的。
  見/usr/src/linux/Makefile
  728 vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) FORCE
  729 $(call if_changed_rule,vmlinux__)
  611 vmlinux-init := $(head-y) $(init-y)
  612 vmlinux-main := $(core-y) $(libs-y) $(drivers-y) $(net-y)
  613 vmlinux-all := $(vmlinux-init) $(vmlinux-main)
  614 vmlinux-lds := arch/$(ARCH)/kernel/vmlinux.lds
  vmlinux所依賴的目標$(vmlinux-lds) 是對arch/i386/kernel/vmlinux.lds.S進行預處理的結果:arch/i386/kernel/vmlinux.lds ,其它的依賴關系也都可以在/usr/src/linux/Makefile中查到。
  所以,當用戶在源代碼目錄下執行make bzImage。make會檢查bzImage的依賴目標,然后不停地遞歸調用各個Makefile,最終生成一個bzImage文件。
  如果我們換個角度,還可以歸納出不少有趣的東西。如果把make看成是一種腳本語言,那么Makefile就是代碼。make就是解釋器。make里也有函數,也有變量。通過定義目標,可以實現類似于函數的效果。而目標之間的依賴關系則類似于函數內部再調用其它函數。
  如果我們考慮變量的作用域,還可以歸納出以下幾點:
  1.Makefile內部定義的變量作用域只限于那個Makefile中,如obj-m。
  2.要使變量的作用域擴展到整個make命令的執行過程(包括遞歸調用的其它Makefile),需要使用export命令。
  調用Makefile的方式也有很多種:
  1.一種是隱式調用,如運行make,它會自動在當前目錄尋找Makefile等。
  2.一種是顯式調用,如用make -f指定。
  3.一種是用include 來調用。
?
下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  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次下載  |  免費
主站蜘蛛池模板: 强开乳罩摸双乳吃奶视频| 日韩欧美视频一区二区| 大咪咪dvd| 国产在线精品视频二区| 最新无码专区在线视频| 亚洲精品视频免费看| 97国产精品视频在线观看| 国产福利高清在线视频| 国产大片51精品免费观看| 国产产乱码一二三区别免费| 好色女博士| 久久青草免费91线频观看站街| 久久精品熟一区二区三区| 日本久久精品视频| 忘忧草在线社区WWW日本直播 | 久久天天婷婷五月俺也去| 全免费午夜一级毛片| 神马电影院午 夜理论| 真实农村女人野外自拍照片| 国产成人久久AV免费看澳门| 六六影院午夜伦理| 小xav导航| seyeye在清在线| 久久观看视频| 天天操夜夜噜| qvod在线观看| 久久青草影院| 强奸日本美女小游戏| 在线精品国精品国产不卡| 国产精品毛片在线视频| 欧美xxxxxbb| 伊人久久丁香色婷婷啪啪| 国产精品一区二区在线播放| 青年医生插曲| 97超碰在线视频人人av| 精品免费久久久久久成人影院| 美女露出撒尿的部位| 亚洲一品AV片观看五月色婷婷| 99精品免费久久久久久久久日本| 大伊人青草狠狠久久| 妓女嫖客叫床粗话对白|