linux 架構



 

最內層是咱們的硬件,最外層是咱們經常使用的各類應用,好比說使用firefox瀏覽器,打開evolution查看郵件,運行一個計算流體模型等等。硬件是咱們的物質基礎,而應用是咱們所要奮鬥的目標,但在二者之間,還要通過一番周折。html

還記得咱們在Linux啓動的時候。首先會啓動內核 (kernel),內核是一段計算機程序,這個程序直接管理管理硬件,包括CPU、內存空間、硬盤接口、網絡接口等等。全部的計算機操做都要經過內核傳遞給硬件。程序員

 

爲了咱們方便調用內核,咱們將內核的功能總結成爲系統調用(system call)。系統調用看起來就像是的C語言函數,你也能夠在程序中直接調用。Linux系統有兩百多個這樣的系統調用。系統調用給了上層程序一個清晰的接 口,隱藏了內核的複雜結構。一個操做系統上的功能能夠看做是系統調用的組合的效果,並且一個操做系統不可能做出超越系統調用的動做。能夠說一個系統調用函 數就像是漢字的一個筆畫,任何一個漢字都要由基本的筆畫(點、橫、撇等等)構成,並且咱們不能臆造出筆畫。在命令行中輸入$man 2 syscalls能夠查看全部的系統調用。你也能夠經過$man 2 read來查看系統調用read()的說明。在這兩個命令中的2都表示咱們要在2類(系統調用類)中查詢 (具體各個類是什麼能夠經過$man man看到)。
shell

 

因爲系統調用很是基礎,因此有時使用起來很麻煩。好比說一個簡單的給變量分配內存空間的操做,就須要動用多個系統調用。Linux定義一些庫函數(library routine)來將系統調用組合成某些經常使用的功能,以方便咱們編程。好比上面的分配內存的操做,看以定義成爲一個庫函數(像malloc()這樣的函 數)。再好比說,在讀取文件的時候,系統調用要求咱們設置好所須要的緩衝。咱們這個時候可使用Standard IO庫中的讀取函數,而這個讀取函數既負責設置緩衝,又負責使用讀取的系統調用函數。使用庫函數對於機器來講並無效率上的優點,但能夠把程序員從細節中 解救出來。庫函數就像是漢字的偏旁部首,它由筆畫組成,但使用偏旁部首更容易組成字,好比"鐵"。固然,你也徹底能夠不使用庫函數,而直接調用系統函數,就像「人」字同樣,不用偏旁部首。編程

(實際上,一個操做系統要稱得上是UNIX系統,必需要擁有一些庫函數,好比ISO C標準庫,POSIX標準等。)瀏覽器

 

至於shell,能夠看做一種特殊的應用。實際上咱們以前所說的命令行,就是shell。shell是一個命令解釋器(interpreter),當咱們輸入「ls -l」的時候,它將此字符串解釋爲1) 在默認路徑找到該文件(/bin/ls),2) 執行該文件,並附帶參數"-l"。咱們以前用>表示從新定向,用|表示管道,也是經過shell進行理解&或者|的含義,再經過系統調用指揮kernel創建具體的重定向或者管道機制。在沒有圖形界面以前,shell充當了用戶的界面,當用戶要運行某些應用的時候,要經過shell輸入命令,以創建運行程序。shell能夠執行符合shell語法的文本,這樣的文本叫作shell腳本(script)。咱們能夠在圖中看到,shell下通系統調用,上通各類應用,同時還有許多自身的便利可使用,這些條件讓shell腳本能夠實現很是強大的功能。UNIX的一條哲學是讓每一個程序儘可能獨立的作好一個小的功能。而shell充當了這些小功能之間的"膠水",讓不一樣程序可以以一個清晰的接口(文本流)協同工做,從而加強各個程序的功能。(這也是咱們鼓勵多用shell,少用圖形化界面的緣由之一。)bash

(shell也有不少種,最多見的是bash, 另外還有sh, csh, tcsh, ksh。它們出現的年代不一樣,所支持的功能也有差別。)網絡

一個使用bash shell的終端模塊化

一個shell對應一個終端 (terminal)。曾經來講,終端是一個硬件設備,用來輸入並顯示輸出。現在,因爲圖形化界面的普及,終端每每就像上圖同樣,是一個圖形化的窗口。你 能夠經過這個窗口輸入或者輸出文本。這個文本直接傳遞給shell進行分析解釋,而後執行。函數

最後,咱們進入通常的應用。應用是一個程序,它能夠1) 直接調用系統函數 2) 調用庫函數 3) 運行shell script。這些應用能夠由多種語言開發(固然,最多見的是C語言),以知足咱們使用計算機的各類須要。spa

 

總結 

咱們 能夠看到,Linux利用kernel實現軟硬件的對話。經過系統調用的這個重要的接口,Linux將上層的應用與下層的kernel徹底分離開,爲程序 員隱藏了底層的複雜性(相應的,也提升了上層應用的可移植性)。當咱們在升級kernel的時候,也能夠保持系統調用的語句不變,從而讓上層應用不感覺到 下層的改變。庫函數利用系統調用創造出模塊化的功能,而shell則提供了一個用戶界面,並讓咱們能夠利用shell的語法編寫腳本,以整合程序。

而全部的這些安排也爲其餘應用的開發提供了便利。

相關文章
相關標籤/搜索