第1章 計算機基礎
1.1 什么是計算機
計算機是個籠統的概念,泛指一切計算功能的機器。這樣扯的話,以前的算盤也是計算機了。我們現在的計算機應該稱作電子計算機,我天朝人民稱為電腦。聽說谷歌在研究量子計算機,完全不懂是什么玩意。
一不小心在百度百科看到還有光子計算機,生物計算機,嚇我一跳,趕緊復制鏈接過來,自己慢慢看《百度百科—-計算機》
計算機發明者約翰·馮·諾依曼
第一臺電子計算機誕生:1946年2月14日 ENIAC(中文名:埃尼阿克)
1.2 計算機組成
我們現在通常理解為計算機是由硬件系統+軟件系統組成的,根據馮·諾依曼體系結構。計算機主要由五大部件組成:
運算器(Datapath): 計算機中執行各種算術和邏輯運算操作的部件
控制器(Control):是整個計算機的中樞神經,其功能是對程序規定的控制信息進行解釋,根據其要求進行控制,調度程序、數據、地址,協調計算機各部分工作及內存與外設的訪問等
存儲器(Memory):存儲器的功能是存儲程序、數據和各種信號、命令等信息,并在需要時提供這些信息。
輸入設備(Input system):輸入設備是計算機的重要組成部分,輸入設備與輸出設備合稱為外部設備,簡稱外設,輸入設備的作用是將程序、原始數據、文字、字符、控制命令或現場采集的數據等信息輸入到計算機。常見的輸入設備有鍵盤、鼠標器、光電輸入機、磁帶機、磁盤機、光盤機等。
輸出設備(Output system):輸出設備與輸入設備同樣是計算機的重要組成部分,它把外算機的中間結果或最后結果、機內的各種數據符號及文字或各種控制信號等信息輸出出來。微機常用的輸出設備有顯示終端CRT、打印機、激光印字機、繪圖儀及磁帶、光盤機等
前面這些有些虛無縹緲(ps:就是太過于抽象),看看五大部件具體對應的看的見摸的著的事物:
運算器+控制器=======》CPU
存儲器=========》內存(memory)
輸入設備=========》鍵盤鍵盤、鼠標……
輸出設備=======》顯示器……….
1.3 計算機部件之間的通信
如果說主板(Mother Board)是一座城市,那么總線就像是城市里的公共汽車(bus),能按照固定行車路線,傳輸來回不停運作的比特(bit)。這些線路在同一時間內都僅能負責傳輸一個比特
總線(Bus)是計算機各種功能部件之間傳送信息的公共通信干線,它是由導線組成的傳輸線束, 按照計算機所傳輸的信息種類,計算機的總線可以劃分為數據總線、地址總線和控制總線,分別用來傳輸數據、數據地址和控制信號。
總線是一種內部結構,它是cpu、內存、輸入、輸出設備傳遞信息的公用通道,主機的各個部件通過總線相連接,外部設備通過相應的接口電路再與總線相連接,從而形成了計算機硬件系統
1.4 cpu
中央處理器(CPU,Central Processing Unit)是一塊超大規模的集成電路,是一臺計算機的運算核心(Core)和控制核心( Control Unit)。它的功能主要是解釋計算機指令以及處理計算機軟件中的數據。
詳解請參考百度百科CPU
CPU指令集的作用:
指令集是存儲在CPU內部,對CPU運算進行指導和優化的硬程序。擁有這些指令集,CPU就可以更高效地運行。Intel有x86,x86-64,MMX,SSE,SSE2,SSE3,SSSE3 (Super SSE3),SSE4.1,SSE4.2和針對64位桌面處理器的EM-64T。AMD主要是3D-Now!指令集。對電腦下達的每一個命令都需要CPU根據預先設定好的某一條指令來完成。 這些預先設定好的指令是預存在CPU中的。CPU依靠外來指令“激活”自己內存的指令,來計算和操控電腦。 每款CPU在設計時就規定了一系列與電腦其它部件相配合的指令系統。 預先存儲的指令越多,CPU越“聰明”。可以做的“動作”越多。預先存儲的指令越先進,CPU就越高級。多個指令集中在一起,通常叫指令集,這就是指令集的作用!
CPU的指令級別(RING0,RING1,RING2,RING3):
這得從CPU指令系統(用于控制CPU完成各種功能的命令)的特權級別說起。在CPU的所有指令中,有一些指令是非常危險的,如果錯用,將導致整個系統崩潰。比如:清內存、設置時鐘等。如果所有的程序都能使用這些指令,那么你的系統一天死機n回就不足為奇了。所以,CPU將指令分為特權指令和非特權指令(用戶指令),對于那些危險的指令,只允許操作系統及其相關模塊使用,普通的應用程序只能使用那些不會造成災難的指令。形象地說,特權指令就是那些兒童不宜的東東,而非特權指令則是老少皆宜。
CPU將特權級別分為4個級別:RING0,RING1,RING2,RING3。只使用其中的兩個級別RING0和RING3,RING0只給操作系統用,RING3誰都能用。如果普通應用程序企圖執行RING0指令,只能提交操作系統來完成執行。
CPU架構類型:
x86
x64
arm (ARM)
m68000, m68k
power (IBM)
powerpc
ultrasparc
alpha
Itanium 安騰 (IA-64/32)
CPU南北橋:
南橋:低速
北橋:高速
1.5 memory
存儲器的主要功能是存儲程序和各種數據,并能在計算機運行過程中高速、自動地完成程序或數據的存取。存儲器是具有“記憶”功能的設備
計算機中的存儲器按用途存儲器可分為主存儲器(內存)和輔助存儲器(外存),也有分為外部存儲器和內部存儲器的分類方法。外存通常是磁性介質或光盤等,能長期保存信息。內存指主板上的存儲部件,用來存放當前正在執行的數據和程序,但僅用于暫時存放程序和數據,關閉電源或斷電,數據會丟失。
1.6 IO
I/O輸入/輸出(Input/Output),分為IO設備和IO接口兩個部分。IO與外部部件交互,常見的硬盤,網卡
五大部件里面都有緩存機制
cache is king (緩存為王)
各部件容量與速度性能關系:
第2章 操作系統基礎
2.1 什么是操作系統
(Operating System,簡稱OS)是管理和控制計算機硬件與軟件資源的計算機程序,是直接運行在“裸機”上的最基本的系統軟件,任何其他軟件都必須在操作系統的支持下才能運行。操作系統是用戶和計算機的接口,同時也是計算機硬件和其他軟件的接口
其實操作系統屬于一種監控程序。真正的含義就是kernel,我們已經習慣的認為操作系統=內核+應用程序
2.2 程序與編程語言相關基礎
2.2.1 什么是程序?
程序=指令+數據
指令:只讀
數據:讀寫
程序:算法+數據結構
2.2.2 運行程序格式:
Windows: EXE, dll(dynamic link library) 動態鏈接庫
Linux: ELF, so(shared object) 共享對象
2.2.3 編程層次
硬件規格:hardware specifiacation
系統調用:system call
庫調用:library call
庫調用,系統調用:允許被調用的程序;不提供數據,只提供指令
2.2.4 計算機編程語言
計算機語言通常是一個能完整、準確和規則地表達人們的意圖,并用以指揮或控制計算機工作的“符號系統”。
高級語言(是一種人工設計的語言,它對具體的算法進行描述,所以又稱為算法語言。高級語言獨立于計算機的硬件,即與具體的硬件無關)
| (編譯)
匯編語言(用有助于記憶的符號和地址符號來表示指令,便是匯編語言,也稱為符號語言。一般稱匯編語言為低級語言)
| (匯編)
機器語言(機器語言是最初級且依賴于硬件的計算機語言。機器語言可直接在計算機上執行(即為二進制形式),運算速度快。)
編程語言:
匯編語言:微碼編程
系統中某些與硬件相關的特有代碼、驅動程序開發
高級語言C,C++:
系統級應用、驅動程序
高級應用java,python,php:
應用程序
2.2.5 應用程序接口說明
ABI:Application Binary Interface
應用程序二進制接口,
API:Application Programming Interface
應用程序編程接口
Linux中用戶編程接口API遵循了UNIX中最流行的應用編程界面標準—POSIX標準
POS:Portable Operation System
POSIX (可移植操作系統接口,Portable Operating System Interface)
linux寫的程序,原代碼可以在windows上運行(API相同),編譯成二進制代碼則不行(ABI不行)
2.3 操作系統功能
通用目的:將底層的各種硬件資源抽象為一種統一接口
硬件驅動
進程管理
內存管理
網絡管理
安全管理
2.4 程序運行模式
用戶空間:user space ,us
內核模式:system space
在多任務環境中,有許多進程都不允許應用程序去做。所以CPU以兩種模式運行,即用戶模式和內核模式。
①內核模式
當CPU運行于內核模式時,一切程序都可運行。任務可以執行特權級指令,對任何I/O設備有全部的訪問權,還能夠訪問任何虛地址和控制虛擬內存硬件。這種模式對應80×86的ring0層,操作系統的核心部分,包括設備驅動程序都運行在該模式。
②用戶模式
這個模式中,硬件防止特權指令的執行,并對內存和I/O空間的訪問操作進行檢查。這就允許WindowsNT4.0限制任務對各種I/O操作的訪問,并捕捉違反系統完整性的任何行為。在用戶模式中,運行的代碼如果不通過操作系統中的某種門機制,就不能進入內核模式。在80×86處理器上,這個模式對應于 ring3層,操作系統的用戶接口部分以及所有的用戶應用程序都運行在該級別
2.5 操作系統發展歷史
參考:
http://www.zzbaike.com/wiki/Linux%E5%8F%91%E5%B1%95%E5%8F%B2
n 1965 Bell, MIT 與 GE 的『 Multics 』系統
n 1969 年 Ken Thompson 的小型 file server system
n 1973 年 Ritchie 等人以 C 語言寫出第一個正式 Unix 核心
n 重要的 Unix 分支: 1977 年 BSD 的誕生
n 百家齊鳴的 Unix 版本
System (Bell Lab)
AIX (IBM)、Solaris (SUN)、HP-UX (HP)
BSD: (BSRG)Berkeley System Distribution
NetBSD、OpenBSD、FreeBSD
n 1984 年的 GNU 與 Free Software Foundation
n 1988 年的圖形接口 X-Free86 project
n 1991 年 芬蘭大學生 Linus Torvalds linux-kernel
2.6 Linux操作系統發行版
Linux的發行版本可以大體分為兩類,一類是商業公司維護的發行版本,一類是社區組織維護的發行版本,前者以著名的Redhat(RHEL)為代表,后者以Debian為代表
slackware:
suse (zypper,rpm)
opensuse
debian: —–純社區維護 (apt,deb,dpkg)
ubuntu
mint
kali
redhat:(yum,rpm)
rhel: redhat enterprise linux
每18個月發行一個新版本
CentOS:兼容rhel的格式(已被redhat收購)
fedora:每6個月發行一個新版本
ArchLinux(pacman)
Gentoo
LFS: Linux From scratch
Android: kernel+busybox+java虛擬機
2.7 常見開源協定
現今存在的開源協議很多,而經過Open Source Initiative組織通過批準的開源協議目前有58種(http://www.opensource.org/licenses/alphabetical)。我們在常見的開源協議如BSD, GPL, LGPL,MIT等都是OSI批準的協議
2.7.1 BSD開源協議(original BSD license、FreeBSD license、Original BSD license)
BSD開源協議是一個給于使用者很大自由的協議。基本上使用者可以”為所欲為”,可以自由的使用,修改源代碼,也可以將修改后的代碼作為開源或者專有軟件再發布。
但”為所欲為”的前提當你發布使用了BSD協議的代碼,或則以BSD協議代碼為基礎做二次開發自己的產品時,需要滿足三個條件:
-
如果再發布的產品中包含源代碼,則在源代碼中必須帶有原來代碼中的BSD協議。
-
如果再發布的只是二進制類庫/軟件,則需要在類庫/軟件的文檔和版權聲明中包含原來代碼中的BSD協議。
-
不可以用開源代碼的作者/機構名字和原來產品的名字做市場推廣。
BSD 代碼鼓勵代碼共享,但需要尊重代碼作者的著作權。BSD由于允許使用者修改和重新發布代碼,也允許使用或在BSD代碼上開發商業軟件發布和銷售,因此是對商業集成很友好的協議。而很多的公司企業在選用開源產品的時候都首選BSD協議,因為可以完全控制這些第三方的代碼,在必要的時候可以修改或者二次開發。
2.7.2 Apache Licence 2.0(Apache License, Version 2.0、Apache License, Version 1.1、Apache License, Version 1.0)
Apache Licence是著名的非盈利開源組織Apache采用的協議。該協議和BSD類似,同樣鼓勵代碼共享和尊重原作者的著作權,同樣允許代碼修改,再發布(作為開源或商業軟件)。需要滿足的條件也和BSD類似:
-
需要給代碼的用戶一份Apache Licence
-
如果你修改了代碼,需要再被修改的文件中說明。
-
在延伸的代碼中(修改和有源代碼衍生的代碼中)需要帶有原來代碼中的協議,商標,專利聲明和其他原來作者規定需要包含的說明。
-
如果再發布的產品中包含一個Notice文件,則在Notice文件中需要帶有Apache Licence。你可以在Notice中增加自己的許可,但不可以表現為對Apache Licence構成更改。
Apache Licence也是對商業應用友好的許可。使用者也可以在需要的時候修改代碼來滿足需要并作為開源或商業產品發布/銷售。
2.7.3 GPL(GNU General Public License)
我們很熟悉的Linux就是采用了GPL。GPL協議和BSD, Apache Licence等鼓勵代碼重用的許可很不一樣。GPL的出發點是代碼的開源/免費使用和引用/修改/衍生代碼的開源/免費使用,但不允許修改后和衍生的代碼做為閉源的商業軟件發布和銷售。這也就是為什么我們能用免費的各種linux,包括商業公司的linux和linux上各種各樣的由個人,組織,以及商業軟件公司開發的免費軟件了。
GPL協議的主要內容是只要在一個軟件中使用(“使用”指類庫引用,修改后的代碼或者衍生代碼)GPL 協議的產品,則該軟件產品必須也采用GPL協議,既必須也是開源和免費。這就是所謂的”傳染性”。GPL協議的產品作為一個單獨的產品使用沒有任何問題,還可以享受免費的優勢。
由于GPL嚴格要求使用了GPL類庫的軟件產品必須使用GPL協議,對于使用GPL協議的開源代碼,商業軟件或者對代碼有保密要求的部門就不適合集成/采用作為類庫和二次開發的基礎。
其它細節如再發布的時候需要伴隨GPL協議等和BSD/Apache等類似。
2.7.4 LGPL(GNU Lesser General Public License)
LGPL是GPL的一個為主要為類庫使用設計的開源協議。和GPL要求任何使用/修改/衍生之GPL類庫的的軟件必須采用GPL協議不同。LGPL允許商業軟件通過類庫引用(link)方式使用LGPL類庫而不需要開源商業軟件的代碼。這使得采用LGPL協議的開源代碼可以被商業軟件作為類庫引用并發布和銷售。
但是如果修改LGPL協議的代碼或者衍生,則所有修改的代碼,涉及修改部分的額外代碼和衍生的代碼都必須采用LGPL協議。因此LGPL協議的開源代碼很適合作為第三方類庫被商業軟件引用,但不適合希望以LGPL協議代碼為基礎,通過修改和衍生的方式做二次開發的商業軟件采用。
GPL/LGPL都保障原作者的知識產權,避免有人利用開源代碼復制并開發類似的產品
2.7.5 MIT(MIT)
MIT是和BSD一樣寬范的許可協議,作者只想保留版權,而無任何其他了限制.也就是說,你必須在你的發行版里包含原許可協議的聲明,無論你是以二進制發布的還是以源代碼發布的.
詳細參考:http://blog.csdn.net/techbirds_bao/article/details/8785413
2.8 獲取發行版
http://fossies.org/ 獲取源碼包
原創文章,作者:N21_Lorne,如若轉載,請注明出處:http://www.www58058.com/20947
寫的很好,排版還可以在漂亮一些,加油