私のプロジェクトでは、ユーザー空間とカーネル空間の間の通信にcharドライバーを使用しています。関数copy_to_user(void user *to, const void *from, unsigned long n)
を使用して、カーネルスペースからユーザースペースバッファーにデータをコピーします。この関数は_#include < asm/uaccess.h >
_ヘッダーファイルの下にあります。 Linuxカーネルバージョン4.4.0-59-generic、Ubuntu OSバージョン16.04 LTSを使用してプロジェクトをコンパイルしましたが、エラーや警告なしで問題なく機能しました。希望する出力が得られます。
Linuxカーネルバージョン4.12.8、Ubuntu OSバージョン16.04.2 LTSを使用して同じプロジェクトをコンパイルすると、コンパイル時に警告がスローされます_WARNING: "copy_to_user" [/home/ldrv1/Desktop/Vijay/code/build/uts.ko] undefined!
_。モジュールのinsmodを実行すると、次のようなエラーが発生します_insmod: ERROR: could not insert module uts.ko: Unknown symbol in module
_。 _#include <asm/uaccess.h>
_ヘッダーファイルは4.12.8カーネルバージョンでもサポートされていると思います。それ以外の場合、致命的なエラーが発生します。コンパイル中にそのようなファイルやディレクトリのエラーは発生しません。 apt-get install linux-headers-$(uname -r)
コマンドを使用してLinuxカーネルヘッダーを更新しようとすると、次の応答が返されました。
_Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package linux-headers-4.12.8
E: Couldn't find any package by glob 'linux-headers-4.12.8'
E: Couldn't find any package by regex 'linux-headers-4.12.8'
_
このOSバージョン16.04.2 LTSにはlinux-headers-4.10.0-35があります。この警告を取り除くにはどうすればよいですか?提案とサポートに感謝します。さらに詳しい情報が必要な場合は、お気軽にお問い合わせください。
4.12.8には#include <linux/uaccess.h>
を使用する必要があります。これが definition です。
4.4では、一部のドライバは#include <asm/uaccess.h>
を使用し、その他のドライバは#include <linux/uaccess.h>
を使用します。
#include <linux/uaccess.h>
が望ましいと思います。
apt-get update
を実行してから、apt-get install linux-headers-generic
を実行する必要があります。
copy_to_userおよびcopy_from_userがasm/uaccess.h。この関数を定義するときにいくつかの問題があると思います。カーネルデバイス空間とユーザー空間の間のデータ転送に関するいくつかの例を使用して、キャラクターデバイスドライバーを作成しました。私のgithubを参照してください: my code を参照してください。あなたに役立つと感じたらスターを付けてください:)例3には小さなバグがあります。私はそれらを理解していますが、例1と例2はうまく機能します
Bronislav Elizavetiの答えは正しいです。 #include <asm/uaccess.h>
の代わりに#include <linux/uaccess.h>
を使用すると、警告が表示されません。
それでも#include <asm/uaccess.h>
のみを使用したい場合は、_copy_to_user
ではなくcopy_to_user
を使用する必要があります(同じ引数を使用)。単純な_
で十分です。