1. 程式人生 > >Linux裝置節點檔案的建立—從mknod到devfs再到udev

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到devfsudev

本節是對上處連結的進一步研究。 一、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系統與外部裝置通訊之前,這個裝置必須首先要有一個裝置檔案,裝置檔案