日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

字符设备的读写

發布時間:2024/9/21 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 字符设备的读写 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在應用程序看來,字符設備只是一個設備文件,應用程序可以像操作普通文件一樣對硬件設備進行操作。應用層對設備的操作都在設備驅動程序的file_operations結構中有對應的接口,比如應用層的read函數對應驅動層的file_operations-> read,而應用層的write函數對應驅動層的file_operations-> write。本節介紹字符設備內核空間與用戶空間數據交互的方法。

先看file_operations中的讀寫接口:

  • ssize_t?(*read)?(struct?file?*,?char?__user?*,?size_t,?loff_t?*); ?
  • ssize_t?(*write)?(struct?file?*,?const?char?__user?*,?size_t,?loff_t?*);?
  • 它們的第二個參數實際上是用戶空間的數據地址。由于內核態和用戶態使用不同的內存定義,所以二者之間不能直接訪問對方的內存,而應該使用Linux中的用戶和內核態內存交互函數,這些函數在include/asm/uaccess.h中聲明。

    從內核空間復制數據到用戶空間使用copy_to_user函數:

  • unsigned?long?copy_to_user?(void?__user?*?to,?const?void?*?from,?unsigned?long?n);?
  • 而要從用戶空間復制數據到內核空間可以用copy_from_user函數:
  • unsigned?long?copy_from_user?(void?*?to,?const?void*?from,?unsigned?long?n);?
  • 此外內核空間和用戶空間之間也可進行單值交互(如char、int、long類型):
  • int??put_user(dataum,ptr);??//向用戶空間傳單值 ?
  • int??get_user(local,ptr);???//向內核空間傳單值?
  • 當一個指針指向用戶空間時,必須確保指向的用戶地址是合法的,而且對應的頁面也已經映射,這一點可以使用access_ok函數檢測。access_ok函數的type參數有兩個選項:VERIFY_READ、VERIFY_ WRITE,分別對應內存讀、寫。
  • int?access_ok(int?type,?const?void?*addr,?unsigned?long?size);?
  • 在訪問用戶空間的內存時,可以使用下面的方法先檢查用戶空間的指針是否合法:
  • char?kernelbuffer[100]; ?
  • static?ssize_t?demo_read(struct?file?*file,?char?__user?*buffer,?size_t?count,?loff_t?*ppos) ?
  • { ?
  • ????if?(!access_ok(VERIFY_WRITE,?buffer,?count)) ?
  • ????????return?-EFAULT; ?
  • ????if?(copy_to_user(buffer,?kernelbuffer,?count)) ?
  • ????????????return?-EFAULT; ?
  • ????return?count; ?
  • } ?
  • 總結

    以上是生活随笔為你收集整理的字符设备的读写的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。