牛骨文教育服务平台(让学习变的简单)

18.5. TTY 设备的 proc 和 sysfs 处理

tty 核心提供一个非常容易的方式给任何 tty 驱动来维护一个文件在 /proc/tty/driver 目录中. 如果驱动定义 read_proc 或者 write_proc 函数, 这个文件被创建. 接着, 任何在这个文件上的读或写调用被发送给这个驱动. 这些函数的格式只象标准的 /proc 文件处理函数.

作为一个例子, 由一个简单的 read_proc tty 回调实现, 只是打印出当前注册的端口号:


static int tiny_read_proc(char *page, char **start, off_t off, int count,
                          int *eof, void *data)
{
        struct tiny_serial *tiny;
        off_t begin = 0;
        int length = 0;
        int i;

        length += sprintf(page, "tinyserinfo:1.0 driver:%s
", DRIVER_VERSION);
        for (i = 0; i < TINY_TTY_MINORS && length < PAGE_SIZE; ++i) {
                tiny = tiny_table[i];
                if (tiny == NULL)

                        continue;
                length += sprintf(page+length, "%d
", i);
                if ((length + begin) > (off + count))
                        goto done;

                if ((length + begin) < off) {
                        begin += length;
                        length = 0;

                }
        }
        *eof = 1;
done:
        if (off >= (length + begin))

                return 0;
        *start = page + (off-begin);
        return (count < begin+length-off) ? count : begin + length-off;
}

tty 核心处理所有的 sysfs 目录和设备创建, 当 tty 驱动被注册时, 或者当单个 tty 设备被创建时, 依赖在 struct tty_driver 中的 TTY_DRIVER_NO_DEVFS 标志. 单个目录一直包含 dev 文件, 它允许用户空间工具来决定分配给设备的主次号. 它还包含一个 device 和 driver 符号连接, 如果一个指向有效的 struct device 的指针被传递给读 tty_register_device 的调用. 除了这 3 个文件, 对单个 tty 驱动不可能在这个位置创建新的 sysfs 文件. 这个会可能在将来的内核发行中改变.