2017-02-08 15 views
-1

私は現在、私はhello-5.c部分によThe Linux Kernel Module Programming Guideuint8_tはデータ型として認識されますが、u8は認識されません。どうして?

に基づいてRaspbianジェシー上のカーネルモジュールを作成するために学んでいます。 static u8 myByte = 'X';を追加しようとしましたが、u8は認識されません。それから、u8uint8_tと同じものに変更しました。AFAIKとuint8_tはデータ型として認識されます。

チュートリアルの古いバージョンherestatic u8 myByte = 'X';と記載されていますので、新しいチュートリアルで再利用したいと思います。

古いチュートリアルでは、これらを含める:

#define MODULE 
#define LINUX 
#define __KERNEL__ 

#include <linux/module.h> 
#include <linux/kernel.h> 
#include <linux/init.h> 

新しいチュートリアルでは、これらを含めながら、

#include <linux/module.h> 
#include <linux/moduleparam.h> 
#include <linux/kernel.h> 
#include <linux/init.h> 
#include <linux/stat.h> 

私は古いものを使用してみましたが、define部分でエラーが発生したので、私は新しいチュートリアルを使用しました。

なぜuint8_tが認識されるのですが、u8は新しいバージョンでは認識できません。

+0

この質問はこの特定のサイトの範囲外ですが、StackoverflowまたはUnix.stackexchangeでうまくいくかもしれません。 –

+0

ああ、それは実際に私の質問に答えた。ありがとうございました。 :) –

+0

デバッグのヘルプ( "なぜこのコードは動作していませんか?")には、目的の動作、特定の問題またはエラー、およびそれを再現するのに必要な最短コード**を質問**に含める必要があります。明確な問題文がない質問は、他の読者にとって有用ではありません。参照:最小、完全、および検証可能な例を作成する方法。 – Olaf

答えて

3

uint8_tを(C99およびそれ以降<stdint.h> typedefさ)であるu8は、標準タイプではないので。 u8を使用する場合は、ヘッダーに適切なtypedefを含めるか、コードにtypedefを指定します。

+1

完全に正解ではありません。これは実際に非標準型ですが、Linuxカーネルで広く使用されています。私は問題は、それ自体ではなく、むしろモジュールパラメータとしてのその使用で推測します。いずれの場合でも、実際に何が作成されたかを知るためのコードは提供されていません。 – 0andriy

+0

[chapter-5.c](http://www.tldp.org/LDP/lkmpg/2.6/html/x323.html#AEN345)のコードを使用します。私は古いバージョン[ここ](http://www.tldp.org/LDP/lkmpg/2.4/html/x354.htm)のように静的u8 myByte = 'X'を追加したい –

+2

@ 0andriy:答えは正しい。 'u8'は標準タイプではありません。カーネルでの使用は、C99より前の、固定幅タイプが標準にないレガシーです。 Linuxカーネルは、標準であるかどうかを設定しません。しかし、カーネルの場合はこれらの遺産を守るべきですが、他の新しいプロジェクトでは標準タイプを使うべきです。 – Olaf

関連する問題