新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 解密:Linux內核是如何工作的

        解密:Linux內核是如何工作的

        作者: 時間:2011-05-10 來源:網絡 收藏

        本文發表于Linux Format magazine雜志,作者從技術深度上解釋了Linux Kernel是的。相信對Linux開發者來說有不小的幫助。

        牛津字典中對kernel一詞的定義是:較軟的、通常是一個堅果可食用的部分。當然還有第二種定義:某個東西核心或者最重要的部分。對Linux來說,它的Kernel無疑屬于第二種解釋。讓我們來看看這個重要的東西是的,先從一點理論說起。

        廣義地來說kernel就是一個軟件,它在硬件和運行在計算機上的應用程序之間提供了一個層。嚴格點從計算機科學的角度來說,Linux中的Kernel指的是Linus Torvalds在90年代初期寫的那點代碼。

        所有的你在Linux各版本中看到的其他東西--Bash shell、KDE窗口管理器、web瀏覽器、X服務器、Tux Racer以及所有的其他,都不過是運行在Linux上的應用而已,而不是操作系統自身的一部分。為了給大家一個更加直觀的感覺,我來舉個例子,比如RHEL5的安裝大概要占據2.5GB的硬盤空間(具體多大當然視你的選擇安裝來定),在這其中,kernel以及它的各個模塊組件,只有47MB,所占比例約為2%。

        在kernel內部

        那么kernel到底是的呢?如下面的圖表。Kernel通過許多的進入端口也就是我們從技術角度所說的系統調用,來使得運行在它上面的應用程序可用。Kernel使用的系統調用比如讀和寫來提供你硬件的抽象(abstraction)。

        #FormatImgID_0#

        從程序員的視角來看,這些看起來只是普通的功能調用,然而實際上系統調用在處理器的操作模式上,從用戶空間到Kernel空間有一個明顯的切換。同時,系統調用提供了一個Linux虛擬機,可以被認為是對硬件的抽象。

        Kernel提供的更明顯的抽象之一是文件系統。舉例來說,這里有一段短的程序是用C寫的,它打開了一個文件并將內容拷貝到標準的輸出:

        #include fcntl.h>
        int main()
        {
        int fd, count; char buf[1000];
        fd=open(mydata, O_RDONLY);
        count = read(fd, buf, 1000);
        write(1, buf, count);
        close(fd);
        }

        在這里,你可以看到四個系統調用的例子:打開、讀、寫和關閉。不談這段程序語法的細節,重點是:通過這些系統調用Linux Kernel提供了一個文件的錯覺,而實際上它不過是一堆數據有了個名字,這樣一來你就不必去與硬件底層的堆棧、分區、頭和指針、分區等交涉了,而是直接以例子中的方式與硬件交流,這也就是我們所說的抽象(abstraction),將底層的東西以更易懂的方式表達出來。

        臺前幕后

        系統文件是Kernel提供的較為明顯的一種抽象。還有一些特性不是這么的明顯,比如進程調度。任何一個時間,都可能有好幾個進程或者程序等待著運行。Kernel的時間調度給每個進程分配CPU時間,所以就一段時間內來說,我們會有種錯覺:電腦同一時間運行好幾個程序。這是另外一個C程序:

        #include stdlib.h>
        main()
        {
        if (fork()) {
        write(1, Parentn, 7);
        wait(0);
        exit(0);
        }
        else {
        write(1, Childn, 6);
        exit(0);
        }
        }

        在這個程序中創建了一個新進程,而原來的進程(父進程)和新進程(子進程)都編寫了標準輸出然后結束。注意系統調用fork(), exit() 以及 wait()執行程序的創建、結束和各自同步。這是進程管理和調度中最典型的簡單調用。

        Kernel還有一個更加不易見到的功能,連程序員都不易察覺,那就是存儲管理。每個程序運行得都好像它有個自己的地址空間來調用一樣,實際上它跟其他進程一樣共享計算機的物理存儲,如果系統運行的存儲過低,它的地址空間甚至會被磁盤的交互區暫時寄用。存儲管理的另外一個方面是防止一個進程訪問其他進程的地址空間--對于多進程操作系統來說這是很必要的一個防范措施。

        Kernel同樣還配置網絡鏈接協議比如IP、TCP和UDP等,它們在網絡上提供機器對機器(machine-to-machine)和進程對進程(process-to-process)的通信。這里又會造成一種假象,即TCP在兩個進程之間提供了一個固定連接--就好像連接兩個電話的銅線一樣,實際中卻并沒有固定的連接,特殊的引用協議比如FTP、DNS和HTTP是通過用戶級程序來實施的,而并非Kernel的一部分。

        Linux(像之前的Unix)在安全方面口碑很好,這是因為Kernel跟蹤記錄了每個運行進程的user ID和group ID,每次當一個應用企圖訪問資源(比如打開一個文件來寫入)的時候,Kernel就會核對文件上的訪問許可然后做出允許/禁止的命令。這種訪問控制模式最終對整個Linux系統的安全作用很大。

        Kernel還提供了一大套模塊的集合,其功能包括如何處理與硬件設備交流的諸多細節、如何從磁盤讀取一個分區、如果從網絡接口卡獲取數據包等。有時我們稱這些為設備驅動。

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)

        上一頁 1 2 3 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 府谷县| 宝山区| 宜君县| 乡宁县| 宜兰市| 攀枝花市| 曲阜市| 涿鹿县| 博湖县| 芦溪县| 金山区| 剑川县| 油尖旺区| 西峡县| 仁化县| 威远县| 盐津县| 泽库县| 马边| 无极县| 泽普县| 聂拉木县| 阳高县| 宁蒗| 固原市| 遂宁市| 婺源县| 杭州市| 景谷| 淅川县| 瑞金市| 英吉沙县| 平阴县| 乐亭县| 文登市| 柞水县| 如东县| 秭归县| 鲁甸县| 巴林右旗| 滦平县|