日本高清不卡中文字幕-一起草草视频在线观看-亚洲精品一区二区三区色-国产亚洲精品免费视频

您好,歡迎進入深圳市穎特新科技有限公司官方網(wǎng)站!

您現(xiàn)在的位置:首頁 新聞資訊 >> 新聞頭條 >> 全面解析Linux 內(nèi)核 3.10.x - 如何開始
新聞資訊
NEWS INFORMATION

全面解析Linux 內(nèi)核 3.10.x - 如何開始

發(fā)布時間:2019-05-22

萬事開頭難 - 如何開始?

人總是對未知的事物充滿恐懼!就像航海一樣,在面對危難的時候,船員和船長是一樣心中充滿恐懼的!只是船員始終充滿恐懼,而船長卻能壓抑恐懼并從當前找出突破口! 
我沒有船長之能,但也算入行兩年的老船員,我會追隨船長一起尋找突破口!而內(nèi)核如此龐然大物不知從何入手這真的很正常,那么應(yīng)該的入口在哪里?其實我也不知道,一千個讀者就有一千個哈姆雷特。每個人都入口的理解都不一樣,有人說是必須有著良好的C編程經(jīng)驗,有人說必須有著對Linux發(fā)行版等必要的操作經(jīng)驗,也有的人說一定要數(shù)據(jù)結(jié)構(gòu)理解的很好,還有的人說你必須的對各種架構(gòu)的匯編了如指掌!眼花撩亂的知識你又掌握了多少呢?

我列出三點

1.必須有著良好的C語言理解能力,尤其是指針(靈魂嘛) 
2.數(shù)據(jù)結(jié)構(gòu)確實的能看懂,尤其是鏈表 
3.一定要有著非常濃厚的興趣,不成魔,不成活 
第3點尤其最重要,因為興趣才是王道

 

 

假設(shè)你已經(jīng)對上述內(nèi)容有了一定的了解或者已經(jīng)是個老手了!想急需的去更深入的研究內(nèi)核! 
那么我們就開始吧!

1. 你應(yīng)該了解內(nèi)核源碼樹

頂層目錄

├── arch            --  體系架構(gòu)相關(guān)代碼,內(nèi)核支持市面上所有的主流架構(gòu)以及N多種CPU
├── block           -- 塊設(shè)備子系統(tǒng)
├── crypto          -- 加密解密庫函數(shù)
├── Documentation   -- 說明文檔
├── drivers         -- 設(shè)備驅(qū)動
├── firmware        -- 第三方設(shè)備固件
├── fs              -- 文件系統(tǒng)子系統(tǒng)(VFS)
├── include         -- 公共頭文件
├── init            -- 啟動初始化子系統(tǒng)(如掛載initrd)
├── ipc             -- 進程通信子系統(tǒng)
├── Kbuild          -- 頂層鏈接文件
├── Kconfig         -- 頂層配置配置
├── kernel          -- 內(nèi)核核心代碼(基本與架構(gòu)無關(guān),包括調(diào)度子系統(tǒng))
├── lib             -- 公共LIB庫函數(shù)
├── Makefile        -- 頂層編譯文件
├── mm              -- 內(nèi)存管理子系統(tǒng)
├── net             -- 不包括網(wǎng)絡(luò)設(shè)備驅(qū)動的網(wǎng)絡(luò)子系統(tǒng)
├── README          -- 你懂得
├── samples         -- Demo 代碼
├── scripts         -- 編譯腳本以及工具
├── security        -- 模塊安全相關(guān)(SELinux)
├── sound           -- 音頻驅(qū)動子系統(tǒng)
├── tools           -- 內(nèi)核輔助工具
├── usr             -- 用戶程序(目前只有一個用于initramfs的cpio打包程序)
└── virt            -- 虛擬化相關(guān)
├── REPORTING-BUGS  -- Bug 上報流程
├── MAINTAINERS     -- 主要維護者(向社區(qū)致敬)
├── CREDITS         -- 貢獻者(請牢記偉大的程序員)

 

內(nèi)核真是太龐大了,目前這個版本的代碼量已經(jīng)到了幾百萬行之多,那么問題來了,這么多的內(nèi)容我們應(yīng)該如何取舍?

2. Linux Kernel 核心功能一覽

Linux 核心功能分為五大子系統(tǒng)(進程管理,內(nèi)存管理,虛擬文件系統(tǒng),網(wǎng)絡(luò)子系統(tǒng),進程間通信)! 
Ps.下面是網(wǎng)上找了一張圖片 

 

  1. Process Mangement稱作進程管理or進程調(diào)度。主要負責管理CPU資源的平衡調(diào)度,搶占,異常入口等的管理。主要為了確保各個進程盡量以公平的方式來對CPU執(zhí)行調(diào)度!Ps.這里其實就要說到優(yōu)先級等相關(guān)內(nèi)容!這部分是必須要研究的一部分!
  2. Memory Manager稱作內(nèi)存管理。主要負責管理內(nèi)存資源的分配以及配額,確保各個進程任務(wù)可以放心去共享使用當前的內(nèi)存資源。此外,內(nèi)存管理也會提供虛擬內(nèi)存機制處理,該機制可以讓進程使用多于系統(tǒng)可用Memory的內(nèi)存(也就是內(nèi)存地址轉(zhuǎn)換),不用的內(nèi)存會通過文件系統(tǒng)保存在外部非易失存儲器中,需要使用的時候,再取回到內(nèi)存中。這部分也是必須要研究的一部分!
  3. IPC稱作進程間通信。它主要負責Linux系統(tǒng)中進程之間的通信,這里跟硬件無關(guān)! 這部分無需多說,必須研究!
  4. Network稱作網(wǎng)絡(luò)子系統(tǒng),主要負責管理系統(tǒng)的網(wǎng)絡(luò)設(shè)備,并實現(xiàn)多種多樣的網(wǎng)絡(luò)標準以及提供各種各樣協(xié)議的基本協(xié)議棧。這部分如果從事網(wǎng)絡(luò)領(lǐng)域可以仔細研究(難點也是在于協(xié)議棧),這部分可以了先了解!
  5. Virtual File System稱作虛擬文件系統(tǒng)。Linux內(nèi)核將不同功能的外部設(shè)備,例如Disk設(shè)備(硬盤、磁盤、NAND Flash、Nor Flash等)、輸入輸出設(shè)備、顯示設(shè)備等等,抽象為可以通過統(tǒng)一的文件操作接口(open、close、read、write等)來訪問。這部分如果從事存儲就必須要研究啦!它往往是結(jié)合塊設(shè)備驅(qū)動來進行的!
  6. SELinux/AppArmor號稱最杰出的操作系統(tǒng)安全子系統(tǒng),最早由NSA(美國國家安全局)來領(lǐng)導(dǎo)并研發(fā)的一套安全子系統(tǒng)!這部分內(nèi)容如果暫時可以先了解下!

