Linux核心入門(一)——體系架構

來源:互聯網
上載者:User

Linux是一套免費使用和自由傳播的類Unix作業系統,它最先用於基於x86系列CPU的電腦上。這個系統是由世界各地的成千上萬的程式員設計和實現的。其目的是建立不受任何商品化軟體的著作權制約的、全世界都能自由使用的Unix相容產品。

我們不去介紹作業系統的曆史了,也不管作業系統這門學科上對作業系統的分類了,閑話少說,Linux作業系統只是一個非常新的作業系統。它不拘泥於某種特定的作業系統類型,從核心上講,它是一個分時作業系統,但又具備即時作業系統的特性;從體繫上講,它是一個單核心作業系統,但又具備模組化的微核心特徵;它支援各種網際協議,所以又是一個網路作業系統;它支援大規模叢集、格線運算,甚至現在還有人在它上面架設雲端運算、雲端儲存等環境,所以它又是一個分布式作業系統……

不管怎麼說,Linux的開源性質決定了世界上各式各樣的人可以按照自己的需求去發展它、完善它,於是乎Linux就具備了高效能、高可用、可擴充、可移植等多種特性。

當今IT業界,小到嵌入式、手機、PC機,大到大規模叢集、網格、雲,都能看到Linux的身影。本人寫一系列瘋狂Linux核心博文的目的,就是讓廣大的中國同胞瞭解到這一偉大作業系統的內部真實面貌,讓你感受到它為什麼偉大。

Linux是一個作業系統,也是一個軟體。既然一個軟體,肯定就要遵循所有軟體的特點,那就是其本質=演算法+資料結構+文檔。本文就從他的架構入手,一步步進入其內部。

1 Linux體繫結構

 

 

上面就是一幅我認為還比較完美的Linux架構圖。我們可以看見,使用者使用到的應用程式,最終會通過中斷的形式訪問核心。詳細一點描述就是:應用程式向核心發出系統調用這一特殊中斷,隨後包含該程式的進程又使用者態進入核心態,就可以訪問核心提供的各式各樣的函數和資料結構了。更具體的描述我們隨後再細說,先來介紹一些概念吧:

“檔案”和“進程”是Linux核心中的兩個最基底實體和中心概念,Linux系統的所有操作都是以這兩者為基礎的。整個系統核心由以下五個部分組成:
① 虛擬檔案系統:檔案管理和磁碟快取管理(節點和空間管理)
② I/O裝置管理:塊裝置驅動(隨機存取裝置)、原始裝置(raw裝置,字元裝置,裸裝置)
③ 進程式控制制:進程的調度、同步和通訊
④ 儲存管理:在主存與CPU二級儲存之間對程式進行搬遷
⑤ 網際協議棧:實現各式各樣的網路通訊協定。

 

2 一般程式的執行

 

一個進程在執行系統調用exec期間(exec("命令名",參數)),就把可執行檔裝入本進程的三個地區中:
      ·本文區:對應可執行檔的本文段
      ·資料區:對應可執行檔的資料標識段
      ·堆棧區:建立立的進程工作區

堆棧是一個重要的概念,其主要用於傳遞參數,保護現場,存放返回地址以及為局部動態變數提供儲存區。我們後面的博文將會重點討論這個,因為堆棧這個東西太重要了。

 

進程在核心態下運行時的工作區為核心棧,在使用者態下運行時的工作區為使用者棧。核心棧和使用者棧不能交叉使用。

來,我們來看一個程式,使用者在標準終端上敲入:copy oldfile newfile。此處,oldfile 是一個現存檔案名稱,而 newfile 是一個新檔案名稱。有:(其中,變數version是初始化資料;數組buffer是未初始化的資料)

 

#include <fcntl.h>
char buffer[2048];
int version=1;

main(int argc, char *argv[])   /*系統引用main時需要提供argc作為表argv中的 */
{                              /*參數,並且對數組argv的每個成員賦初值,   */
      int fdold, fdnew;        /*對照命令:argv[0]指向字串copy;        */
      if(argc != 3)            /*argv[1]指向字串oldfile;               */
      {                        /*argv[2]指向字串newfile;               */
            printf(“need 2 arguments for copy program/n”);
            exit(1);
      }
      fdold = open(argv[1], O_RDONLY);  /* 開啟源檔案唯讀 */
      if (fdold == -1)
      {
            printf(“cannot open file %s/n”, argv[1]);
            exit(1);
      }
      fdnew = creat(argv[2], 0666);     /* 建立可為所有使用者讀寫的目標檔案 */
      if(fdnew == -1)
      {
            printf(“cannot create file %s/n”, argv[2]);
            exit(1);
      }
      copy(fdold, fdnew);
      exit(0);
}
copy(int old, int new)
{
      int count;
      while((count = read(old, buffer, sizeof(buffer))) > 0)
            write(new, buffer, count);
}

 

當main被調用時,main中的參數argc和argv、變數fdold、fdnew及相關函數地址資訊就會被壓棧;並且無論何時,遇到下一個函數(本例中是 copy 函數),其參數和變數以及相關地址也會被壓棧:(假設程式不進入三個IF程式段中的堆棧過程,其實IF後也有個壓棧的過程,我們省略了,但千萬別以為沒有)

 

 

 

我們看到:Linux的進程工作在兩種狀態——核心態(kernel mode)和使用者態(user mode)。 所以,Linux系統的核心棧和使用者棧是分開的。使用者棧儲存的是程式中的一般函數和系統調用函數相關資訊,對使用者是可見的; 核心棧儲存的是核心中的函數或資料,如getblk函數等,對使用者是透明的。

那麼,程式什麼時候使用使用者棧,什麼時候使用核心棧呢?且聽下回分解。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.