linux跨节点创建文件,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

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

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

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值