Chapter 4:淺談Linux 核心 === ###### tags:`linux driver` # 背景知識 1991年 當Linus Torvalds 還是赫爾辛基大學的學生時,發表了最初的Linux,並在同年8月在 comp.os.unix上發了一篇公告 ``` From: torvalds@klaava.Helsinki.FI (Linus Benedict Torvalds) Newsgroups: comp.os.minix Subject: What would you like to see most in minix? Summary: small poll for my new operating system Message-ID: <1991Aug25.205708.9541@klaava.Helsinki.FI> Date: 25 Aug 91 20:57:08 GMT Organization: University of Helsinki Hello everybody out there using minix – I’m doing a (free) operating system (just a hobby, won’t be big and professional like gnu) for 386(486) AT clones. This has been brewing since april, and is starting to get ready. I’d like any feedback on things people like/dislike in minix, as my OS resembles it somewhat (same physical layout of the file-system (due to practical reasons) among other things). I’ve currently ported bash(1.08) and gcc(1.40), and things seem to work. This implies that I’ll get something practical within a few months, and I’d like to know what features most people would want. Any suggestions are welcome, but I won’t promise I’ll implement them 🙂 Linus (torvalds@kruuna.helsinki.fi) PS. Yes – it’s free of any minix code, and it has a multi-threaded fs. It is NOT protable (uses 386 task switching etc), and it probably never will support anything other than AT-harddisks, as that’s all I have :-(. ``` 出處:http://www.thelinuxdaily.com/2010/04/the-first-linux-announcement-from-linus-torvalds/ # Linux source code Linux 的source code 的官方網站是https://www.kernel.org/ 可以用git或wget下載原始碼 現在就讓我們開始吧~ 實驗環境: ``` ubuntuDistributor ID: Ubuntu Description: Ubuntu 16.04.1 LTS Release: 16.04 Codename: xenial kernel version:4.4.0-45-generic ``` ## 下載source code 首先先安裝必要的package ``` sudo apt-get install libncurses5-dev gcc make git exuberant-ctags bc libssl-dev ``` 下載source code The latest stable ``` git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git ``` 下載好了之後我們先來看看 directory 裡有什麼東西吧 ``` cd linux ls ``` |文件|說明| |------|----------| |arch|包含各種處理器架構的程式碼| |block|holds code for block-device drivers| |certs|| |crypto|Linux kernel的加密API| |Documentation|Linux kernel的說明文件| |drivers|驅動程式| |firmware|| |fs|filesystem code| |include|標頭檔| |init|核心初始化| |ipc|Inter-Process Communication| |kernel|Kernel level code 和system call code| |lib|函式庫| |mm|High level memory management code| |net|The high-level networking code| |scripts|建立kerenel 會用到的scripts| |security|Code for different Linux security models | |sound|音效卡| |tools|kernel tools| |usr|| # 編譯核心 安裝cross compile tool ``` $ sudo apt-get install binutils-arm-linux-gnueabi ``` ## 設定.config 可以自己設定或選擇預設的設定 ``` make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- <defconfig> ``` >defconfig 的內容可以利用 make ARCH=arm help 查看 自己設定.config ``` make menuconfig make xconfig # QTK圖形界面 make gconfig # GTK圖形界面 make defconfig # 使用預設的config ``` config 設定好了後就來compile linux kernel ## 編譯linux ``` make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- V=1 zImage ``` >把V=1 打開是為了可以觀察詳細的指令輸出情形 然後稍待片刻:tea: 當所有中間檔、函式庫、都編譯建構好後,他們會被集合起來放進一隻ELF檔,叫做vmlinux。 vmlinux 是一個真正的kernel proper是可獨立運作且一體成形的完整ELF映像檔。 >待補: >a. uImage: 給 uboot 用的 binary format >b. dtbs: 編譯 device tree >c. 針對make target解釋 參考資料: [Overview of the Kernel Source](http://courses.linuxchix.org/kernel-hacking-2002/08-overview-kernel-source.html)