導航:首頁 > 編程系統 > linux設備節點操作

linux設備節點操作

發布時間:2023-07-15 00:09:47

linux 一個驅動怎麼對應多個節點的操作

Linux 中的設備有2種類型:字元設備(無緩沖且只能順序存取)、塊設備(有緩沖且可以隨機存取)。每個字元設備和塊設備都必須有主、次設備號,主設備號相同的設備是同類設備(使用同一個驅動程序)。這些設備中,有些設備是對實際存在的物理硬體的抽象,而有些設備則是內核自身提供的功能(不依賴於特定的物理硬體,又稱為"虛擬設備")。每個設備在 /dev 目錄下都有一個對應的文件(節點)。可以通過 cat /proc/devices 命令查看當前已經載入的設備驅動程序的主設備號。內核能夠識別的所有設備都記錄在原碼樹下的 Documentation/devices.txt 文件中。在 /dev 目錄下除了字元設備和塊設備節點之外還通常還會存在:FIFO管道、Socket、軟/硬連接、目錄。這些東西沒有主/次設備號。
了解這些設備的最基本要求就是對 每個設備文件的含義了如指掌,下面就醫列表的形式列出常見的設備文件以及相應的含義(比較偏僻的就省略了):
關注驅動人生,了解更多電腦相關資訊

Ⅱ Linux驅動與設備節點簡介 & Android內核與Linux內核的區別

驅動是內核的一部分,作為直接訪問物理硬體的一個軟體層,用於應用程序與物理硬體設備通信。內核包含多種驅動,如WIFI、USB、Audio、藍牙、相機、顯示驅動。

(1)設備驅動程序三類:字元設備驅動程序、塊設備驅動程序、網路設備驅動程序;

(2)對應Linux三類設備:字元設備、塊設備、網路設備;

(3)常見字元設備:滑鼠、鍵盤、串口、控制台等;

(4)常見塊設備:各種硬碟、flash磁碟、RAM磁碟等;

(5)網路設備(網路介面):eth0、eth1,註:網路設備沒有設備節點,應用程序通過Socket訪問網路設備。由於網路設備面向報文,較難實現相關read、write等文件讀寫函數,所以驅動的實現也與字元設備和塊設備不同。

Linux使用對文件一樣的管理方式來管理設備,所有設備都以文件的形式存放在/dev目錄下,系統中的每個字元設備或者塊設備都必須為其創建一個設備文件,它包含了該設備的設備類型(塊設備或字元設滾橋備)、設備號(主設備號和次設備號)以及設備訪問控制屬性等。設備節點通過 mknod 命令創建,也可以由Udev用戶工具軟體在系統啟動後根據/sys目錄下每個設備的實際信息創建,使用後一種方式可以為每個設備動態分配設備號。

Linux中設備節點通過「mknod」命令創建,創建時需要指定主設備號和次設備號,即指定對應的驅動程序和對應的物理設備(訪問設備節點時就相當於通過其設備號訪問驅動程序進而間接訪問到物理設備)。主設備號用來區分不同種類的設備,而次設備號用來區分同一類大舉猛型的多個設備。對於常用設備,Linux有約定俗成的編號,如硬碟的主設備號是3

理解:應用程序通過訪問設備節點讀取主設備號和次設備號,通過主設答枯備號找對應的驅動,通過次設備號對應到具體物理設備。註:1個驅動對應一類設備,並用唯一主設備號標識。

Linux支持的各種設備的主設備號定義在include/linux/major.h文件中,已經在官方注冊的主設備號和次設備號在Documentation/devices.txt文件中。

Android系統最底層是Linux,並且在中間加上了一個Dalvik / ART的Java虛擬機,從表面層看是Android運行庫。每個Android應用都運行在自己的進程上,享有Dalvik / ART虛擬機為它分配的專有實例,並支持多個虛擬機在同一設備上高效運行,虛擬機執行的是專有格式的可執行文件(.dex) - 該格式經過優化,以將內存好用降到最低。

