通過編寫有名管道多路通信實驗,讀者可進一步掌握管道的創(chuàng)建、讀寫等操作,同時,也復習使用select()函數(shù)實現(xiàn)管道的通信。
本章詳細講解了Linux中進程間通信的幾種機制,包括管道通信、信號通信、消息隊列、信號量以及共享內存機制等,并且講解了進程間通信的演進。
前面已經提到,進程是系統(tǒng)中程序執(zhí)行和資源分配的基本單位。每個進程都擁有自己的數(shù)據(jù)段、代碼段和堆棧段,這就造成了進程在進行切換等操作時都需要有比較復雜的上下文切換等動作。為了進一步減少處理機的空轉時間,支持多處理器以及減少上下文切換開銷,進程在演化中出現(xiàn)了另一個概念——線程。
“生產者消費者”問題是一個著名的同時性編程問題的集合。通過學習經典的“生產者消費者”問題的實驗,讀者可以進一步熟悉Linux中的多線程編程,并且掌握用信號量處理線程間的同步和互斥問題。
讀者一定都聽說過著名的OSI協(xié)議參考模型,它是基于國際標準化組織(ISO)的建議發(fā)展起來的,從上到下共分為7層:應用層、表示層、會話層、傳輸層、網(wǎng)絡層、數(shù)據(jù)鏈路層及物理層。這個7層的協(xié)議模型雖然規(guī)定得非常細致和完善,但在實際中卻得不到廣泛的應用,其重要的原因之一就在于它過于復雜。
本章首先介紹了線程的基本概念、線程的分類和特性以及線程的發(fā)展歷程。
在Linux中的網(wǎng)絡編程是通過socket接口來進行的。人們常說的socket是一種特殊的I/O接口,它也是一種文件描述符。socket是一種常用的進程之間通信機制,通過它不僅能實現(xiàn)本地機器上的進程之間的通信,而且通過網(wǎng)絡能夠在不同機器上的進程之間進行通信。
在實際情況中,人們往往遇到多個客戶端連接服務器端的情況。由于之前介紹的如connet()、recv()和send()等都是阻塞性函數(shù),如果資源沒有準備好,則調用該函數(shù)的進程將進入睡眠狀態(tài),這樣就無法處理I/O多路復用的情況了。本節(jié)給出了兩種解決I/O多路復用的解決方法,這兩個函數(shù)都是之前學過的fcntl()和select()。
通過實現(xiàn)NTP協(xié)議的練習,進一步掌握Linux網(wǎng)絡編程,并且提高協(xié)議的分析與實現(xiàn)能力,為參與完成綜合性項目打下良好的基礎。
本章首先概括地講解了OSI分層結構以及TCP/IP協(xié)議各層的主要功能,介紹了常見的TCP/IP協(xié)議族,并且重點講解了網(wǎng)絡編程中需要用到的TCP和UDP協(xié)議,為嵌入式Linux的網(wǎng)絡編程打下良好的基礎。
操作系統(tǒng)是通過各種驅動程序來駕馭硬件設備的,它為用戶屏蔽了各種各樣的設備,驅動硬件是操作系統(tǒng)最基本的功能,并且提供統(tǒng)一的操作方式。設備驅動程序是內核的一部分,硬件驅動程序是操作系統(tǒng)最基本的組成部分,在Linux內核源程序中也占有60%以上。因此,熟悉驅動的編寫是很重要的。
設備驅動程序可以使用模塊的方式動態(tài)加載到內核中去。加載模塊的方式與以往的應用程序開發(fā)有很大的不同。以往在開發(fā)應用程序時都有一個main()函數(shù)作為程序的入口點,而在驅動開發(fā)時卻沒有main()函數(shù),模塊在調用insmod命令時被加載,此時的入口點是init_module()函數(shù),通常在該函數(shù)中完成設備的注冊。
Qt/Embedded以原始Qt為基礎,并做了許多出色的調整以適用于嵌入式環(huán)境。Qt/Embedded通過Qt API與Linux I/O設施直接交互,成為嵌入式Linux端口。同Qt/X11相比,Qt/Embedded很省內存,因為它不需要一個X服務器或是Xlib庫,它在底層拋棄了X lib,采用framebuffer)作為底層圖形接口
FS2410開發(fā)板的S3C2410處理器具有117個多功能通用I/O(GPIO)端口管腳,包括GPIO 8個端口組,分別為GPA(23個輸出端口)、GPB(11個輸入/輸出端口)、GPC(16個輸入/輸出端口)、GPD(16個輸入/輸出端口)、GPE(16個輸入/輸出端口)、GPF(8個輸入/輸出端口)、GPH(11個輸入/輸出端口)。
前面所講述的驅動程序中都沒有涉及中斷處理,而實際上,有很多Linux的驅動都是通過中斷的方式來進行內核和硬件的交互。中斷機制提供了硬件和軟件之間異步傳遞信息的方式。硬件設備在發(fā)生某個事件時通過中斷通知軟件進行處理。中斷實現(xiàn)了硬件設備按需獲得處理器關注的機制,與查詢方式相比可以大大節(jié)省CPU資源的開銷。
LED和蜂鳴器是最簡單的GPIO的應用,都不需要任何外部輸入或控制。按鍵同樣使用GPIO接口,但按鍵本身需要外部的輸入,即在驅動程序中要處理外部中斷。按鍵硬件驅動原理圖如圖11-7所示。
該實驗是編寫最簡單的字符驅動程序,這里的設備也就是一段內存,實現(xiàn)簡單的讀寫功能,并列出常用格式的Makefile以及驅動的加載和卸載腳本。讀者可以熟悉字符設備驅動的整個編寫流程。
本章主要介紹了嵌入式Linux設備驅動程序的開發(fā)。首先介紹了設備驅動程序的概念及Linux對設備驅動的處理,這里要明確驅動程序在Linux中的定位。
目前的桌面機操作系統(tǒng)大多有著美觀、操作方便、功能齊全的GUI(圖形用戶界面),例如KDE或者GNOME。GUI(圖形用戶界面)是指計算機與其使用者之間的對話接口,可以說,GUI是當今計算機技術的重大成就。它的存在為使用者提供了友好便利的界面,并大大地方便了非專業(yè)用戶的使用,使得人們從繁瑣的命令中解脫出來,可以通過窗口、菜單方便地進行操作。
通過編寫一個跳動的“Hello,World”字符串,進一步熟悉嵌入式Qt的開發(fā)過程。