不知道為什麼我現在用的ramdisk上面會沒有/dev/null
所以我就開始看看網路上關於/dev/null的說明
基本上在wiki上面就有很好的說明了
簡單的來說/dev/null就是一個黑洞 什麼丟進去 什麼就會不見
這是一個好東西
知道之後現在就是要想辦法說在ramdisk上面 做出/dev/null
我有看到說打一下的指令就可以了
mknod -m 0666 /dev/null c 1 3
說明一下這個指令(主要是看man的)
這裡的-m是設定這個device的權限
然後/dev/null是這個node的名稱
c是指這是一個怎樣的device
1是major number
3是minor number
這裡要注意的就是以上的major number跟minor number是linux kernel中定義的
像在freebsd就不是這樣的
那究竟現在的我用的l4linux可不可以這樣打就能用了
我就去trace l4linux的source code去找/dev/null的實做(其實我是用google找的)
找到了(linux top)/drivers/char/mem.c 的null_fops就是/dev/null的實做
951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 | static const struct {
unsigned int minor;
char *name;
umode_t mode;
const struct file_operations *fops;
} devlist[] = { /* list of minor devices */
{1, "mem", S_IRUSR | S_IWUSR | S_IRGRP, &mem_fops},
#ifdef CONFIG_DEVKMEM
{2, "kmem", S_IRUSR | S_IWUSR | S_IRGRP, &kmem_fops},
#endif
{3, "null", S_IRUGO | S_IWUGO, &null_fops},
#ifdef CONFIG_DEVPORT
{4, "port", S_IRUSR | S_IWUSR | S_IRGRP, &port_fops},
#endif
{5, "zero", S_IRUGO | S_IWUGO, &zero_fops},
{7, "full", S_IRUGO | S_IWUGO, &full_fops},
{8, "random", S_IRUGO | S_IWUSR, &random_fops},
{9, "urandom", S_IRUGO | S_IWUSR, &urandom_fops},
{11,"kmsg", S_IRUGO | S_IWUSR, &kmsg_fops},
#ifdef CONFIG_CRASH_DUMP
{12,"oldmem", S_IRUSR | S_IWUSR | S_IRGRP, &oldmem_fops},
#endif
};
|
987 988 | if (register_chrdev(MEM_MAJOR,"mem",&memory_fops))
printk("unable to get major %d for memory devs\n", MEM_MAJOR);
|
這個時候 就看到了devlist這個variable
這裡定義了null的minor number是3
接下來找major number
這時看到一個macro 就是MEM_MAJOR他的宣告是在(linux top)/include/linux/major.h中
1 2 3 4 5 6 7 8 9 10 11 12 | #ifndef _LINUX_MAJOR_H
#define _LINUX_MAJOR_H
/*
* This file has definitions for major device numbers.
* For the device number assignments, see Documentation/devices.txt.
*/
#define UNNAMED_MAJOR 0
#define MEM_MAJOR 1
#define RAMDISK_MAJOR 1
#define FLOPPY_MAJOR 2
|
這樣我確定l4linux裡面有實做/dev/null
所以就很放心的用上面的command 建立node 然後用echo測試
echo "hello" > /dev/null 看到/dev/null的size沒有變 很好成功了
沒有留言:
張貼留言