web-dev-qa-db-ja.com

Linuxカーネルバージョン4.12.8で未定義のcopy_to_user

私のプロジェクトでは、ユーザー空間とカーネル空間の間の通信に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があります。この警告を取り除くにはどうすればよいですか?提案とサポートに感謝します。さらに詳しい情報が必要な場合は、お気軽にお問い合わせください。

  1. 4.12.8には#include <linux/uaccess.h>を使用する必要があります。これが definition です。

    4.4では、一部のドライバは#include <asm/uaccess.h>を使用し、その他のドライバは#include <linux/uaccess.h>を使用します。

    #include <linux/uaccess.h>が望ましいと思います。

  2. apt-get updateを実行してから、apt-get install linux-headers-genericを実行する必要があります。

13
user8549610

copy_to_userおよびcopy_from_userasm/uaccess.h。この関数を定義するときにいくつかの問題があると思います。カーネルデバイス空間とユーザー空間の間のデータ転送に関するいくつかの例を使用して、キャラクターデバイスドライバーを作成しました。私のgithubを参照してください: my code を参照してください。あなたに役立つと感じたらスターを付けてください:)例3には小さなバグがあります。私はそれらを理解していますが、例1と例2はうまく機能します

0
Hai Dang

Bronislav Elizavetiの答えは正しいです。 #include <asm/uaccess.h>の代わりに#include <linux/uaccess.h>を使用すると、警告が表示されません。

それでも#include <asm/uaccess.h>のみを使用したい場合は、_copy_to_userではなくcopy_to_userを使用する必要があります(同じ引数を使用)。単純な_で十分です。