→ Lipraxde: 告訴呼叫者自己有沒有正確執行完 10/30 08:13
推 Bencrie: 去讀 API reference manual 10/30 09:03
推 filiaslayers: 原po是程式新手? 10/30 10:04
→ galic: 你有注意到goto嗎 10/30 10:26
→ galic: 哦我看懂你的問題了... 你沒有疑惑驅動的函式是誰呼叫的? 10/30 10:34
→ galic: 或是怎麼被呼叫的 10/30 10:34
感謝各位回答 我再去看了各位說的 不知我有沒有解讀錯誤
再請各位幫忙看一下對不對 我以最簡單的一個write 為例
我去linux網站找到API說明如下
int copy_from_user_toio(volatile void __iomem * dst, const void __user * src,
size_t count)
copy data from user-space to mmio-space
Parameters
volatile void __iomem * dst
the destination pointer on mmio-space
const void __user * src
the source pointer on user-space
size_t count
the data size to copy in bytes
Description
Copies the data from user-space to mmio-space.
Return
Zero if successful, or non-zero on failure.
以下程式碼
static int demo_write(struct file *filp, const char __user *buff, size_t
count, loff_t *ppos)
{
int ret;
int len;
printk("call demo_write\n");
len=copy_from_user( &result, buff, count);
ret=len;
return ret;
}
將資料copy (count bit)從用戶空間(buff)到核心空間(&result) 之後
必須傳回一個零 代表成功
這是不是說如果沒有return ret;這一行
VFS就會認為這一個動作沒有完成呢? 然後會有訊息告訴用戶?
否則的話那行程式應該只要用
copy_from_user( &result, buff, count);//這樣就可以了?
這裡我還有一個問題 就是最後一定要用ret這個字才可以嗎?
我可不可以不要 ret= len; 這行
直接用return len;
或者直接return copy_from_user( &result, buff, count);
因為我看很多地方都會這樣 不知道是有用意
還是說只是大家寫的習慣而已?
※ 編輯: TouchAgain (111.249.101.2), 10/30/2017 15:59:10
※ 編輯: TouchAgain (111.249.101.2), 10/30/2017 16:00:37
推 filiaslayers: 喔喔,看懂你的問題了orz 10/30 16:03
→ galic: 感覺你想的怪怪的... manual說的回傳值是指copy_from_user 11/03 12:29
→ galic: 呼叫之後的回傳值 0或非0代表copy_from_user有沒有成功執行 11/03 12:30
→ galic: 不是說執行之後,你呼叫的函式還要另外回傳0或非0 11/03 12:31
→ galic: 所以跟VFS什麼的都完全沒有關係 11/03 12:32
→ galic: 這邊的 ret=len 是多餘的 跟你說的另外兩個寫法一致 11/03 12:33
→ galic: 但這三種寫法有沒有差 也是編譯器先判定的 跟VFS也完全沒關 11/03 12:33
→ galic: 而且這種kernel address space和user address space之間的 11/03 12:35
→ galic: 資料搬移是涉及到memory management的設計 跟file system的 11/03 12:36
→ galic: VFS無關 11/03 12:37
→ galic: 還是你想說 "virtual memory" 11/03 12:38
感謝回復 如果照您說的話 執行函數後函數本身就會回傳0確認動作完成
不需要另外寫一行return回傳
那請問最後面我們再加return意義是什麼?
因為我一開始的想法就是這樣
因為我看不到誰來接收這個return值 或者對return值做判斷
照理講應該是call這整段程式的user會收到他的回傳值然後做出判斷
但是在user的程式中並沒有對回傳值做任何判斷或動作
user 程式只有以下這一行:
result = write(fd,&data,sizeof(data));
而且我不確定這裡收到的回傳值result是否會等於kernel內return出來的
因為我老師說中間還會經過轉換
※ 編輯: TouchAgain (61.228.245.157), 11/03/2017 13:28:47
※ 編輯: TouchAgain (61.228.245.157), 11/03/2017 13:37:18
→ seaseacola: 你的範例怪怪的. 看 kernel 使用 copy_from_user 11/03 19:56
→ seaseacola: 的其他 driver 應該就能理解 11/03 19:56
→ galic: 我突然覺得你應該發在 LinuxDev 版之類的... 11/04 21:16
→ galic: 總之 demo_write() 裡面呼叫的那些函式 都會有回傳值 只是 11/04 21:17
→ galic: 看demo_write()裡面要怎麼處理 demo_write()本身的回傳值 11/04 21:17
→ galic: 則是呼叫 demo_write() 的函式處理的... 所以你應該先知道 11/04 21:18
→ galic: 誰會呼叫 demo_write() 以及呼叫 demo_write() 的函式預期 11/04 21:18
→ galic: demo_write() 回傳什麼結果給他 11/04 21:18
→ galic: 這不管是不是kernel程式,而是跟一般 C 程式的概念都一致 11/04 21:19
→ galic: 並不會因為今天是kernel程式就會有處理上面的不同 11/04 21:19
→ TouchAgain: 好的 了解你的意思了 感謝! 11/04 22:41