Скрыть
/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
Re:/dev/0xff
>а подручными средствами сделать из нуля 0xFF я не осилил
а в file собственно только 0xFF.
Mozilla/5.0 (X11; Linux i686; rv:7.0.1) Gecko/20100101 Firefox/7.0.1