Linux與VxWorks的主要區別
1、內核結構
微內核:是一種只提供必要服務的操作系統內核;這些必要的服務包括任務管理、中斷處理、內存管理等。其他服務,如文件管理、網絡支持等通過接口連到微內核。
在微內核中,用以完成系統調用功能的程序模塊通常只進行簡短的處理,而把其余工作通過消息傳遞交給內核之外的進程來處理。在典型情況下,每個系統調用程序模塊都有一個與之對應的進程,微內核部分經常只不過是一個消息轉發站,這種方式有助於實現模塊間的隔離。這種內核設計的最根本思想就是要保持操作系統的內核盡可能小,因為內核是直接與計算機硬件相關的,內核越小,就越便於在不同的硬件系統間進行移植。
微內核結構的另外一個優點是,可以使不需要的模塊不加載到內存中,因此,微內核就可以更有效地利用內存。
微內核具有很好的擴展性,並可簡化應用程序開發。用戶只運行他們需要的服務,這有利於減少磁盤空間和存儲器需求。
宏內核:又稱單核心,是操作系統核心架構的一種,除了基本的服務,內核還包括文件系統、網絡協議等。此架構的特性是整個核心程序都是以核心空間(Kernel Space)的身份及監管者模式(Supervisor Mode)來運行。
宏內核的內部可被分為若干模塊(或者是層次或其他),但在運行時,它是一個獨立的二進制大映像。模塊間的通信不是通過消息傳遞,而是通過直接調用其他模塊中的函數來實現的。
現在多數采行宏內核架構設計的操作系統,如OpenVMS、Linux、FreeBSD、以及Solaris等,在運作運行階段中,以動態方式來加載(Load)、卸載(Unload)可運行的模塊,不過這些模塊是屬於二進制代碼的層次,或稱鏡像層次,而非核心架構的層次。即使宏內核進行模塊化轉化,也不會與微核心或混核心架構的核心產生區分上的混淆,因為微核心、混核心的模塊是屬於系統架構的層次。
就實務上,動態加載/卸載模塊的作法,等於是用一種較簡易的方式來彈性管控運行中的操作系統核心,若沒有動態加載/卸載機制,操作系統的核心想要進行任何的調整、變換,都必須重啟才能達成。因此模塊化是必然且必要的,如此才能讓核心功效輕松地擴展、延伸,此外也能適時減輕硬件的運行運作負擔。
2、運行模式
VxWorks上應用程序運行在“實模式”下,無用戶模式和內核模式之分;
Linux則是采用“保護模式”,用戶進程、線程運行在用戶模式下,內核線程運行於內核模式。
實模式、保護模式,從尋址方式來說,CPU中的IP(EIP)中存放虛地址,把虛地址轉換到物理地址,各個模式有各自的轉換方式。
實模式,是指尋址采用和8086相同的16位段和偏移量,最大尋址空間1MB,最大分段64KB。可以使用32位指令。32位的x86 CPU用做高速的8086。
保護模式:尋址采用32位段和偏移量,最大尋址空間4GB,最大分段4GB (Pentium Pre及以后為64GB)。在保護模式下CPU可以進入虛擬8086方式,這是在保護模式下的實模式程序運行環境。
內核模式操作的一種高特權模式,其中的程序代碼能直接訪問所有內存(包括所有的用戶模式進程和應用程序的地址空間)和硬件。也稱為“管理員模式”、“保護模式”或“Ring 0”。
內核模式又稱系統模式,在這種模式下,監控程序可以執行特權指令,而且受保護的內存區域也是可以訪問的。
如果再細致地對此進行分類:它又可以被分為單內核模式和微內核模式兩種。
單內核模式代碼結構緊湊、執行速度快,但是缺乏層次;微內核正好相反。
單內核模式的代表如Linux;微內核模式的代表如Windows。
4、執行單元
任務,是代碼運行的一個映象,從系統的角度看,任務是競爭系統資源的最小運行單元。任務可以使用或等待CPU、IO設備及內存空間等系統資源,並獨立於其它任務,與它們一起並發運行(宏觀上如此)。VxWorks內核使任務能快速共享系統的絕大部分資源。
進程(有時被稱為重量級進程)是程序的一次執行。每個進程都有自己的地址空間、內存、數據棧以及其它記錄其運行軌跡的輔助數據。操作系統管理在其上運行的所有進程,並為這些進程公平地分配時間。
也因為各個進程有自己的內存空間、數據棧等,所以只能使用進程間通訊(IPC),而不能直接共享信息。
線程(有時被稱為輕量級進程)跟進程有些相似,不同的是,所有的線程運行在同一個進程中,共享相同的運行環境。它們可以想像成是在主進程或“主線程”中並行運行的“迷你進程”。
線程有開始,順序執行和結束三部分。它有一個自己的指令指針,記錄自己運行到什么地方。線程的運行可能被搶占(中斷),或暫時的被掛起(也叫睡眠),讓其它的線程運行,這叫做讓步。
一個進程中的各個線程之間共享同一片數據空間,所以線程之間可以比進程之間更方便地共享數據以及相互通訊。線程一般都是並發執行的,正是由於這種並行和數據共享的機制使得多個任務的合作變為可能。實際上,在單CPU 的系統中,真正的並發是不可能的,每個線程會被安排成每次只運行一小會,然后就把CPU 讓出來,讓其它的線程去運行。在進程的整個運行過程中,每個線程都只做自己的事,在需要的時候跟其它的線程共享運行的結果。
當然,這樣的共享並不是完全沒有危險的。如果多個線程共同訪問同一片數據,則由於數據訪問的順序不一樣,有可能導致數據結果的不一致的問題。這叫做競態條件。幸運的是,大多數線程庫都帶有一系列的同步原語,來控制線程的執行和數據的訪問。
另一個要注意的地方是,由於有的函數會在完成之前阻塞住,在沒有特別為多線程做修改的情況下,這種“貪婪”的函數會讓CPU 的時間分配有所傾斜。導致各個線程分配到的運行時間可能不盡相同,不盡公平。
5、請求內核服務方式
函數調用的實際(匯編)實現
指針寄存器EBP和ESP
EBP是所謂的幀指針,指向當前活動記錄的上方(上一個活動記錄的最下方)
ESP是所謂的棧指針,指向當前活動記錄的最下方(下一個將要插入的活動記錄的最上方)
這兩個指針的值規定了當前活動記錄的位置
參數傳遞
將函數參數壓棧:mov eax,dword ptr [n] ;(n為參數變元)
push eax
函數調用分配空間
函數調用將執行如下操作:
⒈將幀指針壓入棧中:push ebp
⒉使得幀指針等於棧指針:mov ebp,esp
⒊使棧指針自減,自減得到的內存地址應當能夠(足夠)用來存儲被調用函數的本地狀態:sub esp,0CCh
注意:0CCh為0xCC,隨着具體函數的不同而不同。
傳入保存狀態
push ebx ;保存ebx寄存器的值
push esi ;保存esi寄存器的值
push edi ;保存edi寄存器的值
裝入edi
lea edi,[ebp-0CCh] ;0cch是當前活動記錄的大小。
EDI是目的變址寄存器。
恢復傳入的保存狀態
00411417 pop edi
00411418 pop esi
pop ebx
棧指針上移,恢復空間
add esp,0CCh
函數返回釋放空間
當函數返回時,編譯器和硬件將執行如下操作:
⒈使棧指針等於幀指針: mov esp,ebp
⒉從棧中將舊的幀指針彈出: pop ebp
⒊返回:ret
系統調用:由操作系統實現的所有系統調用所構成的集合即程序接口或應用編程接口。是應用程序同系統之間的接口。
Linux系統調用,包含了大部分常用系統調用和由系統調用派生出的的函數。主要包括如下幾部分:
1、進程控制
如:fork 創建一個新進程
clone 按指定條件創建子進程
2、文件系統控制
a)文件讀寫操作
如:open 打開文件
creat 創建新文件
b)文件系統操作
如:chdir 改變當前工作目錄
chmod 改變文件方式
3、系統控制
如:reboot 重新啟動
sysinfo 取得系統信息
4、內存管理
如:mmap 映射虛擬內存頁
msync 將映射內存中的數據寫回磁盤
5、網絡管理
如:getdomainname 取域名
setdomainname 設置域名
6、socket控制
如:socketcall socket系統調用
socket 建立socket
7、用戶管理
如:getuid 獲取用戶標識號
setuid 設置用戶標志號
8、進程間通信
如:semctl 信號量控制
semget 獲取一組信號量
semop 信號量操作
6、實時性
實時操作系統是相對於分時操作系統的一個概念。在一個分時操作系統中,計算機資源會被平均地分配給系統內所有的工作。在分時系統中,各項任務需要花多長時間來完成,這一點並不重要;而在一個實時操作系統之中,最關注的是每個任務在多長時間內可以完成。簡單地說,實時和分時操作系統最大的不同在於 “時限”這個概念。
實時操作系統的特點:
1、異步事件的響應
2、切換延遲和中斷延遲時間的確定
3、優先級中斷和調度
4、搶占式調度
5、內存鎖定
6、連續文件
7、同步
從上述區別中可以看出,在實時操作系統中,系統必須在特定的時間內完成指定的應用,具有較強的“剛性”,而分時操作系統則注重將系統資源平均地分配給各個應用,不太在意各個應用的進度如何,什么時間能夠完成。不過,就算是實時操作系統,其“剛性”和“柔性”的程度也有所不同,就好像是系統的“硬度”有所不同,因而有了所謂的“硬實時”和“軟實時”。
硬實時系統有一個剛性的、不可改變的時間限制,它不允許任何超出時限的錯誤。超時錯誤會帶來損害甚至導致系統失敗、或者導致系統不能實現它的預期目標。而軟實時系統的時限是一個柔性靈活的,它可以容忍偶然的超時錯誤。失敗造成的后果並不嚴重,例如在網絡中僅僅是輕微地降低了系統的吞吐量。
硬實時與軟實時之間最關鍵的差別在於,軟實時只能提供統計意義上的實時。比如,用戶在操作DVD播放機時,只要98%的情況都能正常播放,用戶可能就滿意了;而發射衛星、控制核反應堆的應用系統,這些系統的實時性必須達到100%,是絕對不允許出現意外的。
7、文件系統差異,主要講Linux方面:
a)文件共享
多進程可以同時訪問一個文件,文件會在內存中存在一個映像
一個進程修改,其他進程都可能更新,特別是通過map方式
b)文件按需加載
如果系統都只訪問文件一個片段,最小情況下內存只有一段文件片段的buffer
VxWorks文件系統的總體系統結構:
我們通常使用的fopen/fread/fwrite/fseek/fclose等接口都是上圖中的buffer層接口,該層是在io層基礎上封裝了一個緩沖,大小是1K byte。
下面就是io管理層,該層管理所有VxWorks的設備,文件系統作為一個設備也掛接在io層中,除了文件系統外,還有串口/socket等都是VxWorks的設備。
在這層統一使用函數open/read/write/close/ioctrl/lseek等接口統一操作。這層內部實現上,使用設備管理表來統一管理各個設備。
VxWorks的設備管理表中記錄了各個設備的設備號、設備名、驅動指針。devs命令列出了設備號和設備名。sockte、串口設備和文件系統等都是VxWorks的設備。VxWorks的其他設備也是作為文件來管理的。
Linux文件的記錄形式
linux文家系統使用索引節點(inode)來記錄文件信息。索引節點是一種數據結構,它包含了一個文件的長度、創建及修改時間、權限、所屬關系、磁盤中的位置等信息。
一個文件系統維護了一個索引節點的數組,每個文件或目錄都與索引節點數組中的唯一的元素對應。每個索引節點在數組中的索引號,稱為索引節點號。
linux文件系統將文件索引節點號和文件名同時保存在目錄中,所以,目錄只是將文件的名稱和它的索引節點號結合在一起的一張表,目錄中每一對文件名稱和索引節點號稱為一個連接。對於一個文件來說,有一個索引節點號與之對應;而對於一個索引節點號,卻可以對應多個文件名。
連接分為軟連接和硬連接,其中軟連接又叫符號連接。
硬連接:原文件名和連接文件名都指向相同的物理地址。目錄不能有硬連接;硬連接不能跨文件系統(不能跨越不同的分區),文件在磁盤中只有一個拷貝。由於刪除文件要在同一個索引節點屬於唯一的連接時才能成功,因此硬連接可以防止不必要的誤刪除。
軟連接:用 ln -s 命令建立文件的符號連接。符號連接是linux特殊文件的一種,作為一個文件,它的數據是它所連接的文件的路徑名。沒有防止誤刪除的功能。