Android內核和Linux內核的差別主要體現在如下11個方面:

Ⅲ LINUX設備節點

是這樣的,之所以有來的源時候不需要你自己創建節點,因為有程序自動創建。
class_create和device_create,具體用法很簡單,你自己查查就知道了。

還有,mknod都是在剛開始學習的時候用到,難道你以後寫驅動都要手動建立設備節點嗎?

Ⅳ Linux如何創建設備節點

mknod 設備節點名稱 設備類型 主設備號 次設備號,例如:mknod memdev c 260
0,創建好之後會在/dev目錄下看到一個字元設備

Ⅳ linux內核怎麼訪問設備節點

設備節點代表是每個機算機硬體,那個軟體要用那個硬體,它就會打開那內設備節點嘛。。。 /dev/ttyS0這個是串容口0 也就是windows 裡面的com1 ,只有要用到串口0的程序才會打開這個設備節點。 個人愚見,僅供參考,望及時採納

Ⅵ 如何解決Linux下USB設備節點名不固定問題

Linux下USB設備節點名不固定問題經常會遇到,下面就是解決的方法:
以USB轉串口為例,通常設備節點名為ttyUSBx(x為0~n),Linux內核會根據插入設備的先後順序進行編號的分配,比如第一個插入的設備編號為0,然後依此加1。
如果僅僅以設備節點ttyUSBn來區別具體是哪個設備,因為末位的編號是隨時會變的,所以就會造成混亂。無法保證A設備就是0,B設備就是1。其實這個問題在LDD3上已經提到過,目前的內核早已經解決類似的問題,將所以有USB設備都導致到sys文件系統中,其實每個USB埠都有唯一的埠號,相當於每個門店的門牌號。只要我們依據埠號來進行設備的區分,那麼問題就迎刃而解了。
比如當前設備插入兩個USB轉串口設備後,查看ttyUSBn所在埠的埠號:
root@android:/ $ ls -l /sys/class/tty/
...
lrwxrwxrwx root root 2011-01-01 13:40 ttyUSB0 -> ../../devices/ff540000.usb/usb3/3-1/3-1.1/3-1.1:1.0/ttyUSB0/tty/ttyUSB0
lrwxrwxrwx root root 2011-01-01 13:43 ttyUSB1 -> ../../devices/ff540000.usb/usb3/3-1/3-1.2/3-1.2:1.0/ttyUSB1/tty/ttyUSB1
root@android:/ $ 12345

其中ttyUSB0所在的埠號為3-1.1,而ttyUSB1所在的埠號為3-1.2。
其它類型USB設備同理,以上思路清理完畢。
查看系統當前usb設備,下面是對第二列排序的結果。
$ lsusb
Bus 001 Device 001: ID xxx:xxx Linux Foundation 2.0 root hub
Bus 001 Device 002: ID xxx:xxx Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 003: ID xxx:xxx Genesys Logic, Inc. GL827L SD/MMC/MS Flash Card Reader
Bus 001 Device 005: ID xxx:xxx Philips (or NXP)
Bus 002 Device 001: ID xxx:xxx Linux Foundation 2.0 root hub
Bus 002 Device 002: ID xxx:xxx Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 003: ID xxx:xxx Intel Corp.
Bus 003 Device 001: ID xxx:xxx Linux Foundation 2.0 root hub
Bus 004 Device 001: ID xxx:xxx Linux Foundation 3.0 root hub

第二列是usb設備的hub編號。pc中usb設備都是接在hub上的,即使你的主板提供好多usb口,他們實際都是接在hub上的。
第四列是usb設備編號,設備在本機的編號。

所以,上面信息顯示一共有4個usb hub(3個usb2.0,一個usb3.0)。如果
黑體字部分是我機器上的三個設備,001.003 是機箱自帶讀卡器,001.005是無線鍵盤,002.003是intel無線網卡藍牙模塊(具體怎麼知道的往下看)。

