1. 程式人生 > >linux體系結構+linux核心結構+linux核心目錄結構

linux體系結構+linux核心結構+linux核心目錄結構

一、linux體系結構

(1)使用者空間:使用者空間中又包含了,使用者的應用程式,C庫

(2)核心空間:核心空間包括,系統呼叫,核心,以及與平臺架構相關的程式碼


Linux核心可以劃分為3層,最上面是系統呼叫層(SCI),它實現了一些基本的功能,such as read and write。系統呼叫介面之下是核心程式碼,可以更加精確地定義為獨立於體系結構的核心程式碼,這些程式碼是Linux所支援的所有處理器體系結構所通用的。在這些程式碼之下是依賴於體系結構的程式碼(Architecture-Depandent Kernel Code),構成通常稱為BSP(Board Support Package)的部分,這些程式碼用作給定體系結構的處理器和特定於平臺的程式碼。



    上圖展示了整個程序地址空間的分佈,其中4G的地址空間分為兩部分,在使用者空間內,對應了記憶體分佈的五個段:資料段、程式碼段、BSS段、堆、棧。

二、Linux核心結構

主要由個子系統組成:

  • 程序排程
  • 記憶體管理
  • 虛擬檔案系統
  • 網路介面
  • 程序間通訊


1)程序排程(SCHED)

       控制系統中多個程序對CPU的訪問。當需要選擇下一個程序執行時,由排程程式選擇最值得執行的程序。可執行程序實際上是僅等待CPU資源的程序,如果某個程序在等待其它資源,則該程序是不可執行程序。Linux使用了比較簡單的基於優先順序的程序排程演算法選擇新的程序。在系統執行時,每個程序都會分得一定的時間片,然後程序排程器根據時間片的不同,選擇每個程序依次執行,例如當某個程序的時間片用完後,排程器會選擇一個新的程序繼續執行。由於切換的時間和頻率都非常的快,由此使用者感覺是多個程式在同時執行,而實際上,CPU在同一時間內只有一個程序在執行,這一切都是程序排程管理的結果。使得多個程序“微觀序列,巨集觀並行”

地執行。

(2)記憶體管理(MMU)

       記憶體管理的主要作用是控制多個程序安全地共享記憶體區域。當CPU提供記憶體管理單元(MMU)時,Linux記憶體管理完成為每個程序進行虛擬記憶體到實體記憶體的轉換。Linux 2.6引入了對無MMU CPU的支援。

       一般而言,Linux的每個程序享有4GB的記憶體空間,0~3GB屬於使用者空間,3~4GB屬於核心空間,核心空間對常規記憶體、I/O裝置記憶體以及高階記憶體存在不同的處理方式。

(3)虛擬檔案系統(VFS)

       隱藏了各種硬體的具體細節,為所有的裝置提供了統一的介面,VFS提供了多達數十種不同的檔案系統。虛擬檔案系統可以分為邏輯檔案系統和裝置驅動程式。邏輯檔案系統指Linux所支援的檔案系統,如ext2,fat等,裝置驅動程式指為每一種硬體控制器所編寫的裝置驅動程式模組。

(4)網路介面(NET)

       提供了對各種網路標準的存取和各種網路硬體的支援。網路介面可分為網路協議和網路驅動程式。網路協議部分負責實現每一種可能的網路傳輸協議。網路裝置驅動程式負責與硬體裝置通訊,每一種可能的硬體裝置都有相應的裝置驅動程式。

(5)程序間通訊(IPC) 

       程序通訊支援程序間的通訊,Linux支援程序間的多種程序的通訊機制,包含訊號量、共享記憶體、管道等。這些機制可協助多個程序、多資源的互斥訪問、程序間的同步和訊息傳遞。

程序間通訊主要用於控制不同程序之間在使用者空間的同步、資料共享和交換。由於不用的使用者程序擁有不同的程序空間,因此程序間的通訊要藉助於核心的中轉來實現。一般情況下,當一個程序等待硬體操作完成時,會被掛起。當硬體操作完成,程序被恢復執行,而協調這個過程的就是程序間的通訊機制。

