0

これは私の最初のカーネルで、以下のサンプル プログラムでは、単純な proc/filesystem を作成しました。カーネルを cat するたびに READ が 3 回呼び出されます。なぜこれをしているのか不思議です。

アウトとコードは以下のとおりです。

cat /proc/myKernel
dmesg | grep -i myKernel
myKernel: Read (/proc/myKernel) called
myKernel: Read (/proc/myKernel) called
myKernel: Read (/proc/myKernel) called

int myKernel_read( char *buffer, char **bufferLocation, off_t offset, int bufferLength, int *eof, void *data )
{
    int ret = 0;
    u64 msrvalue;

    printk(KERN_INFO "myKernel: Read (/proc/%s) called\n", procFile_name);
    ret = sprintf(buffer, "Hello World\n");

    return ret;
}

static int __init myKernel_init(void)
{
    entry = create_proc_entry(procFile_name, 0644, NULL);
    if(!entry)
        printk(KERN_INFO "myKernel: error registering proc control file\n");
    else 
    {
        entry->read_proc = myKernel_read;
    }

    return 0;
}
4

1 に答える 1

2

問題は ret 値にあります。なぜこれが 3 回呼び出されるのかはまだわかりませんが、オフセットがゼロ未満の場合は実際の読み取りを行う必要があります。

int myKernel_read( char *buffer, char **bufferLocation, off_t offset, int bufferLength, int *eof, void *data )
{
    int ret;
    u64 msrvalue;

    if (offset > 0) 
    {
        /* we have finished to read, return 0 */
        ret  = 0;
    } else 
    {
        /* fill the buffer, return the buffer size */
                // DO THE READ HERE. NOT OUTSIDE
                //
                printk(KERN_INFO "myKernel: Read (/proc/%s) called\n", procFile_name);
        ret = sprintf(buffer, "MyKernel = %x\n", 0);
    }

    return ret;
}
于 2012-10-26T20:41:51.777 に答える