usb設備也可以用在內核文件中找到/sys/bus/usb/devices。linux將所有設備驅動映射到了/sys下。
ls -1 /sys/bus/usb/devices/
1-0:1.0
1-1
1-1:1.0
1-1.2
1-1.2:1.0
1-1.4
1-1.4.1
1-1.4:1.0
1-1.4.1:1.0
1-1.4.1:1.1
1-1.4.1:1.2
1-1.5
1-1.5:1.0
1-1.5:1.1
1-1.5:1.2
2-0:1.0
2-1
2-1:1.0
2-1.5
2-1.5:1.0
2-1.5:1.1
3-0:1.0
4-0:1.0
usb1
usb2
usb3
usb4
都是符號連接。也可以用ls -l /sys/bus/usb/devices/ 看具體位置

輸出看起來比較亂。用 udevadm工具能比較清楚列出設備信息。命令看起來是這樣的:
udevadm info -p /sys/bus/usb/devices/usb1 -q property

那怎麼找出是那個usb設備呢?
Bus 002 Device 003: ID xxx:xxx Intel Corp.
第二列,002 就要在所有2開頭的文件去找,下面的符合第一規則。
2-0:1.0
2-1
2-1:1.0
2-1.5
2-1.5:1.0
2-1.5:1.1
通常系統的usb hub占據了`-`減號後第一位0。第一個 2-0:1.0,就是usb hub。

2-1.5*文件就是上面的設備。
$ udevadm info -p /sys/bus/usb/devices/2-1.5 -q property
BUSNUM=002
DEVNAME=/dev/bus/usb/002/003
DEVNUM=003
............
ID_MODEL_ID=xxx
............
ID_VENDOR=xxx
............
ID_VENDOR_FROM_DATABASE=Intel Corp.
............
002和003 就是lsusb 的第2/4列. 第6列,來自modelID和vender。
lsusb中的的東東就是這么來的。

那問題是怎麼知道是藍牙呢? 答案是繼續用udevadm查:
$ udevadm info -p /sys/bus/usb/devices/2-1.5:1.0 -q property
ID_USB_CLASS_FROM_DATABASE=Wireless
ID_USB_PROTOCOL_FROM_DATABASE=Bluetooth
ID_USB_SUBCLASS_FROM_DATABASE=Radio Frequency
ID_VENDOR_FROM_DATABASE=Intel Corp.

Ⅶ linux載入dts的時候會創建設備節點嗎

From:http://m.blog.csdn.net/blog/liliyaya/9188193

1. 在\kernel\of\fdt.c 中有如下初始化函數 注釋上:展開設備樹,創建device_nodes到全局變數allnodes中

void __init unflatten_device_tree(void)
{
__unflatten_device_tree(initial_boot_params, &allnodes,
early_init_dt_alloc_memory_arch);

/* Get pointer to "/chosen" and "/aliasas" nodes for use everywhere */
of_alias_scan(early_init_dt_alloc_memory_arch);
}
unflatten_device_tree函數被setup_arch函數調用,
因為我們使用得是arm平台所以存在\kernel\arch\arm\kernel\setup.c中
void __init setup_arch(char **cmdline_p)
{
unflatten_device_tree()
}

setup_arch函數在kernel啟動是被調用,如下啟動kernel存在\kernel\init\main.c中
asmlinkage void __init start_kernel(void)
{
setup_arch(&command_line);
}

這些工作完成解析DTS文件。保存到全局鏈表allnodes中。

2、在makefile中有這段話來編譯dts文件:

$(obj)/A20%.dtb: $(src)/dts/A20%.dts FORCE
$(call if_changed_dep,dtc)

$(obj)/A68M%.dtb: $(src)/dts/A68M%.dts FORCE
$(call if_changed_dep,dtc)

和.c文件生成.o文件一樣 回生成.dtb文件。在
/home/liyang/workspace/SZ_JB-mr1-8628-bsp-1012/out/target/proct/msm8226/obj/KERNEL_OBJ/arch/arm/boot
目錄下,與zimage一個目錄。

