Linux设备文件系统节点的创建—从mknod到devfs再到udev

《Linux设备节点创建》手动与自动创建设备节点

本节是对上处链接的进一步研究。

一、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

skyeye模拟uboot启动linux(initrd方式)

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 (root@tankai-G41T-R3) (gcc version 3.4.1) #75 Fri Jan 3 15:20:03 CST 2014
# 

三、Linux2.6.29内核udev

Android2.3及Linux2.6.29内核模拟器版本编译与调试

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.结果

root@android:/ # ll /dev/tankai_dev                                            
crw------- root     root     240,   0 2014-01-03 05:22 tankai_dev
root@android:/ # 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
root@android:/ # cat /proc/version                                             
Linux version 2.6.29-gb0d93fb-dirty (root@tankai-G41T-R3) (gcc version 4.4.3 (GCC) ) #103 PREEMPT Fri Nov 22 13:15:05 CST 2013
root@android:/ # 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值