2013-10-16 24 views
1

我已經讀了,字符設備驅動程序的讀取功能看起來像字符設備讀取參數的內容來自哪裏?

static ssize_t device_read(struct file *filp, /* see include/linux/fs.h */ 
       char *buffer, /* buffer to fill with data */ 
       size_t length, /* length of the buffer  */ 
       loff_t * offset) 

我的問題是

  1. 這些參數是強制性的?
  2. 看不到* filp和* offset在sample driver中使用。那有什麼用?
  3. * buffer和* length的數據究竟來自哪裏?在代碼中說,緩衝區在用戶數據段中。這實際上是什麼意思?

回答

0

可以說用戶進程想要使用系統調用read從文件中讀取一些數據。用戶進程提供了一個文件描述符,數據應該被讀入的緩衝區以及要讀取的字節數。

內核將read調用的文件描述符轉換爲struct file *。參數bufferlength是用戶進程提供的緩衝區和字節數。

1
  1. 這些參數是強制性的?

    不,這些參數不是強制性的。這完全取決於你想如何實現你的讀操作。但是,用戶空間應用程序必須通過讀取系統調用所需的所有內容,然後傳遞驅動程序要使用的驅動程序。

  2. 無法看到示例驅動程序中使用的* filp和* offset。那有什麼用?

    這是因爲樣本驅動程序沒有讀取實際設備,它只是讀取全局字符串。但在實際的驅動程序中它讀取一些設備。要通知驅動程序用戶空間要讀取哪個設備,* filp用作設備標識符。偏移只是給出了從何處開始讀取設備的位置。

  3. * buffer和* length的數據究竟來自哪裏?在代碼中說,緩衝區在用戶數據段中。這實際上是什麼意思?

    在實際場景中,數據是從filp指示的設備中讀取的,並且該數據將進入緩衝區,並且相應地設置長度。但是在示例驅動程序中,爲了簡單起見,它只是讀取全局字符串而不是讀取設備。這個*緩衝區位於用戶數據段中,這意味着用戶空間應用程序已經在其自己的數據段中分配了該緩衝區,並且它已經傳遞了指向內核空間的指針,以便內核可以將數據傳遞給驅動程序從設備讀取的用戶空間應用程序。 put_user用於將數據適當傳輸到用戶空間緩衝區。