2012-08-03 3 views
0

로드되지 않고 실행중인 커널 모듈에 netlink를 사용하지 않고 (예 : debugfs) 사용할 수없는 기능을 사용하지 않고 데이터를 보내는 올바른 방법은 무엇입니까?커널 모듈 사용자 공간에서 데이터 가져 오기

대부분의 커널 (또는 모든 현대 커널)에서 작동해야하는 깨끗하고 안전한 방법을보고 싶습니다. 아니면 근사치로 사용하는 것이 좋습니다.

모듈에 데이터를 보내려는 사용자는 루트 사용자이며 데이터 양은 64KB 미만이며 일련의 문자열로 구성됩니다.

필자는 이미 모듈에서 파일을 읽으려고 노력했지만 모듈러 파일은 여러 가지 이유 때문에 크게 눈살을 찌푸리게 할뿐만 아니라 수행하기도 어렵습니다. socket()이 커널에서 지원하지 않는 netlink를 보았습니다. 커널에서 지원되지 않는 debugfs를 보았습니다.

분명히 다른 커널을 사용할 수 있지만 언급 한 것처럼 적절한 방법을 원합니다. 누군가가 사용자 공간에서 보낸 문자열의 printk()를 수행하는 모듈의 간단한 예제를 보여줄 수 있다면 좋을 것입니다.

답변

0

문자 장치를 사용할 수 있다고 생각합니다. Linux Device Driver 3th 3 장. * copy_to_user * 및 * copy_from_user * 기능을 사용하면 사용자 공간에서 데이터를 안전하게 복사 할 수 있습니다.

1

... 단지 사용자 공간에서 보낸 문자열의의 printk()를 할 것입니다 모듈의 간단한 예, printkm.c :

#include <linux/module.h> 
#include <linux/proc_fs.h> 
MODULE_DESCRIPTION("printk example module"); 
MODULE_AUTHOR("[email protected]"); 
MODULE_LICENSE("GPL"); 

static 
ssize_t write(struct file *file, const char *buf, size_t count, loff_t *pos) 
{ 
    printk("%.*s", count, buf); 
    return count; 
} 

static struct file_operations file_ops; 

int init_module(void) 
{ 
    printk("init printk example module\n"); 
    struct proc_dir_entry *entry = proc_create("printk", 0, NULL, &file_ops); 
    if (!entry) return -ENOENT; 

    file_ops.owner = THIS_MODULE, 
    file_ops.write = write; 
    return 0; 
} 

void cleanup_module(void) 
{ 
    remove_proc_entry("printk", NULL); 
    printk("exit printk example module\n"); 
} 

사용 예 :

[email protected]:~# insmod printkm.ko 
[email protected]:~# echo a string >/proc/printk 
[email protected]:~# dmesg|tail -1 
[193634.164459] a string 
+0

I [insmod] (https://github.com/vadmium/module-init-tools/blob/master/insmod.c)가'알 수 없음 (Unknown) '을 잘못 출력하기 때문에 module_init 함수에서'return -ENOENT'를하는 것이 현명하지 않다는 것을 알아 두십시오. 기호'모듈. 시스템 호출 ** init_module() **에 대해 insmod에서 사용되거나 다른 문서화 된 다른 오류도 마찬가지입니다. 오류가 적은 오류 코드를 EIDRM, EUCLEAN 또는 ECANCELED로 사용하는 것이 좋습니다. – Armali