udev和devfs的區別

来源:https://www.cnblogs.com/linhaostudy/archive/2018/07/08/9279041.html
-Advertisement-
Play Games

devfs(設備文件系統)是由Linux2.4內核引入的,它的出現主要使得設備驅動程式能夠自主管理自己的設備文件。具體來說,devfs具有如下優點: 可以通過程式在設備初始化時在/dev目錄下創建設備文件,卸載設備時將它刪除。 設備驅動程式可以指定設備名、所有者和許可權位,用戶空間程式仍可以修改所有者 ...


devfs(設備文件系統)是由Linux2.4內核引入的,它的出現主要使得設備驅動程式能夠自主管理自己的設備文件。具體來說,devfs具有如下優點:

可以通過程式在設備初始化時在/dev目錄下創建設備文件,卸載設備時將它刪除。

設備驅動程式可以指定設備名、所有者和許可權位,用戶空間程式仍可以修改所有者和許可權位。

不再需要為設備驅動程式分配主設備號以及處理次設備號,在程式中可以直接給register_chrdev()傳遞0主設備號以動態獲得可用的主設備號,併在devfs_register()中指定次設備號。

創建設備目錄、設備文件以及刪除函數如下:

devfs_handle_t devfs_mk_dir(devfs_handle_t dir, const char *name, void *info);
devfs_handle_t devfs_register(devfs_handle_t dir, const char *name, unsigned int flags, unsigned int major, unsigned int minor, umode_t mode
void devfs_unregister(devfs_handle_t de);

使用devfs的例子如下:

static devfs_handle_t devfs_handle;
static int __init xxx_init(void)
{
int ret;
int I;
/*在內核中註冊設備*/
ret = register_chrdev(XXX_major, DEVICE_NAME, &xxx_fops);
if( ret < 0)
{
   printk(DEVICE_NAME “ can’t register major number\n”);
   return ret;
}
/*創建設備文件*/
devfs_handle = devfs_register(NULL, DEVICE_NAME, DEVFS_FL_DEFAULT, xxx_MAJOR, 0, S_IFCHR | S_IRUSR | S_IWUSR, &xxx_fops, NULL);
…
printk(DEVICE_NAME “ initialized\n”);
return 0;
}
static void __exit xxx_exit(void)
{
devfs_unregister(devfs_handle);/*撤消設備文件*/
unregister_chrdev(XXX_MAJOR, DEVICE_NAME);/*註銷設備*/
}
 
module_init(xxx_init);
module_exit(xxx_exit);

在最新的Linux 2.6的內核中, devfs已經被拋棄,udev取代了它。udev取代devfs的幾點原因如下:

  • devfs所做的工作被確信可以在用戶態來完成
  • 一些bug相當長的時間內未被修複
  • devfs的維護者和作者停止了對代碼的維護工作。
  • udev完全在用戶態工作,利用設備加入或移除內核所發送的熱插拔事件來工作。在熱插拔時,設備的詳細信息會由內核輸入到位於/sys的sysfs文件系統。udev的設備名策略、許可權控制和事件處理都是在用戶態下完成的,它利用sysfs中的信息來進行創建設備文件節點工作。
  • 由於udev根據系統中硬體設備的狀態動態更新設備文件、進行設備文件的創建和刪除等,因此,在使用udev後,在/dev目錄下就只包含系統中真正存在的設備了。
  • devfs與udev的另一個顯著區別在於:採用devfs,當一個並不存在的/dev節點被打開的時候,devfs能自動載入對應的驅動,而udev則不能。這是因為udev的設計者認為Linux應該在設備被髮現的時候載入驅動模塊,而不是當它被訪問的時候。udev的設計者認為devfs所提供的打開/dev節點時自動載入驅動的功能對於一個配置正確的電腦是多餘的。系統中所有的設備都應該產生熱插拔事件並載入恰當的驅動,而udev能註意到這點並且為它創建對應的設備節點。

使用udev的例子如下:

#include <linux/device.h>
…
 
static struct class * xxx_class;
static int __init xxx_init(void)
{
int ret;
int i;
/*在內核中註冊設備*/
ret = register_chrdev(XXX_major, DEVICE_NAME, &xxx_fops);
if( ret < 0)
{
   printk(DEVICE_NAME “ can’t register major number\n”);
   return ret;
}
//註冊一個類,使mdev可以在"/dev/"目錄下麵建立設備節點
xxx_class = class_create(THIS_MODULE, DEVICE_NAME);
if(IS_ERR(led_class))
{
   printk("Err: failed in EmbedSky-leds class. \n");
   return -1;
}
//創建一個設備節點,節點名為DEVICE_NAME
class_device_create(xxx_class, NULL, MKDEV(xxx_major, 0), NULL, DEVICE_NAME);
…
printk(DEVICE_NAME “ initialized\n”);
return 0;
}
static void __exit xxx_exit(void)
{
unregister_chrdev(XXX_MAJOR, DEVICE_NAME);/*註銷設備*/
class_device_destroy(xxx_class, MKDEV(xx_major, 0));//刪掉設備點
class_destroy(xxx_class);               //註銷類
}
 
module_init(xxx_init);
module_exit(xxx_exit);

mdev是busybox自帶的一個簡化版的udev,適合於嵌入式的應用埸合。其具有使用簡單的特點。它的作用,就是在系統啟動和熱插拔或動態載入驅動程式時,自動產生驅動程式所需的節點文件。在以busybox為基礎構建嵌入式linux的根文件系統時,使用它是最優的選擇。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天在做WPF的時候,關於設計思路,我覺得自己局限了,因為有一個頁面涵蓋的東西非常多,所以它不能很好的顯示,我就想著怎麼能讓它把其中一部分隱藏,到要使用的時候再拿出來使用,這是一種想法,我自己覺得還不錯,但是之後,我們的頁面設計人員做了這樣一種設計,把表格的數據圖表化,感覺一下子變得更為清晰明瞭,我 ...
  • Visual Studio 2017移動開發 控制項介紹和使用方式:Numeric控制項 Smobiler開發平臺,.NET移動開發 一、 樣式一 我們要實現上圖中的效果,需要如下的操作: 設置控制項的背景色,預設設置為“White”,如圖1; 圖 1 若將該屬性設置為“128, 255, 255”,顯示 ...
  • 在WEBAPI中,AuthorizeAttribute類重寫時,如何獲取post數據是個難題,網上找資料也不好使,只能自己研究,通過研究發現,WEBAPI給了我們獲取POST數據的可能,下麵介紹一下: //將POST數據以字元串的形式讀取,例如post的json數據,就可以以這種方式讀取 actio ...
  • 日行千里,全憑“車”況,為什麼我們要升級平臺 歷經一個半月的時間,不管是叫工業互聯網平臺還是叫工業大數據平臺,從1.0版本升級到2.0版本,升級部分包括:客戶端(網關)、服務端(數據接收、數據處理、計算服務)、底層資料庫結構、WEB業務系統、WEB API介面和手機APP(Android和IOS)等 ...
  • mvc傳值的三種方式:1.ViewData 在使用過程中需要類型轉換 例子: ViewData["MyTitle"]="ViewData傳值"; 引用: @ViewData["MyTitle"] 例子: List<string> strs=new List<string>{"China","Appl ...
  • 通用的單例窗體製作類 ...
  • 最近在做 MVC 項目的時候遇到項目的導出,下麵總結下兩種導出到excel 的方法 第一種方法: 將文件寫到本地,然後返回這個File 或者返回這個 File 的絕對地址 其中 _hostingEnvironment 可以在全局讀取的配置文件的工具類 Globals 中配置 直接上代碼: 第二種方法 ...
  • espcomm_send_command: didn't receive command response espcomm_send_command(FLASH_DOWNLOAD_BEGIN) failed 我現在有兩塊板子都存在這樣的問題,我嘗試這解決這個問題已經很久了。國內文章根本沒有類似的問題 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...