字元裝置驅動程式之概念介紹(一)
一、
Uboot目的是啟動核心。
核心目的是啟動應用程式。
二、
應用程式:讀寫檔案、點燈、擷取按鍵
三、
1、架構:
應用 | open,read,write | |
C庫 | ||
系統調用接口 | sytem call interface | |
核心 | VFS virtual file system | sys_open,sys_read,sys_write |
驅動 | Led_open,led_read,led_write |
2、簡單的應用程式
int main()
{
int fd1,fd2;
int val = 1;
fd1=open(“/dev/led”, O_RDWR); //打開一個led程式
write(fd1, &val,4);
fd2=open(“hello.txt”, O_RDWR); //打開一個文本檔案
write(fd2, &val, 4);
}
3、驅動也屬于核心的一部分。
4、C庫是怎麼進入核心呢?open,read,write實作的實質是什麼?
執行swi val(彙編指令),引發一個異常,相當于中斷一樣。當發生這個異常的時候,就會進入核心的異常處理函數裡面。
5、系統調用接口的作用(system call interface):
在異常處理函數裡面,根據發生異常的原因,調用不同的處理函數。
例如:使用open函數,則傳進來的值為val1(swi val1);使用read函數,則傳進來的值為val2(swi val2);使用write函數,則傳進來的值為val3(write val3)。核心裡的系統調用接口(system callinterface),會根據傳進來不同的值,去調用sys_open、sys_read和sys_write。
6、上面1簡單的應用程式中,fd1和fd2打開的行為不同。sys_open、sys_read和sys_write,最終根據打開不同的檔案,找到不同的驅動程式,進而調用驅動程式open、read、write來實作這些功能。
四、
1、總結架構:
APP1應用程式調用open、read、write函數等調用,open、read、write函數在c庫裡實作的。執行指令swi val,這條指令會觸發一個異常,這個異常就會進入核心空間,在核心空間異常處理函數裡面,會根據傳進不同的值val,去調用sys_open,sys_read,sys_write函數,這些函數根據打開不同的檔案,檔案有不同的屬性,根據這些屬性來找到底層的驅動程式。比如,led燈,就會找到led燈的驅動程式,如果是某些檔案,就會找到Storage drivers存儲驅動裡面的open,read,write函數。
2、
應用程式app:open,read,write(标準接口)
這個過程怎麼轉換?
怎麼通過open找到led_open?
這就依賴于驅動程式架構
驅動程式:led_open,led_read,led_write
(操作硬體)
3、
4、
總的來說,
Sytem call interface系統調用接口是 決定 使用哪一個函數(read(),write(),open()……)
VFS虛拟檔案系統 是 決定 調用哪一個驅動程式的open()函數(led_open()、memdev_open()……)
https://blog.csdn.net/Pris_oner/article/details/51594934