0

さて、カーネルスペースにいくつかのシステムコールを正常に追加しました。現在、私は彼らの主な意図をコメントアウトしています。データがユーザースペースからカーネルスペースに正常に、そして期待どおりに渡されていることを確認したかったのです。現在、ユーザースペースで変数をunsigned longとして宣言し、printkを介して出力すると、値が同じにならないという問題が発生しています。私はこのトピックに関する他の問題を見てきましたが、それらは役に立たなかったようです。人々は単にprintkを間違って使用していたと思います。以前、文字列を出力するだけのカーネルスペースでこれをテストしましたが、すべて問題がなかったので、ユーザースペースから渡されるデータを追加して、この問題が発生しました。

ユーザースペース:

#define _GNU_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <linux/kernel.h>
#include <sys/syscall.h>

#define __NR_createQueue 350

long createQueue_syscall(unsigned long id){
     return syscall(__NR_createQueue);
}

int main(int argc, char *argv[]){
     unsigned long qid = 47;  // ID for a queue

     createQueue_syscall(qid);
     return 0;
}

カーネルスペース:

#include linux/kernel.h  

asmlinkage long createQueue(unsigned long id){

  printk("  The queue ID is: %lu \n", id);

  return 0;
}

すべて正常にコンパイルされ、警告やエラーは発生しません。しかし、:を実行すると、期待していた47ではなく1334886164dmesg | tail -20のような値が得られます。(はい、必要なすべての、、、などを実行しました)。まるでゴミを掴んだり、メモリを使いすぎたりしているようです。しかし、私は途方に暮れています。何か考え/アイデアはありますか?makemake module_install installreboot

Many Thanks!
4

1 に答える 1

0

関数を次のように変更する必要があります。

long createQueue_syscall(unsigned long id){

    return syscall(__NR_createQueue, id); /* note the additional parameter */

}

IDが渡されていないため、ランダムな整数が割り当てられていると推測しています。

于 2013-03-11T08:44:47.817 に答える