Linux裝置節點檔案的建立—從mknod到devfs再到udev
本節是對上處連結的進一步研究。
一、Linux2.4之前手動mknod
如下使用核心介面在Linux2.6核心保留;試驗也可選擇Linux2.6核心。
1.驅動編寫static int __init test_drv_init(void) { int rc; printk("test_driver dev\n"); //註冊裝置 rc = register_chrdev(TEST_MAJOR,"test_dev",&led_fops); if (rc <0){ printk ("register %s char dev error\n","led"); return -1; } printk ("ok!\n"); return 0; out_chrdev: unregister_chrdev(TEST_MAJOR, "mymodule"); out: return -1; }
2.使用者空間
mknod /dev/tankai_dev 240
二、Linux2.6.17之前核心devfs
1.核心配置devfs支援linux-2.6.14/fs/Kconfig
menu "File systems" #add by tank config DEVFS_FS bool "Devfs support" depends on EXPERIMENTAL config DEVFS_MOUNT bool "devfs mount" depends on DEVFS_FS config DEVFS_DEBUG bool "Debug devfs" depends on DEVFS_FS #end tank
linux-2.6.14/fs/Makefile
obj-$(CONFIG_DEVFS_FS) += devfs/
2.驅動編寫
#include <linux/devfs_fs_kernel.h> static int __init test_drv_init(void) { int rc; printk("test_driver dev\n"); //註冊裝置 rc = register_chrdev(TEST_MAJOR,"test_dev",&led_fops); if (rc <0){ printk ("register %s char dev error\n","led"); return -1; } //devfs關鍵 devfs_mk_cdev( MKDEV(TEST_MAJOR, 0),S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP, "tankai_dev"); //devfs printk ("ok!\n"); return 0; out_chrdev: unregister_chrdev(TEST_MAJOR, "mymodule"); out: return -1; }
3.結果
# ls -l /dev/tankai_dev
crw-r----- 1 0 0 240, 0 Jan 1 00:00 /dev/tankai_dev
# mount
rootfs on / type rootfs (rw)
/dev/root on / type ext2 (rw,nogrpid)
none on /dev type devfs (rw)
none on /proc type proc (rw,nodiratime)
# cat /proc/version
Linux version 2.6.14 ([email protected]) (gcc version 3.4.1) #75 Fri Jan 3 15:20:03 CST 2014
#
三、Linux2.6.29核心udev
1.驅動編寫static int __init test_drv_init(void)
{
int rc;
printk("test_driver dev\n");
//註冊裝置
rc = register_chrdev(TEST_MAJOR,"test_dev",&led_fops);
if (rc <0){
printk ("register %s char dev error\n","led");
return -1;
}
//實現動態建立
mymodule_class = class_create(THIS_MODULE, "test_dev");
device_create(mymodule_class, NULL, MKDEV(TEST_MAJOR, 0), NULL, "tankai_dev");
//結束
printk ("ok!\n");
return 0;
out_chrdev:
unregister_chrdev(TEST_MAJOR, "mymodule");
out:
return -1;
}
2.使用者空間udev守護程序完成mknod功能
3.結果
[email protected]:/ # ll /dev/tankai_dev
crw------- root root 240, 0 2014-01-03 05:22 tankai_dev
[email protected]:/ # mount
rootfs / rootfs ro 0 0
tmpfs /dev tmpfs rw,mode=755 0 0
devpts /dev/pts devpts rw,mode=600 0 0
proc /proc proc rw 0 0
sysfs /sys sysfs rw 0 0
none /acct cgroup rw,cpuacct 0 0
tmpfs /mnt/asec tmpfs rw,mode=755,gid=1000 0 0
tmpfs /mnt/obb tmpfs rw,mode=755,gid=1000 0 0
none /dev/cpuctl cgroup rw,cpu 0 0
/dev/block/mtdblock0 /system yaffs2 ro 0 0
/dev/block/mtdblock1 /data yaffs2 rw,nosuid,nodev 0 0
/dev/block/mtdblock2 /cache yaffs2 rw,nosuid,nodev 0 0
/dev/block/vold/179:0 /mnt/sdcard vfat rw,dirsync,nosuid,nodev,noexec,uid=1000,gid=1015,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
/dev/block/vold/179:0 /mnt/secure/asec vfat rw,dirsync,nosuid,nodev,noexec,uid=1000,gid=1015,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
tmpfs /mnt/sdcard/.android_secure tmpfs ro,size=0k,mode=000 0 0
[email protected]:/ # cat /proc/version
Linux version 2.6.29-gb0d93fb-dirty ([email protected]) (gcc version 4.4.3 (GCC) ) #103 PREEMPT Fri Nov 22 13:15:05 CST 2013
[email protected]:/ #
相關推薦
Linux裝置節點檔案的建立—從mknod到devfs再到udev
本節是對上處連結的進一步研究。 一、Linux2.4之前手動mknod 如下使用核心介面在Linux2.6核心保留;試驗也可選擇Linux2.6核心。 1.驅動編寫static int __init test_drv_init(void) { int rc;
《Linux裝置節點建立》使用者空間ueventd建立裝置節點規則
一、devfs、udev和sysfs是什麼關係? linux2.6之前使用devfs裝置檔案系統,它存在與核心空間; linux2.6之後使用udev裝置檔案系統,它存在與使用者空間、但嚴重依賴與sysfs檔案系統。 二、Android(使用linux2.6以後的裝
《Linux裝置節點建立》手動與自動建立裝置節點
一、手動建立 1.驅動模組 test_driver.c //#include <linux/devfs_fs_kernel.h> #include <linux/module.h> #include <linux/types.h>
Linux裝置節點建立》使用者空間ueventd建立裝置節點規則
說明:本文基於Android2.3和Linux2.6,其餘版本僅供參考。 一、devfs、udev和sysfs是什麼關係? linux2.6之前使用devfs裝置檔案系統,它存在與核心空間; linux2.6之後使用udev裝置檔案系統,它存在與使用者空間、但嚴重依賴與sy
《Linux裝置節點建立》核心kobject上報uevent過濾規則
說明:本文基於Android2.3和Linux2.6,其餘版本僅供參考。 一、netlink監聽程式 testnet.c #include <stdio.h> #include <stdlib.h> #include <string.h&g
Linux資料夾檔案建立、刪除;複製,移動
一 Linux刪除資料夾命令 linux刪除目錄很簡單,很多人還是習慣用rmdir,不過一旦目錄非空,就陷入深深的苦惱之中,現在使用rm -rf命令即可。 直接rm就可以了,不過要加兩個引數-rf 即:rm -rf 目錄名字 刪除目錄、檔案 rm(re
Linux下對檔案建立、修改、訪問時間的一些操作
學習,stat,lstat,fstat 1 函式都是獲取檔案(普通檔案,目錄,管道,socket,字元,塊()的屬性。 函式原型 #include <sys/stat.h> int stat(const char *restrict pathname, str
宋牧春: Linux裝置樹檔案結構與解析深度分析(1)
本文轉載自微信公眾號linuxer 作者簡介 宋牧春,linux核心愛好者,喜歡閱讀各種開原始碼(uboot、linux、ucos、rt-thread等),對於優秀的程式碼框架及其痴迷。現就職於一家手機研發公司,任職Android BSP開發工程師。 正文開始 1. Device Tree簡介 裝置樹就是描
宋牧春: Linux裝置樹檔案結構與解析深度分析(2)
作者簡介 宋牧春,linux核心愛好者,喜歡閱讀各種開原始碼(uboot、linux、ucos、rt-thread等),對於優秀的程式碼框架及其痴迷。現就職於一家手機研發公司,任職Android BSP開發工程師。 正文開始 前情提要: 6. platform_device和device_node
Android 系統中裝置節點的建立
查了很多資料,有很多人錯誤地認為是kernel建立的/dev/yourdevice 在最近的kernel中這種說法是不對的, 其實是kernel僅負責在/sys/建立一大堆下目錄和檔案, 而真正的裝置節點是在使用者空間建立的, 在andro
Linux裝置節點、裝置和裝置驅動
Linux裝置分成三種基本型別: 字元裝置塊裝置網路裝置裝置驅動程式也分為對應的三類:字元裝置驅動程式、塊裝置驅動程式和網路裝置驅動程式。 裝置節點被建立在/dev 下,是連線核心與使用者層的樞紐,就是裝置是接到對應哪種介面的哪個 ID 上。 相當於硬碟的inode一
Linux裝置節點
裝置管理是linux中比較基礎的東西,但是由於Linux智慧程度的越來越高,Udev的使用越來越廣泛,使得越來越多的Linux新使用者對 /dev 目錄下的東西變得不再熟悉。有時候遇見問題就會變得抓狂本文是我在寫作《DIY 一個基於LFS的實用 Mini-LAPP 伺服器》
linux 可執行檔案建立 學習筆記
劉柳 + 原創作品轉載請註明出處 + 《Linux核心分析》MOOC課程+http://mooc.study.163.com/course/USTC-1000029000[email protected].com 一. 可執行檔案的建立 預
linux可執行檔案建立過程 淺析
特色: - 加入動態演示,去驗證exec過程 - 加入自己理解的資料結構圖示(自創/網路引用) linux世界很大,我想去看看 一. 可執行檔案的建立 基礎 預處理、編譯和連結 實踐 shiyanlou:~/ $ cd Code
Linux 字元裝置驅動結構(二)—— 自動建立裝置節點
上一篇我們介紹到建立裝置檔案的方法,利用cat /proc/devices檢視申請到的裝置名,裝置號。 第一種是使用mknod手工建立:mknod filename type major minor 第二種是自動建立裝置節點:利用u
Linux:核心之解析DTS裝置樹檔案並建立裝置的過程
核心之解析DTS裝置樹檔案並建立裝置的過程 在這裡,我分析的是核心原始碼來自谷歌官方Android7.1.2原始碼包經過打補丁包"SC60_Android7.1.2_Quectel_SDK_r270060_20180731.tar.gz"後得到的. 本文分析時使用的
linux驅動:自動建立裝置節點
在載入驅動模組後,就要自己使用mknod建立裝置節點,這樣雖然是可行的,但是比較麻煩。我們可以在__init()函式裡面新增一些函式,自動建立裝置節點。建立裝置節點使用了兩個函式 class_create()和device_create(),當然在__exit()函式裡,要使
linux driver ------ 字元裝置驅動之“ 建立裝置節點流程 ”
在字元裝置驅動開發的入門教程中,最常見的就是用device_create()函式來建立裝置節點了,但是在之後閱讀核心原始碼的過程中卻很少見device_create()的蹤影了,取而代之的是device_register()與device_add(),將device_create()函式展開不難發現:其實de
Linux裝置驅動第四天(自動建立裝置節點、LED驅動程式)
回顧: 與驅動有關的幾個重要結構體 1,struct cdev //從軟體上代表硬體裝置 { dev_t dev;//裝置號 = 主裝置號+次裝置號 struct file_operations f_ops; } 2,stru
linux用mknod建立裝置(節點)
mknod命令用於建立一個裝置檔案,即特殊檔案 首先要明白什麼是裝置檔案,簡單的我們說 作業系統與外部裝置(入磁碟驅動器,印表機,modern,終端 等等)都是通過裝置檔案來進行通訊的,在Unix/Linux系統與外部裝置通訊之前,這個裝置必須首先要有一個裝置檔案,裝置檔案