linux核心驅動-核心初涉

來源:互聯網
上載者:User

   一、為什麼要學習核心?

  有些人要學習核心,而有些人則可以不學習它。你如果以後要從事系統研發或驅動開發的話,就要學習核心。

  剛剛接觸核心,主要學習核心的介面函數。不要深入的去讀核心,因為你讀也讀不懂,核心代碼龐大如野獸一般不可駕馭。

  學習核心主要掌握層次學習法,即從頭開始學習,一環緊扣一環。

  核心學習的四步學習法:1、核心理論學習-概念與函數原型2、範常式序分析3、思維導圖設計4、親自編寫代碼

  二、linux核心簡介

  1、linux體繫結構

  分為兩部分:使用者空間和核心空間

  2、linux為什麼要分為使用者空間和核心空間

  現代CPU通常實現了不同的工作模式,以ARM為例,實現了7中工作模式。X86實現了4中不同的層級:Ring0-Ring3. Ring0下可以執行特權指令,可以訪問IO裝置等,在Ring3則有很多限制。linux系統利用CPU的這一特性,使用了其中兩個層級分別運行linux核心與應用程式,這樣使作業系統本身得到充分的保護。例如:如果使用X86,使用者代碼運行在Ring3,核心代碼運行在Ring0.核心空間與使用者空間是程式執行的兩種不同狀態,通過系統調用和硬體中斷能夠完成從使用者空間到核心空間的轉移。

  3.linux的核心構架

  系統調用介面

  SCI層為使用者空間提供了一套標準的系統調用函數來訪問Linux核心,搭起了使用者空間到核心空間的橋樑。

  進程管理(PM)是建立進程,停止進程,並控制它們之間的通訊。進程管理還包括控制活動進程如何共用CPU,即進程調度。

  記憶體管理(MM)的主要作用是控制多個進程安全地共用記憶體地區。

  網路通訊協定棧(Network Stack)為linux提供了豐富的網路通訊協定實現。

  虛擬檔案系統(VFS)隱藏各個檔案系統的具體細節,為檔案操作提供統一的介面。

  裝置驅動(DD):linux核心中有大量代碼都在裝置驅動程式中,它們控制特定的硬體裝置。

  三、linux核心原始碼結構

  1、下載原始碼地址www.kernel.org

  2、linux核心原始碼採用樹形結構進行組織,非常合理地把功能相關的檔案都放在同一個子目錄下,使得程式更具可讀性。

  arch目錄:arch是architecture的縮寫。核心所支援的每種CPU體系,在該目錄下都有對應的子目錄。每個cpu的子目錄,又進一步分解為boot,mm,kernel等子目錄,分別包含控制系統引導,記憶體管理,系統調用等。/* X86英特爾cpu與之相相容體繫結構的子目錄:boot 引導程式compressed核心解壓縮 tools產生壓縮核心映像的程式 kernel相關核心特性實現方式,如訊號處理、時鐘處理 lib 硬體相關工具函數*/

  documentation核心文檔

  drivers裝置驅動文檔

  include核心所需要的標頭檔。與平台無關的標頭檔在include/linux子目錄下,與平台有關的標頭檔則放在相應的子目錄中。

  fs目錄存放各種檔案系統的實現代碼。每個子目錄對應一種檔案系統的實現,公用的來源程式用於實現虛擬檔案系統vfs

  "|--devpts是/dev/pts虛擬檔案系統

  ||--ext2是第二擴充檔案系統

  ||--fat是MS的fat32檔案系統

  ||--isofs 是IsO9660光碟片cd-rom上的檔案系統

  net是網路通訊協定的實現代碼

  ||--802 802無線通訊協議核心支援代碼

  ||--appletalk 與蘋果系統連網的協議

  ||--ax25 AX25無線INTERNET協議

  ||--bridge 橋接裝置

  ||--ipv4 IP協議族V4版32位定址模式

  ||--ipv6 IP協議族V6版

  四、linux核心的配置和編譯

  代碼是如何轉化為燒寫或安裝到硬體平台中的系統映像檔案的?

  1、為什麼要配置核心

  選出需要的,去掉不要的!1、硬體的需求2、軟體的需求

  下載核心後要在linux中解壓縮,不要在windows下解壓縮因為windows下不區分大小寫,而linux作業系統區分大小寫。

  進入核心的檔案下:

  2、核心的配置:

  make config:基於文字模式的互動式配置

  make menuconfig:基於文字模式的菜單型配置

  <*>檔案經過編譯由.c檔案到.o檔案,最後連結壓縮為核心鏡像,它存放在記憶體。

  核心模組,同上經過編譯後會把.o檔案安裝到硬碟。

  < >表示不選擇該功能

  配置結果檔案是隱藏檔案,可以用ls -a 在核心檔案下查看.config version

  上面介紹的是一種方法,不過作為初學者我們往往是在一個已有的設定檔基礎上,通過修改得到新的設定檔,linux核心提供了一系列可供參考的核心設定檔,位於Arch/cpu/configs

  接下來,我們利用虛擬機器上的linux系統的設定檔來建立自己的升級版核心,並在虛擬機器上運行該核心。

  圖:

  3、編譯核心(編譯核心、編譯核心模組、製作ramdisk)

  3.1、編譯核心

  make zImage只能編譯小於512K的核心

  make bzImage我們一般會使用這種方法編譯核心

  如需擷取詳細編譯資訊,可使用:

  make zImage V=1

  make bzImage V=1

  編譯好的核心位於arch/cpu/boot/目錄下***

  3.2編譯核心模組

  make modules 編譯核心模組

  make modules_install 將編譯好的核心模組,從核心原始碼目錄複寫到/lib/modules下**,為打包做好準備

  經過第一步編譯後,散落在各個檔案下的.ko檔案為記憶體模組。需要集中移動到/lib/modules這個就由make modules_install來完成

  3.3製作init ramdisk

  方法:mkinitrd initrd-$version $version

  例如:mkinitrd initrd-2.6.32 2.6.32

  通過uname -r 獲得正在啟動並執行核心版本

  *$version可以通過查詢/lib/modules下的目錄得到

  4、安裝核心

  1、cp arch/x86/boot/bzImage

  /boot/vmlinuz-$version

  2、cp initrd-$version /boot/

  3、修改/etc/grub.conf的後四行

  5、清理核心

  make clean 清理編譯核心生產的.o檔案

  make distclean 清理編譯核心生產的.o檔案和.config $version

  記憶幾個命令

  rpm -qa | grep kernel 找到核心包資訊

  rpm -e kernel-核心包名

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.