udev的實現原理

2021-08-30 19:45:48 字數 3273 閱讀 4240

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!

udev實現原理

作者****:李先靜

相對於linux

來說,udev

還是乙個新事物。然而,儘管它03

年才出現,儘管它很低調(j)

,但它無疑已經成為linux

下不可或缺的元件了。udev

是什麼?它是如何實現的?最近研究linux

裝置管理時,花了一些時間去研究udev

的實現。

udev

是什麼?u

是指user space

,dev

是指device

,udev

是使用者空間的裝置驅動程式嗎?最初我也這樣認為,除錯核心空間的程式要比除錯使用者空間的程式複雜得多,核心空間的程式的bug

所引起的後果也嚴重得多,device driver

是核心空間中所佔比較最大的**,如果把這些device driver

中硬體無關的**,從核心空間移動到使用者空間,自然是乙個不錯的想法。

但我的想法並不正確,udev

的文件是這樣說的,

1.dynamic replacement for /dev

。作為devfs

的替代者,傳統的devfs

不能動態分配major

和minor

的值,而major

和minor

非常有限,很快就會用完了。udev

能夠像dhcp

動態分配ip

位址一樣去動態分配major

和minor。

2.device naming

。提供裝置命名持久化的機制。傳統裝置命名方式不具直觀性,像/dev/hda1

這樣的名字肯定沒有boot_disk

這樣的名字直觀。udev

能夠像dns

解析網域名稱一樣去給裝置指定乙個有意義的名稱。

3.api to access info about current system devices

。提供了一組易用的api

去操作sysfs

,避免重複實現同樣的**,這沒有什麼好說的。

我們知道,使用者空間的程式與裝置通訊的方法,主要有以下幾種方式,

1.通過ioperm

獲取操作io

埠的許可權,然後用inb/inw/ inl/ outb/outw/outl

等函式,避開裝置驅動程式,直接去操作io

埠。(沒有用過)

2.用ioctl

函式去操作/dev

目錄下對應的裝置,這是裝置驅動程式提供的介面。像鍵盤、滑鼠和觸控螢幕等輸入裝置一般都是這樣做的。

3.用write/read/mmap

去操作/dev

目錄下對應的裝置,這也是裝置驅動程式提供的介面。像framebuffer

等都是這樣做的。

上面的方法在大多數情況下,都可以正常工作,但是對於熱插撥(hotplug)

的裝置,比如像u

盤,就有點困難了,因為你不知道:什麼時候裝置插上了,什麼時候裝置拔掉了。這就是所謂的hotplug

問題了。

處理hotplug

傳統的方法是,在核心中執行乙個稱為hotplug

的程式,相關引數通過環境變數傳遞過來,再由hotplug

通知其它關注hotplug

事件的應用程式。這樣做不但效率低下,而且感覺也不那麼優雅。新的方法是採用netlink

實現的,這是一種特殊型別的socket

,專門用於核心空間與使用者空間的非同步通訊。下面的這個簡單的例子,可以監聽來自核心hotplug

的事件。

#include

<

stdio

.h>

#include

#include

<

string

.h>

#include

<

ctype

.h>

#include

#include

#include

socket

.h>

#include

#include

#include

<

errno

.h>

static

intinit_hotplug_sock

(void

)/* set receive buffersize */

setsockopt

(hotplug_sock

, sol_socket

, so_rcvbufforce, &

buffersize

, sizeof

(buffersize

));retval

= bind

(hotplug_sock

, (struct

sockaddr

*) &

snl,

sizeof

(struct

sockaddr_nl));if(

retval

< 0)

return

hotplug_sock;}

#define

uevent_buffer_size

2048

intmain

(int

argc

, char

* argv);

recv

(hotplug_sock

, &buf

, sizeof

(buf

), 0); 

printf

("%s/n"

, buf);}

return0;}

編譯:gcc -g hotplug.c -o hotplug_monitor

執行後插/

拔u盤,可以看到:

add@/devices/pci0000:00/0000:00:1d.1/usb2/2-1

add@/devices/pci0000:00/0000:00:1d.1/usb2/2-1/usbdev2.2_ep00

add@/devices/pci0000:00/0000:00:1d.1/usb2/2-1/2-1:1.0

給我老師的人工智慧教程打call!

udev實現原理

udev實現原理 作者 李先靜 相對於linux來說,udev還是乙個新事物。然而,儘管它03年才出現,儘管它很低調 j 但它無疑已經成為linux下不可或缺的元件了。udev是什麼?它是如何實現的?最近研究linux裝置管理時,花了一些時間去研究udev的實現。udev是什麼?u 是指user s...

Udev 基本工作原理

udev 基本工作原理 udev的 http www.kernel.org pub linux utils kernel hotplug udev.html 此外,關於udev的rules規則的撰寫,網上也有很多文章,假如要獲得最準確的版本,能夠在src code的 樹里找到writing udev...

udev檔案系統的使用和基本工作原理分析

udev相關的文章很多,本文的主要目的不是提供乙個完整的教學文件,對其使用,只是給出網上現有的主要資源。著重分析其基本工作原理以及在使用中遇到的一些readme文件沒有明確說明的問題。1基本概念 udev的 此外,關於udev的rules規則的撰寫,網上也有很多文章,如果要獲得最準確的版本,可以在s...