驅動學習之驅動和應用的介面

weixin_33766168發表於2017-11-19

  在前面講過,驅動層是應用層是分離,驅動層的程式碼不能使用再應用層,應用層也不能直接操作驅動程式碼,那麼應用層和驅動層之間是如何來實現資料間的交換的能,方法就是通過相應的介面函式。

(1)copy_from_user

1
2
3
4
5
6
7
8
9
unsigned long copy_from_user(void *to, const void __user *from, unsigned long n)
{
   might_sleep();  
   if (access_ok(VERIFY_READ, from, n))
       n = __copy_from_user(to, from, n);
   else
       memset(to, 0, n);
   return n;
}


這個函式是從使用者空間拷貝資料到核心空間,失敗返回沒有被拷貝的位元組數,成功返回0,注意使用者空間的資料不能直接通過memcpy複製到核心空間,原因是核心空間和使用者空間的地址不在同一個對映區域裡面。核心空間和使用者空間的記憶體是不能直接訪問的。

(2)copy_to_user

1
2
3
4
5
6
7
8
unsigned long copy_to_user(void __user *to, const void *from, unsigned long n)
{
       might_sleep();
       BUG_ON((long) n < 0);
       if (access_ok(VERIFY_WRITE, to, n))
              n = __copy_to_user(to, from, n);
       return n;
}


返回值和copy_from_user一樣,成功返回0,失敗返回沒有拷貝成功的位元組數。

引數to有個__user限定,這個在~/include/linux/compiler.h中有如下定義:

# define __user     __attribute__((noderef, address_space(1)))

表示這是一個使用者空間的地址,即其指向的為使用者空間的記憶體。

__attribute__是gnu c編譯器的一個功能,它用來讓開發者使用此功能給所宣告的函式或者變數附加一個屬性,以方便編譯器進行錯誤檢查,其實就是一個核心檢查器。

以上兩個函式參考

http://blog.sina.com.cn/s/blog_55465b470100kdn9.html



本文轉自 菜鳥養成記 51CTO部落格,原文連結:http://blog.51cto.com/11674570/1872418

相關文章