linuxカーネル開発--LDD 3 scullエラーセット、カーネルバージョン移行リスト


linuxカーネルバージョンのアップグレードにより、古いバージョンのカーネルでコンパイルできるドライバを新しいバージョンのカーネルに移植する際に様々なコンパイルとリンクエラーが発生することが多いので、ここで私が直面したいくつかの問題を整理し、後続の開発をよりスムーズにします^^!
現在のカーネルバージョンは3.2.4
1.make[1]: Entering directory `/usr/src/linux-***' scripts/Makefile.build:49: *** CFLAGS was changed in "***/Makefile". Fix it to use ***.  Stop.
理由:Makefile.buildでのCFLAGS競合
推奨事項:CFLAGSを削除するか、CFLAGSの名前を変更する
2. fatal error: linux/config.h: No such file or directory
原因:linux-2.6.20から、linux/config.hは除去された
推奨:次のコードを追加できます.
#if(LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18))
#if(LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,33))
#include
#else
#include
#endif
#else
#include
#endif
3. error: unknown field ‘ioctl’ specified in initializer
理由:linux-2.6.26から、file_operationsが変更され、ioctlが削除され、次の2つのインタフェースが追加されました.
long(*unlocked_ioctl)(structfile *, unsignedint,unsignedlong);
long (*compat_ioctl) (struct file *, unsigned int, unsigned long);

提案:プログラムの使用状況に応じて、ioctlは.unlocked_ioctlまたはcompat_ioctl
4 error: implicit declaration of function ‘init_MUTEX’
理由:linux-2.6.25からinitを削除MUTEX,init_MUTEX_LOCKEDマクロ定義
推奨:次のコードを追加します.
#include
#define init_MUTEX(a) sema_init(a,1)
#define init_MUTEX_LOCKED(a) sema_init(a,0)
5. error: ‘TASK_INTERRUPTIBLE’ undeclared (first use in this function)
理由:linux-2.6.19から、TASK_INTERUPTIBLEの定義はlinux/schedに移動する.h
推奨:ヘッダファイルlinux/schedを追加します.h
6. error: ‘SPIN_LOCK_UNLOCKED’ undeclared here 
理由:新しいバージョンのカーネルで、SPIN_LOCK_UNLOCKEDが削除されました
推奨:DEFINE_の使用代わりにSPINLOCK(lock)マクロ
7. error: ‘struct task_struct’ has no member named ‘uid’/ ‘euid’
理由:linux-2.6.31からstruct task_struct定義はinclude/linux/sched.h中、元task_struct構造体の定義が変更され、uidやeuidなどをcredに移動します.include/linux/schedを参照してください.hとinclude/linux/cred.h
提案:errorのコードを次のように変更するだけです.
current->uidをcurrent->cred->uidに変更
current->euidをcurrent->cred->euidに変更