2009年9月6日 星期日

/dev/null的小研究


不知道為什麼我現在用的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);
不過這裡重要的是要找到他用的major number跟minor number
這個時候 就看到了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
然後在這裡MEM_MAJOR是1
這樣我確定l4linux裡面有實做/dev/null

所以就很放心的用上面的command 建立node 然後用echo測試
echo "hello" > /dev/null 看到/dev/null的size沒有變 很好成功了

沒有留言:

張貼留言