Ps…對了,還忘了說一個非常非常重要的核心,那就是體系架構(gòu),因為我當前是Mips,所以首先的熟悉MIPS架構(gòu)中的一些最基本的處理方式,并且內(nèi)核中有很多關(guān)于MIPS的匯編以及GUN混合MIPS的偽匯編,都需要去啃啊,瞬間好頭大!深吸一口氣,慢慢來吧!這部分內(nèi)容作為整體穿插的時候在進行腦補吧。。!

3.Makefile

好吧,下一節(jié)就要進行實戰(zhàn)了,這里先腦補一下Makefile. 
Makefile作為構(gòu)建內(nèi)核的引線,穿插在各個目錄中!那么對它的語法先簡單的了解下! 
基本的 make流程 其實是根據(jù)文件的時間戳來更新(讀取Makefile) 文件的編譯工作 
從一個樣例來說明Makefile.

    main:main.o name.o age.o
           gcc main.o name.o age.o -o main
    main.o:main.c
           gcc -c main.c -o main.o
    name.o:name.c
           gcc -c name.c -o name.o
    age.o:age.c
           gcc -c age.c -o age.o
    clean:
          rm *.o main  

基本格式為: 目標生成文件名:源文件 
生成過程(得到結(jié)果) 
clean 作為方便的清除Makefike生成的編譯文件 
看上述的主文件 
main.c

    #include <stdio.h>                                                                     
    extern void name();
    extern void age();

    int main()
    {
         name();
         age();

         return 0;
    }       
    name.c
    #include <stdio.h>                                                                     

    void name()
    {
         printf("My name is Xw. \n");
    }

    age.c
    #include <stdio.h>                                                                     

    void age()
    {
         printf("My age is 22........\n");
    }
  • 直接編譯可產(chǎn)生結(jié)果。 

雜種Shell + Makefile的演變 
當我們的可編譯文件越來越多時候,那么即時可能你少了一個.o文件那也直接導(dǎo)致程序崩潰。 
所以這個時候我們的雜種Shell(其實嚴謹?shù)恼f不是shell相似而已)就有用了。我們大可以用一個變量去代替你的源文件、也可以代替我們的編譯器。如下

     CC=gcc                           //變量代替你的編譯器                                                      
     OBJS=main.o name.o age.o       //源文件
     main:$(OBJS)
             $(CC) $^ -o $@
     main.o:main.c
             $(CC) -c $^ -o $@
     name.o:name.c
             $(CC) -c $^ -o $@
     age.o:age.c
             $(CC) -c $^ -o $@
     clean:
             rm *.o main
  • 沒有出現(xiàn)的<。<這些命令以后會用到。分別先介紹一下@ 表示目標文件的完整名稱 如上述main main.o name.o age.o等 

復(fù)main.omain.c、。轉(zhuǎn)。。表示所有不重復(fù)的依賴包名稱以空格隔開如上述main.omain.c分別可以做依賴包、因為依賴和被依賴僅僅是方向不一樣。其實是可以轉(zhuǎn)化的。當然上述還可以寫成。(CC) -c OBJSomain.oOBJS−omain.o<表示第一個依賴包名稱

Ps.上述僅僅是Makefile 最基本的使用,在內(nèi)核里完全是另外一回事,但是基本語法是一樣的!

*下一節(jié)我們就開始內(nèi)核的Makefile以及其它編譯規(guī)則的分析*

聯(lián)系方式0755-82591179

傳真:0755-82591176

郵箱:vicky@yingtexin.net

地址:深圳市龍華區(qū)民治街道民治大道973萬眾潤豐創(chuàng)業(yè)園A棟2樓A08

双桥区| 隆安县| 拉萨市| 连州市| 鄂伦春自治旗| 光泽县| 正阳县| 陇川县| 靖边县| 日土县| 濮阳县| 梁山县| 朝阳区| 遵义市| 汪清县| 广汉市| 灵石县| 昭平县| 寻甸| 加查县| 北宁市| 肥城市| 阳春市| 财经| 瓦房店市| 鲁甸县| 临江市| 淮北市| 乐平市| 普安县| 元朗区| 石柱| 清苑县| 泾川县| 读书| 旅游| 云林县| 防城港市| 望谟县| 都昌县| 宁化县|