這是一篇比較詳盡的核心編譯說明(轉)
這是一篇比較詳盡的核心編譯說明(轉)[@more@]Linux 核心編譯說明1.Linux核心原始碼結構:核心原始碼中主要包含以下子目錄:arch :包含了與體系結構相關的程式碼對應於每一個支援的體系結構,有一個相應的子目錄如i386、arm、alpha等。其每個體系結構子目錄下包含幾個主要的子目錄:kernel :包含與體系結構相關的核心程式碼mm : 包含與體系結構相關的記憶體管理程式碼lib : 包含與體系結構相關的庫程式碼documentation:包含核心的文件drivers :包含裝置驅動程式碼。每類裝置有相應的子目錄,如char 、block、net等fs : 包含檔案系統的程式碼。每個支援的檔案系統有相應的子目錄,如 ext2、proc等include :核心標頭檔案,對每一種體系結構,分別有相應的子目錄。init : 包含核心初始化程式碼lib : 包含核心的庫程式碼mm :包含記憶體管理程式碼kernel :包含核心管理程式碼net :包含網路部分的程式碼2.系統引導的過程在pc機上系統啟動過程:系統加電以後bois對系統完成監測設定後將控制權交給硬碟上MBR中的 BootLoader在這裡即是lilo或grub等。BootLoader 將作業系統程式碼調入記憶體,然後將控制權交給arch/i386/boot中的Setup.S這段程式。Setup.S 這段程式在386真實模式下對系統進行基本的檢測和設定後轉入保護模式把控制權交給Head.SHead.S 建立記憶體管理和中斷管理的框架後呼叫init/main.c中的start_kernel()函式在start_kernel執行完成後使用者就可以登入和使用linux了。Start_kernel()函式在init/main.c 中定義。Start_kernel的流程中的主要步驟:setup_arch(&command_line); 用於和處理器、記憶體等最基本的硬體相關部分的初始化。 在 arch/i386/kernel/setup.c 中定義;parse_options(command_line); 把啟動時得到的引數從命令列的字串中分離出來並賦給相應的變數。在 init/main.c 中定義;trap_init(); 對中斷向量表進行初始化。在 arch/i386/kernel/trap.c 中定義;init_IRQ(); 與中斷有關的初始化, 在 arch/i386/kernel/i8259.c 中定義;sched_init(); 程式排程初始化。 在 kernel/sched.c 中定義;softirq_init(); 在 kernel/softirq.c 中定義;time_init(); 時間部分初始化。 在 arch/i386/kernel/time.c 中定義;console_init(); 對終端初始化。 在 drivers/char/tty_io.c 中定義;buffer_init(mempages); 對用於指示塊快取的buff free list 初始化。 在fs/buffer.c 中定義;mem_init(); 記憶體管理初始化。 在 arch/i386/mm/init.c中定義;rest_init(); 此函式中呼叫kernel_thread(init,NULL, CLONE_FS | CLONE_FILES | CLONE_SIGNAL)函式時會呼叫init/main.c中的init()函式在init()函式中將會建立dbflush、kswapd兩個新的核心執行緒。初始化tty1裝置。尋找/etc/init或/sbin/init 或/bin/init來建立一個init程式。Init程式根據/etc/inittab檔案進行檔案系統檢查、啟動系統守護程式為聯機終端建立getty程式,執行/etc/rc下的命令檔案。此後getty會在終端上顯示login提示符,以等待使用者登入。3.使用make建立核心1.使用make menuconfig命令:使用以下編譯選項:Processor type and features --->(Pentium-Pro/Celeron/Pentium-II) Processor family(3GB) Maximum Virtual MemoryGeneral setup --->(ELF) Kernel core (/proc/kcore) format[*] Kernel support for ELF binariesFile systems --->[*] /proc file system support[*] Second extended fs supportATA/IDE/MFM/RLL support --->[*] ATA/IDE/MFM/RLL support[*] Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support[*] Include IDE/ATA-2 DISK supportCharacter devices --->[*] Virtual terminalConsole drivers --->[*] VGA text console生成核心bzImage 大小為 309892 byte;此核心可在pc上成功引導系統此命令生成一個檔案 .config 其中根據你在menuconfig中的選擇定義了相應的變數。在Makefile檔案中將會包含這個檔案。2.使用make dep命令 建立依賴關係。3.使用make bzImage 命令建立核心。如設定正確將在arch/i386/boot/目錄下生成核心bzImage檔案4.make bzImage的流程簡單說明當我們使用make命令時,make程式將首先找到當前目錄下的Makefile檔案。根據Makefile檔案的語法進行處理。在主Makefile檔案中包含了arch/i386/Makefile我們make的目標bzImage即在該檔案中定:bzImage: vmlinux@$(MAKEBOOT) bzImage #此命令將解釋為:make -C arch/i386/boot bzImage現在make需要先去建立目標 vmlinux 然後再執行 arch/i386/boot/ 目錄下的 make bzImae。我們現在假設vmlinux目標已生成,則 arch/i386/boot目錄下的make程式將執行如下操作:tools/build -b bbootsect bsetup compressed/bvmlinux.out ./ bzImage即將vmlinux 用 tools/build工具壓縮成目標檔案 bzImage(在此過程中,還會構建build 程式,將vmlinux轉換成bvmlinux.out等,可參考tools 和 compressed目錄下的Makefile檔案)。生成vmlinux目標:在主目錄下Makefile檔案中vmlinux生成規則如下:vmlinux: $(CONFIGURATION) init/main.o init/version.o linuxsubdirs$(LD) $(LINKFLAGS) $(HEAD) init/main.o init/version.o --start-group $(CORE_FILES) $(DRIVERS) $(NETWORKS) $(LIBS) --end-group -o vmlinux #生成vmlinux$(NM) vmlinux |grep –v (compiled)|(.o$$)|( [aUw] )|(..ng$$)|(LASH[RL]DI) | sort > System.map #此命令根據vmlinux生成System.map檔案在當前設定下此ld連線命令被解釋為:ld -m elf_i386 -T /home/arm/linux/arch/i386/vmlinux.lds -e stext arch/i386/kernel/head.o arch/i386/kernel/init_task.o init/main.o init/version.o --start-group arch/i386/kernel/kernel.o arch/i386/mm/mm.o kernel/kernel.o mm/mm.o fs/fs.o ipc/ipc.o drivers/char/char.o drivers/block/block.o drivers/misc/misc.o drivers/net/net.o drivers/media/media.o drivers/ide/idedriver.o drivers/video/video.o net/network.o /home/arm/linux/arch/i386/lib/lib.a /home/arm/linux/lib/lib.a /home/arm/linux/arch/i386/lib/lib.a --end-group -o vmlinux即連線程式ld 將各個.o檔案連線成目標檔案 vmlinux 。此命令中用到的各個 .o檔案make程式會根據Makefile檔案的規則去自動生成,下面簡單介紹一下由ipc目錄生成ipc.o過程:其ipc目錄下Makefile檔案內容如下:O_TARGET := ipc.oobj-y := util.oobj-$(CONFIG_SYSVIPC) += msg.o sem.o shm.oinclude $(TOPDIR)/Rules.make #包含的Rules.make檔案中為通用的規則;如我們在make menuconfig時選中了SYSVIPC選項,則 .config檔案中將定義變數 CONFIG_SYSVIPC=y; 則obj-y 就等於util.o msg.o sem.o shm.o;根據Rules.make將四個.c檔案編譯為 .o檔案。再將四個.o檔案連線成 ipc.o檔案。在我們的當前設定中沒有選擇SYSVIPC;將只使用util.o一個檔案生成目標 ipc.o ;而util.o由util.c生成。當所有需要的.o檔案生成以後,由ld將其連線生成vmlinux檔案,再將其壓縮成我們所需要的核心檔案 bzImage。Make程式就執行完了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-938845/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- redux connect的淺比較說明Redux
- 轉一個比較詳盡的XP登入介面製作教程
- SOA技術標準的比較說明
- 編譯引數-ObjC的說明編譯OBJ
- 核心FAQ 舉例說明 (轉)
- 關於支援OPenACC的編譯器說明編譯
- 老話新說,RedHat 公司 推薦編譯核心方法(轉)Redhat編譯
- 編譯核心make dep 的意思(轉)編譯
- Emacs詳細使用說明(轉)Mac
- CMM編譯器和C編譯器過程呼叫實現的比較編譯
- 有關RFC文件的翻譯說明 (轉)
- 關於商業部署機器學習,這有一篇詳盡指南機器學習
- MySQL 5.7.9原始碼編譯安裝說明MySql原始碼編譯
- 3568F-Qt工程編譯說明QT編譯
- Linux作業系統核心編譯詳解(2)(轉)Linux作業系統編譯
- 轉一篇關於JAVA 和 .NET的文章的比較Java
- RK3399 android編譯說明Android編譯
- RHEL 7特性說明(七):編譯程式及工具編譯
- MySQL 5.5編譯安裝cmake引數說明MySql編譯
- 編譯核心的一點點經驗(轉)編譯
- 瀏覽器核心比較瀏覽器
- 深度學習中的epochs,batch_size,iterations詳解---對這三個概念說的比較清楚深度學習BAT
- CentOS 7升級核心簡明說明CentOS
- OpenBSD核心編譯和最佳化(轉)編譯
- FreeBSD編譯安裝新核心(轉)編譯
- OpenBSD 核心編譯和最佳化(轉)編譯
- Oracle RAC中Srvctl命令詳細說明(轉)Oracle
- 【譯】Ruby2.6的JIT功能,編譯和解釋型語言的相關說明編譯
- 轉一篇比較簡單的installshiled的破解 (2千字)
- Weblogic環境下的JSP預編譯圖文說明WebJS編譯
- RHEL 7特性說明(四):核心
- 說說 方舟編譯器編譯
- Webots和ROS的使用說明(譯)WebROS
- 轉換說明
- 只編譯核心裡面的一個模組的方法(轉)編譯
- Vmware下成功編譯linux核心2.6(轉)編譯Linux
- 詳解關鍵路徑法,這可能是你能找到的最詳盡的了
- 說說你工作中遇到過比較難的技術問題是什麼?是如何解決的?