anonymous@RULINUX.NET~# Last login: 2024-12-25 23:13:59
Регистрация Вход Новости | Разметка | Пользователи | Галерея | Форум | Статьи | Неподтвержденное | Трекер | Правила форума | F.A.Q. | Ссылки | Поиск
[#] [Добавить метку] [Редактировать]
Скрыть

/dev/0xff

Вот, во время бана анонимусов и по статье с оттеняющего сайта [1] написал драйвер устройства, которое возвращает поток 0xff (по аналогии с /dev/zero). Не знаю как вам, а мне показалось странным отсутствие подобного устройства ранее, а подручными средствами сделать из нуля 0xFF я не осилил.

Итак, код [2]:

c
// файл 0xff_dev.c
#include <linux/fs.h>
#include <linux/miscdevice.h>
#include <linux/init.h>
#include <linux/module.h>
#include <asm/uaccess.h>
#include <linux/sched.h>

MODULE_LICENSE("PROHIBITED");
MODULE_AUTHOR("Anonymous <[email protected]>");
MODULE_VERSION("0.1");

static ssize_t OxFF_read (struct file *file, char __user *buf,
                          size_t count, loff_t *ppos)
{
        size_t written = 0;
        if (count == 0)
                return 0;

        if (access_ok(VERIFY_WRITE, buf, count) == 0)
                return -EFAULT;

        while(count)
        {

                if (__put_user(0xFF, buf) != 0)
                        return -EFAULT;
                count--;
                written++;
                buf++;
                cond_resched();
        }

        return written ? written : -EFAULT;
}

static const struct file_operations OxFF_fops = {
        .owner = THIS_MODULE,
        .read = OxFF_read,
};

static struct miscdevice OxFF_dev = {
        MISC_DYNAMIC_MINOR, "0xff", &OxFF_fops
};

static int __init OxFF_init (void)
{
        int ret = misc_register (&OxFF_dev);

        if (ret)

                printk(KERN_ERR "unable to register misc device\n");

        printk(KERN_INFO "0xff_mod loaded successful.\n");

        return ret;
}

static void __exit OxFF_exit (void)
{
        misc_deregister (&OxFF_dev);

        printk(KERN_INFO "0xff_mod unloaded successful.\n");
}

module_init(OxFF_init);
module_exit(OxFF_exit);
 


Makefile [3]:
make
# Файл Makefile
CURRENT=$(shell uname -r)
KDIR=/lib/modules/$(CURRENT)/build
PWD=$(shell pwd)
DEST=/lib/modules/$(CURRENT)/misc

TARGET = 0xff_dev
obj-m      := $(TARGET).o

default:
        $(MAKE) -C $(KDIR) M=$(PWD) modules

clean:
        @rm -f *.o .*.cmd .*.flags *.mod.c *.order
        @rm -f .*.*.cmd *.symvers *~ *.*~ TODO.*
        @rm -fR .tmp*
        @rm -rf .tmp_versions
 


Сборка заключается просто в выполнении make в текущей директории (при условии установленных сборочных файлах ядра (kernel-devel для Fedora)):

text
>make
make -C /lib/modules/2.6.35.13-92.fc14.i686/build M=/tmp/0xff_module modules
make[1]: Вход в каталог `/usr/src/kernels/2.6.35.13-92.fc14.i686'
  CC [M]  /tmp/0xff_module/0xff_dev.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /tmp/0xff_module/0xff_dev.mod.o
  LD [M]  /tmp/0xff_module/0xff_dev.ko
make[1]: Выход из каталога `/usr/src/kernels/2.6.35.13-92.fc14.i686'
 


Загрузка модуля (от root-а):
text
> insmod 0xff_dev.ko
> tail -n1 /var/log/messages
Jan 1 00:01:00 rulinux.net kernel: 0xff_mod loaded successful.
> ls -l /dev/0xff
crw------- 1 root root 10, 56 Jan 1 00:01 /dev/0xff
> chmod 666 /dev/0xff
> ls -l /dev/0xff
crw-rw-rw- 1 root root 10, 56 Jan 1 00:01 /dev/0xff
 


Проверяем от пользователя:
text
> dd if=/dev/0xff bs=13 count=3 | hexdump
0000000 ffff ffff ffff ffff ffff ffff ffff ffff
*
0000020 ffff ffff ffff 00ff                    
0000027
3+0 записей считано
3+0 записей написано
 скопировано 39 байт (39 B), 0,000383714 c, 102 kB/c
 


Замечания к выпуску: ядро малость офигивает от подобной не ГПЛ-угодной лицензии и потому материться в лог при первой загрузке модуля
text
Jan 1 00:01:00 rulinux.net kernel: 0xff_dev: module license 'PROHIBITED' taints kernel.
Jan 1 00:01:00 rulinux.net kernel: Disabling lock debugging due to kernel taint
 


[1] http://rus-linux.net/MyLDP/BOOKS/Moduli-yadra-Linux/kern-mod-index.html

[2] http://pastebin.com/pddir8z3

[3] http://pastebin.com/VhPhwgVL

anonymous(*) (2011-11-09 14:02:18)
Отредактировано anonymous по причине опечатки

[Ответить на это сообщение]
[#] [Добавить метку] [Редактировать] Ответ на: /dev/0xff от anonymous 2011-11-09 14:02:18
avatar
Скрыть

Re:/dev/0xff

>а подручными средствами сделать из нуля 0xFF я не осилил

bash
mkfifo 0xff
while true; do cat file >> 0xff; done &
 


а в file собственно только 0xFF.

anonymous(*)(2011-11-09 15:30:17)

Mozilla/5.0 (X11; Linux i686; rv:7.0.1) Gecko/20100101 Firefox/7.0.1
Этот тред читают 1 пользователь:
Анонимных: 1
Зарегистрированных: 0




(c) 2010-2020 LOR-NG Developers Group
Powered by TimeMachine

Valid HTML 4.01 Transitional Правильный CSS!