さて、カーネルスペースにいくつかのシステムコールを正常に追加しました。現在、私は彼らの主な意図をコメントアウトしています。データがユーザースペースからカーネルスペースに正常に、そして期待どおりに渡されていることを確認したかったのです。現在、ユーザースペースで変数を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
のような値が得られます。(はい、必要なすべての、、、などを実行しました)。まるでゴミを掴んだり、メモリを使いすぎたりしているようです。しかし、私は途方に暮れています。何か考え/アイデアはありますか?make
make module_install install
reboot
Many Thanks!