各個子系統之間的依賴關係如下:
1.程序排程與記憶體管理之間的關係:這兩個子系統互相依賴。在多道程式環境下,程式要執行必須為之建立程序,而建立程序的第一件事情,就是將程式和資料裝入記憶體。
2.程序間通訊與記憶體管理的關係:程序間通訊子系統要依賴記憶體管理支援共享記憶體通訊機制,這種機制允許兩個程序除了擁有自己的私有空間,還可以存取共同的記憶體區域。
3.虛擬檔案系統與網路介面之間的關係:虛擬檔案系統利用網路介面支援網路檔案系統(NFS),也利用記憶體管理支援RAMDISK裝置。
4.記憶體管理與虛擬檔案系統之間的關係:記憶體管理利用虛擬檔案系統支援交換,交換程序(swapd)定期由排程程式排程,這也是記憶體管理依賴於程序排程的唯一原因。當一個程序存取的記憶體對映被換出時,記憶體管理向檔案系統發出請求,同時,掛起當前正在執行的程序。

處於中心位置的程序排程,所有其它的子系統都依賴它,因為每個子系統都需要掛起或恢復程序。一般情況下,當一個程序等待硬體操作完成時,它被掛起;當操作真正完成時,程序被恢復執行。例如,當一個程序通過網路傳送一條訊息時,網路介面需要掛起傳送程序,直到硬體成功成功地完成訊息的傳送,當訊息被成功的傳送出去以後,網路介面給程序返回一個程式碼,表示操作的成功或失敗。其他子系統以相似的理由依賴於程序排程。

1、系統呼叫介面

SCI層(system callinterface)為使用者空間提供了一套標準的系統呼叫函式來訪問Linux核心,搭起了使用者空間到核心空間的橋樑

2、程序管理

程序管理的重點是建立程序(fork、exec),停止程序(kill、exit),並控制它們之間的通訊(signal或者POSIX)。程序管理還包括控制活動程序如何共享CPU,即程序排程

3、記憶體管理

記憶體管理的主要作用是控制多個程序安全地共享記憶體區域

4、網路協議棧

核心協議棧為Linux提供了豐富的網路協議的實現

5、虛擬檔案系統(VFS)

VFS隱藏各種檔案系統的具體細節,為檔案操作提供統一的介面

6、裝置驅動

Linux核心中有大量程式碼都在裝置驅動程式中,它們控制特定的硬體裝置

7、CPU體系結構相關程式碼

存放支援各個CPU的程式碼

三、核心目錄結構