3、
在 board-8226.c中有初始化函數-->啟動自動掉用
void __init msm8226_init(void)
{
of_platform_populate(NULL, of_default_bus_match_table, adata, NULL);
}

of_platform_populate在kernel\driver\of\platform.c中定義,回查詢

root = root ? of_node_get(root) : of_find_node_by_path("/");
for_each_child_of_node(root, child)
{
rc = of_platform_bus_create(child, matches, lookup, parent, true);
if (rc)
break;
}
of_node_put(root);

在這里用到得函數of_find_node_by_path會最終調用到kernel\driver\of\base.c中得函數
struct device_node *of_find_node_by_path(const char *path)
{
遍歷第1步中得allnodes找到根節點
}

of_platform_bus_create()函數中創建得內容存在了 adata中。

以下內容為轉載:

(2)使用DTS注冊匯流排設備的過程

以高通8974平台為例,在注冊i2c匯流排時,會調用到qup_i2c_probe()介面,該介面用於申請匯流排資源和添加i2c適配器。在成功添加i2c適配器後,會調用of_i2c_register_devices()介面。此介面會解析i2c匯流排節點的子節點(掛載在該匯流排上的i2c設備節點),獲取i2c設備的地址、中斷號等硬體信息。然後調用request_mole()載入設備對應的驅動文件,調用i2c_new_device(),生成i2c設備。此時設備和驅動都已載入,於是drvier裡面的probe方法將被調用。後面流程就和之前一樣了。
簡而言之,Linux採用DTS描述設備硬體信息後,省去了大量板文件垃圾信息。Linux在開機啟動階段,會解析DTS文件,保存到全局鏈表allnodes中,在掉用.init_machine時,會跟據allnodes中的信息注冊平台匯流排和設備。值得注意的是,載入流程並不是按找從樹根到樹葉的方式遞歸注冊,而是只注冊根節點下的第一級子節點,第二級及之後的子節點暫不注冊。Linux系統下的設備大多都是掛載在平台匯流排下的,因此在平台匯流排被注冊後,會根據allnodes節點的樹結構,去尋找該匯流排的子節點,所有的子節點將被作為設備注冊到該匯流排上。

Ⅷ 請問linux2.6內核驅動程序的自動創建設備節點的 class_create device_create 創建設備問題。

是這么回事,當你自己要寫一個字元設備或者看別人寫的是字元設備時內,要定義一個字元容設備的結構體struct cdev{/*裡面是一些字元設備的相關屬性,包括file_operations結構體,設備號等等*/},然後調用register_chrdev_region(),申請設備號,再用cdev_add()想內核注冊設備,這里,內核就知道你要注冊的就是字元設備了,同理,如果是塊設備的話用register_blkdev()來注冊塊設備,經過一系列的初始化後添加add_disk(),內核也就知道你添加的是塊設備了

閱讀全文

與linux設備節點操作相關的資料

熱點內容
逍遙安卓微信驗證 瀏覽:579
5g網路什麼時候普及河北邢台 瀏覽:709
編程和運營哪個更適合創業 瀏覽:893
尤里x怎麼升級 瀏覽:399
做業務績效考核需要哪些數據 瀏覽:433
dnf85版本劍魔刷圖加點 瀏覽:407
手機硬碟測試架可以讀取哪些數據 瀏覽:704
ug前後處理結算結果找不到文件 瀏覽:769
網頁框架拆分代碼 瀏覽:382
未來十年網路安全有什麼影響 瀏覽:362
win10更新後進不了劍靈 瀏覽:243
iphone471激活出錯 瀏覽:648
怎麼把文件拷到u盤 瀏覽:620
中伊簽署文件視頻 瀏覽:661
電信光寬頻網路不穩定 瀏覽:504
網路崗軟路由 瀏覽:995
黑莓z10在哪裡下載app 瀏覽:310
net批量下載文件 瀏覽:696
怎麼把蘋果一體機文件拷貝 瀏覽:117
sql文件怎麼寫 瀏覽:9

友情鏈接