用戶態
App:cp指令,ftp的項目等等這就是App的開發。
App開發需要C的基礎和C庫,C庫講到文件,進程,進程間通信,線程,網絡,界面(GTk)。
C庫(是linux標準庫一定有):就是Clibary,提供了APP支配內核干活的接口,調用的open,read,write,fork,pthread,socket由此處封裝實現,由寫的應用程序調用,C庫中的各種API調用的是內核態,支配內核干活
內核態
進程,內存,線程,網絡,設備驅動不需要上層應用開發者關心,驅動在前面的學習是調用wringpi庫實現,接下來的學習就是要自己實現wringpi庫,因為wringpi庫由廠家提供,可能有可能沒有,這樣當我們拿到另一種類型的板子時,同樣也可以完成開發。
驅動鏈表:管理所有設備的驅動,添加或查找,添加是發生在我們編寫完驅動程序,加載到內核。查找發生在調用驅動程序,由應用層用戶空間去open。
驅動插入鏈表的順序由設備號檢索,就是說主設備號和次設備號除了除了能區分不同種類的設備和不同類型的設備,還能起到將驅動程序創到鏈表的某個位置。
硬件
linux經典的一句話一切皆文件:包括文件,設備(鼠標,鍵盤,LED,屏幕,flash,內存,網卡等),普通的IO口,串口等等。
對于文件,學習到對文件的操作有open ,read,write這幾個API,對于這些API是如何區分操作對象是文件還是一些設備,這些設備需不需要有驅動,驅動又在哪個位置這都是我們需要了解的。驅動肯定是要有的。
假設:現在的硬件有pin4,pin5,pin6,這些引腳分別對應于4驅動,5驅動,6驅動,這些驅動需要由我們來開發。
open(“/dev/pin4”,權限)用來調用引腳4的驅動,那么如何找到相關的驅動,有兩個東西供我們查找,一是文件名,二是設備號(包含主設備號和次設備號)。
Linux的設備管理是和文件系統緊密結合的,各種設備都以文件的形式存放在/dev目錄下,稱為設備文件。應用程序可以打開、關閉和讀寫這些設備文件,完成對設備的操作,就像操作普通的數據文件一樣。為了管理這些設備,系統為設備編了號,每個設備號又分為主設備號和次設備號。主設備號用來區分不同種類的設備,而次設備號用來區分同一類型的多個設備。
ls -l 查看設備號
驅動代碼的開發無非就是添加驅動和調用驅動。
例如:
用戶態調用引腳四open(“/de/pin4”,O_RDWR), 這個open會調用System call interface(這個函數是在內核中的),這個函數會根據設備名找到設備號,然后會調用VFS中的sys_open,sys_open會找到引腳4中的open函數,引腳4中的open函數是對寄存器的操作。用戶態進入內核態會發生一次軟中斷 ,中斷號是0x80。
以上是對下圖的解釋: