2014-05-02 98 views
7

以下是返回值的說明。copy_from_user()的返回值

unsigned long copy_from_user 
    (void *to, const void __user *from, unsigned long count) 

返回值是仍需複製的內存量。

這是什麼意思?如果返回值是5,是否複製(count-5)字節? (count-5)字節僅被複制的原因是什麼?是否因爲to的大小小於from(系統應該會崩潰,對吧)?

回答

11

copy_from_user函數可能由於各種原因(通常是因爲地址無效)而失敗,僅複製部分請求的數據,甚至不能複製它。

有一個約定(不是普遍遵循)返回0來表示成功的函數。在copy_from_user的情況下,將結果定義爲複製的字節數而不是可以使用相當簡單的規則遵循這個約定。

直觀地看,它可能會更有意義它返回實際上複製的字節數,但它的定義方式允許使用它以類似的方式來測試錯誤作爲上返回0等功能代碼成功。 (在很多情況下,它並不重要有多少字節無法複製;任何非零的結果僅僅是一個錯誤。)

如果它返回一個非零值,這是不到count,表明部分複製,它可能是意味着用戶空間內存緩衝區在用戶進程的地址空間內啓動,但超出了其結尾。

+0

明白了。謝謝。 – user1443721