/: 根目錄,一般根目錄下只存放目錄,不要存放檔案,/etc、/bin、/dev、/lib、/sbin應該和根目錄放置在一個分割槽中
/bin:/usr/bin: 可執行二進位制檔案的目錄,如常用的命令ls、tar、mv、cat等。
/boot: 放置linux系統啟動時用到的一些檔案。/boot/vmlinuz為linux的核心檔案,以及/boot/gurb。建議單獨分割槽,分割槽大小100M即可
/dev: 存放linux系統下的裝置檔案,訪問該目錄下某個檔案,相當於訪問某個裝置,常用的是掛載光碟機mount /dev/cdrom /mnt。
/etc: 系統配置檔案存放的目錄,不建議在此目錄下存放可執行檔案,重要的配置檔案有/etc/inittab、/etc/fstab、/etc/init.d、/etc/X11、/etc/sysconfig、/etc/xinetd.d修改配置檔案之前記得備份。注:/etc/X11存放與x windows有關的設定。
/home: 系統預設的使用者家目錄,新增使用者賬號時,使用者的家目錄都存放在此目錄下,~表示當前使用者的家目錄,~test表示使用者test的家目錄。建議單獨分割槽,並設定較大的磁碟空間,方便使用者存放資料
/lib:/usr/lib:/usr/local/lib: 系統使用的函式庫的目錄,程式在執行過程中,需要呼叫一些額外的引數時需要函式庫的協助,比較重要的目錄為/lib/modules。
/lost+fount: 系統異常產生錯誤時,會將一些遺失的片段放置於此目錄下,通常這個目錄會自動出現在裝置目錄下。如載入硬碟於/disk 中,此目錄下就會自動產生目錄/disk/lost+found
/mnt:/media: 光碟預設掛載點,通常光碟掛載於/mnt/cdrom下,也不一定,可以選擇任意位置進行掛載。
/opt: 給主機額外安裝軟體所擺放的目錄。如:FC4使用的Fedora 社群開發軟體,如果想要自行安裝新的KDE 桌面軟體,可以將該軟體安裝在該目錄下。以前的 Linux 系統中,習慣放置在 /usr/local 目錄下
/proc: 此目錄的資料都在記憶體中,如系統核心,外部裝置,網路狀態,由於資料都存放於記憶體中,所以不佔用磁碟空間,比較重要的目錄有/proc/cpuinfo、/proc/interrupts、/proc/dma、/proc/ioports、/proc/net/*等
/root: 系統管理員root的家目錄,系統第一個啟動的分割槽為/,所以最好將/root和/放置在一個分割槽下。
/sbin:/usr/sbin:/usr/local/sbin: 放置系統管理員使用的可執行命令,如fdisk、shutdown、mount等。與/bin不同的是,這幾個目錄是給系統管理員root使用的命令,一般使用者只能"檢視"而不能設定和使用。
/tmp: 一般使用者或正在執行的程式臨時存放檔案的目錄,任何人都可以訪問,重要資料不可放置在此目錄下
/srv: 服務啟動之後需要訪問的資料目錄,如www服務需要訪問的網頁資料存放在/srv/www內
/usr: 應用程式存放目錄,/usr/bin 存放應用程式, /usr/share 存放共享資料,/usr/lib 存放不能直接執行的,卻是許多程式執行所必需的一些函式庫檔案。/usr/local:存放軟體升級包。/usr/share/doc: 系統說明檔案存放目錄。/usr/share/man: 程式說明檔案存放目錄,使用 man ls時會查詢/usr/share/man/man1/ls.1.gz的內容建議單獨分割槽,設定較大的磁碟空間
/var: 放置系統執行過程中經常變化的檔案,如隨時更改的日誌檔案
 /var/log,/var/log/message: 所有的登入檔案存放目錄,/var/spool/mail: 郵件存放的目錄, /var/run: 程式或服務啟動

後,其PID存放在該目錄下。建議單獨分割槽,設定較大的磁碟空間
   
------------------------------------------ 

/dev: 目錄
  dev是裝置(device)的英文縮寫。/dev這個目錄對所有的使用者都十分重要。因為在這個目錄中包含了所有Linux系統中使用的外部裝置。但是這裡並不是放的外部裝置的驅動程式,這一點和

windows,dos作業系統不一樣。它實際上是一個訪問這些外部裝置的埠。我們可以非常方便地去訪問這些外部裝置,和訪問一個檔案,一個目錄沒有任何區別。

  Linux沿襲Unix的風格,將所有裝置認成是一個檔案。

  裝置檔案分為兩種:塊裝置檔案(b)和字元裝置檔案(c)

  裝置檔案一般存放在/dev目錄下,對常見裝置檔案作如下說明:

  /dev/hd[a-t]:IDE裝置

  /dev/sd[a-z]:SCSI裝置

  /dev/fd[0-7]:標準軟碟機

  /dev/md[0-31]:軟raid裝置

  /dev/loop[0-7]:本地迴環裝置

  /dev/ram[0-15]:記憶體

  /dev/null:無限資料接收裝置,相當於黑洞

  /dev/zero:無限零資源

  /dev/tty[0-63]:虛擬終端

  /dev/ttyS[0-3]:串列埠

  /dev/lp[0-3]:並口

  /dev/console:控制檯

  /dev/fb[0-31]:framebuffer

  /dev/cdrom => /dev/hdc

  /dev/modem => /dev/ttyS[0-9]

  /dev/pilot => /dev/ttyS[0-9]

  /dev/random:隨機數裝置

  /dev/urandom:隨機數裝置

  (PS:隨機數裝置,後面我會再寫篇部落格總結一下)

  /dev目錄下的節點是怎麼建立的?

  devf或者udev會自動幫你建立得。

  kobject是sysfs檔案系統的基礎,udev通過監測、檢測sysfs來獲取新建立的裝置的。

------------------------------------------ 

/etc: 目錄

  包含很多檔案.許多網路配置檔案也在/etc 中. 
/etc/rc   or /etc/rc.d   or /etc/rc*.d  
  啟動、或改變執行級時執行的scripts或scripts的目錄.
/etc/passwd  
  使用者資料庫,其中的域給出了使用者名稱、真實姓名、家目錄、加密的口令和使用者的其他資訊. 
/etc/fstab  
  啟動時mount -a命令(在/etc/rc 或等效的啟動檔案中)自動mount的檔案系統列表. Linux下,也包括用swapon -a啟用的swap區的資訊.
/etc/group   
  類似/etc/passwd ,但說明的不是使用者而是組. 
/etc/inittab  
  init 的配置檔案. 
/etc/issue  
  getty 在登入提示符前的輸出資訊.通常包括系統的一段短說明或歡迎資訊.內容由系統管理員確定. 
/etc/motd  
  Message Of The Day,成功登入後自動輸出.內容由系統管理員確定.經常用於通告資訊,如計劃關機時間的警告. 
/etc/mtab  
  當前安裝的檔案系統列表.由scripts初始化,並由mount 命令自動更新.需要一個當前安裝的檔案系統的列表時使用,例如df 命令. 
/etc/shadow  
  在安裝了影子口令軟體的系統上的影子口令檔案.影子口令檔案將/etc/passwd 檔案中的加密口令移動到/etc/shadow 中,而後者只對root可讀.這使破譯口令更困難. 
/etc/login.defs  
  login 命令的配置檔案. 
/etc/printcap  
  類似/etc/termcap ,但針對印表機.語法不同. 
/etc/profile , /etc/csh.login , /etc/csh.cshrc  
  登入或啟動時Bourne或C shells執行的檔案.這允許系統管理員為所有使用者建立全域性預設環境. 
/etc/securetty  
  確認安全終端,即哪個終端允許root登入.一般只列出虛擬控制檯,這樣就不可能(至少很困難)通過modem或網路闖入系統並得到超級使用者特權. 
/etc/shells  
  列出可信任的shell.chsh 命令允許使用者在本檔案指定範圍內改變登入shell.提供一臺機器FTP服務的服務程序ftpd 檢查使用者shell是否列在 /etc/shells 檔案中,如果不是將不允許該使用者登入. 
/etc/sysconfig 
  網路配置相關目錄

------------------------------------------ 

/proc: 目錄

檔名    檔案內容
/proc/cmdline     載入 kernel 時所下達的相關引數!查閱此檔案,可瞭解系統是如何啟動的!
/proc/cpuinfo     本機的 CPU 的相關資訊,包含時脈、型別與運算功能等
/proc/devices     這個檔案記錄了系統各個主要裝置的主要裝置代號,與 mknod 有關呢!
/proc/filesystems     目前系統已經載入的檔案系統羅!
/proc/interrupts     目前系統上面的 IRQ 分配狀態。
/proc/ioports     目前系統上面各個裝置所配置的 I/O 位址。
/proc/kcore     這個就是記憶體的大小啦!好大對吧!但是不要讀他啦!
/proc/loadavg     還記得 top 以及 uptime 吧?沒錯!上頭的三個平均數值就是記錄在此!
/proc/meminfo     使用 free 列出的記憶體資訊,嘿嘿!在這裡也能夠查閱到!
/proc/modules     目前我們的 Linux 已經載入的模組列表,也可以想成是驅動程式啦!
/proc/mounts     系統已經掛載的資料,就是用 mount 這個命令呼叫出來的資料啦!
/proc/swaps     到底系統掛載入的記憶體在哪裡?呵呵!使用掉的 partition 就記錄在此啦!
/proc/partitions     使用 fdisk -l 會出現目前所有的 partition 吧?在這個檔案當中也有紀錄喔!
/proc/pci     在 PCI 匯流排上面,每個裝置的詳細情況!可用 lspci 來查閱!
/proc/uptime     就是用 uptime 的時候,會出現的資訊啦!
/proc/version     核心的版本,就是用 uname -a 顯示的內容啦!
/proc/bus/*     一些匯流排的裝置,還有 U盤 的裝置也記錄在此喔!

------------------------------------------ 

/usr: 目錄
  /usr 檔案系統經常很大,因為所有程式安裝在這裡. /usr 裡的所有檔案一般來自Linux distribution;本地安裝的程式和其他東西在/usr/local 下.這樣可能在升級新版系統或新distribution時無須重新安裝全部程式.
/usr/etc            存放設定檔案
/usr/games      存放遊戲和教學檔案
/usr/include      存放C開發工具的標頭檔案
/usr/share         存放結構獨立的資料
/usr/bin  
  幾乎所有使用者命令.有些命令在/bin 或/usr/local/bin 中.
/usr/sbin  
  根檔案系統不必要的系統管理命令,例如多數服務程式.  
/usr/share/man , /usr/share/info , /usr/share/doc   
  手冊頁、GNU資訊文件和各種其他文件檔案.  
/usr/include  
  C程式語言的標頭檔案.為了一致性這實際上應該在/usr/lib 下,但傳統上支援這個名字.
/usr/lib  
  程式或子系統的不變的資料檔案,包括一些site-wide配置檔案.名字lib來源於庫(library); 程式設計的原始庫存在/usr/lib 裡.  
/usr/local  
  本地安裝的軟體和其他檔案放在這裡.  
/usr/src             存放程式的原始碼


------------------------------------------ 

/var: 目錄
  /var 包括系統一般執行時要改變的資料.每個系統是特定的,即不通過網路與其他計算機共享.  
/var/catman  
  當要求格式化時的man頁的cache.man頁的原始檔一般存在/usr/man/man* 中;有些man頁可能有預格式化的版本,存在/usr/man/cat* 中.而其他的man頁在第一次看時需要格式化,格式化完的版本存在/var/man 中,這樣其他人再看相同的頁時就無須等待格式化了. (/var/catman 經常被清除,就象清除臨時目錄一樣.)  
/var/lib  
  系統正常執行時要改變的檔案.  
/var/local  
  /usr/local 中安裝的程式的可變資料(即系統管理員安裝的程式).注意,如果必要,即使本地安裝的程式也會使用其他/var 目錄,例如/var/lock .  
/var/lock  
  鎖定檔案.許多程式遵循在/var/lock 中產生一個鎖定檔案的約定,以支援他們正在使用某個特定的裝置或檔案.其他程式注意到這個鎖定檔案,將不試圖使用這個裝置或檔案.  
/var/log  

  各種程式的Log檔案,特別是login  (/var/log/wtmp log所有到系統的登入和登出) 和syslog (/var/log/messages 裡儲存所有核心和系統程式資訊. /var/log 裡的檔案經常不確定地增長,應該定期清除.  
/var/run  

  儲存到下次引導前有效的關於系統的資訊檔案.例如, /var/run/utmp 包含當前登入的使用者的資訊.
/var/spool  
  mail, news, 列印佇列和其他佇列工作的目錄.每個不同的spool在/var/spool 下有自己的子目錄,例如,使用者的郵箱在/var/spool/mail 中.  
/var/tmp  

  比/tmp 允許的大或需要存在較長時間的臨時檔案. (雖然系統管理員可能不允許/var/tmp 有很舊的檔案.) 


------------------------------------------ 


 比較重要的目錄 

    在 Linux 系統中,有幾個目錄是特別需要注意的,以下提供幾個需要注意的目錄,以及預設相關的用途: 
        /etc: 這個目錄相當重要,如前所述,你的開機與系統資料檔案均在這個目錄之下,因此當這個目錄被破壞,那你的系統大概也就差不多該死掉了!而在往後的檔案中,你會發現我們常常使用這個目錄下的 /etc/rc.d/init.d 這個子目錄,因為這個 init.d 子目錄是開啟一些 Linux 系統服務的 scripts (可以想成是批次檔 )的地方。而在 /etc/rc.d/rc.local 這個檔案是開機的執行檔。 
        /bin, /sbin, /usr/bin, /usr/sbin: 這是系統預設的執行檔案的放置目錄,例如 root 常常使用的 userconf, netconf, perl, gcc, c++ 等等的資料都放在這幾個目錄中,所以如果你在提示字元下找不到某個執行檔時,可以在這四個目錄中查一查!其中, /bin, /usr/bin 是給系統使用者使用的指令,而 /sbin, /usr/sbin 則是給系統管理員使用的指令!   
        /usr/local: 這是系統預設的讓你安裝你後來升級的套件的目錄。例如,當你發現有更新的 Web 套件(如 Apache )可以安裝,而你又不想以 rpm 的方式升級你的套件,則你可以將 apache 這個套件安裝在 /usr/local 底下。安裝在這裡有個好處,因為目前大家的系統都是差不多的,所以如果你的系統要讓別人接管的話,也比較容易上手呀!也比較容易找的到資料喔!因此,如果你有需要的話,通常我都會將 /usr/local/bin 這個路徑加到我的 path 中。 
        /home: 這個是系統將有賬號的人口的家目錄設定的地方。     
        /var: 這個路徑就重要了!不論是登入、各類服務的問題發生時的記錄、以及常態性的服務記錄等等的記錄目錄,所以當你的系統有問題時,就需要來這個目錄記錄的檔案資料中察看問題的所在囉!而 mail 的預設放置也是在這裡,所以他是很重要的     
        /usr/share/man, /usr/local/man: 這兩個目錄為放置各類套件說明檔的地方,例如你如果執行 man man,則系統會自動去找這兩個目錄下的所有說明檔案