Создание записи процедуры под существующей записью

Мой модуль ядра создал бы запись под существующей записью proc, например, /proc/sys,

Таким образом, обычный вызов proc_create терпит неудачу.

Затем я пытаюсь посмотреть, есть ли функция для получения правильного parent node, проверяя proc_fs.h, но безрезультатно.

Что мне теперь делать?


person daisy    schedule 24.08.2013    source источник


Ответы (1)


Надеюсь, этот код поможет вам понять

#include<linux/module.h>
#include<linux/kernel.h>
#include<linux/fs.h> /*this is the file structure, file open read close */
#include<linux/cdev.h> /* this is for character device, makes cdev avilable*/
#include<linux/semaphore.h> /* this is for the semaphore*/
#include<linux/uaccess.h> /*this is for copy_user vice vers*/
#include<linux/proc_fs.h>

#define MAX_LEN 1024
int read_info(char *page, char **start, off_t off,  int count, int *eof, void *data);
int write_info(struct file *filp, const char __user *buffer, unsigned long length, void *data);
int proc_init(void);
void proc_clean(void);


static struct proc_dir_entry *proc_entry;
static char *info;
static int write_index;
static int read_index;

int write_info(struct file *filp, const char __user *buffer, unsigned long length, void *data) {
    int capacity = (MAX_LEN - write_index) +1;
    if(length > capacity) {
        printk(KERN_INFO "NO sapce to write into peoc file \n");
        return -1;
    }
    if(copy_from_user(&info[write_index], buffer, length)) 
        return -2;
    write_index += length;
    printk(KERN_INFO " megharaj proc writing succesful, %d write \n", length);
    return length;
}

int read_info(char *page, char **start, off_t off, int count, int *eof, void *data) {
    int len;
    len = sprintf(page, "%s\n", &info[read_index]);
    read_index += len;
    printk(KERN_INFO " megharaj proc reading succesful, %d read \n", len);
    return len;
}


int proc_init(void) 
{
    int ret = 0;
    info = (char *)vmalloc(MAX_LEN);
    memset(info, 0 , MAX_LEN);
/*truct proc_dir_entry *create_proc_entry(const char *name, mode_t mode,
                                         struct proc_dir_entry *parent);*/
    proc_entry = create_proc_entry("megharaj_proc", 0666, NULL);
    if(proc_entry == NULL) {
        vfree(info);
        printk(KERN_INFO " megharaj proc not created \n");
        ret = -ENOMEM;
    }
    else {
        write_index = 0;
        read_index = 0;
        proc_entry->read_proc = read_info;
        proc_entry->write_proc = write_info;
        printk(KERN_INFO " megharaj proc created \n");
    }
    return ret;
}

void proc_clean(void) 
{
    vfree(info);
    remove_proc_entry("megharaj_proc", NULL);

}

MODULE_LICENSE("GPL");   
module_init(proc_init);
module_exit(proc_clean);

сделать файл

obj-m   := proc.o

KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD       := $(shell pwd)

all:
    $(MAKE) -C $(KERNELDIR) M=$(PWD)

clean:
    rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
person Megharaj    schedule 19.09.2013
comment
Вы создаете запись процедуры под /proc, а не под существующей записью процедуры. Итак.. вы не ответили на вопрос ;-P - person daisy; 20.09.2013
comment
@warl0ck create_proc_entry(megharaj_proc, 0666, NULL); megharaj_proc будет файлом внутри proc. Если NULL указывает, что запись сделана в /proc, если вы хотите создать запись proc в любом каталоге /proc, вместо null просто замените NULL на /proc/directory - person Megharaj; 20.09.2013
comment
@warl0ck struct proc_dir_entry *create_proc_entry(const char *name, mode_t mode, struct proc_dir_entry *parent); это синтаксис. если у вас есть какие-либо проблемы, дайте мне знать. Дайте мне знать, что именно вам нужно, это было бы очень полезно :) - person Megharaj; 20.09.2013
comment
@warl0ck также выполните этот код и посмотрите. сделать то же самое, собрать make, затем insmod модуль. Затем вы можете найти файл внутри /proc/megharaj_proc. вы можете прочитать его по кат /proc/megharaj_proc, а также вы можете записать его по эхо-данным, чтобы написать › /proc/megharaj_proc. - person Megharaj; 20.09.2013
comment
@ warl0ck еще одна вещь, меня зовут megharaj, поэтому я дал имя записи proc таким образом. Пожалуйста, измените соответственно. Кроме того, лучший способ научиться — выполнить код, увидеть результат и переписать один раз самостоятельно. - person Megharaj; 20.09.2013
comment
Я не думаю, что вы поняли мой вопрос. Вместо этого попробуйте создать запись под /proc/sys. Посмотри, сможешь ли ты это сделать.. - person daisy; 20.09.2013