2016-10-03 8 views
0

私は、カーネルモジュールプログラミングの初心者で、 'sys_socket'を使ってカーネルモジュールにrawソケットを作成しようとしています。私はこのソケットを 'sys_bind'と 'sys_ioctl'(インターフェイス番号を取得するため)を使ってインターフェイスにバインドしています。システムコールは未定義です!カーネルモジュールのコンパイル

私のモジュールをコンパイルしている間、私は、次のエラーを取得:

make -C /lib/modules/3.13.0-68-generic/build M=/root/Kernel_Module modules 
make[1]: Entering directory `/usr/src/linux-headers-3.13.0-68-generic' 
CC [M] /root/Kernel_Module/kernel_module.o 
Building modules, stage 2. 
MODPOST 1 modules 
WARNING: "sys_ioctl" [/root/Kernel_Module/kernel_module.ko] undefined! 
WARNING: "sys_bind" [/root/Kernel_Module/kernel_module.ko] undefined! 
WARNING: "sys_socket" [/root/Kernel_Module/kernel_module.ko] undefined! 
CC  /root/Kernel_Module/kernel_module.mod.o 
LD [M] /root/Kernel_Module/kernel_module.ko 
make[1]: Leaving directory `/usr/src/linux-headers-3.13.0-68-generic' 

どのように私はこの問題を解決することができますか?

コードは、以下に規定される:

struct sockaddr_ll socketBindAddr; 
struct ifreq  ifreq; 
int    socketFd = 0; 

socketFd = sys_socket (AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); 
if (socketFd < 0) 
{ 
    printk (KERN_CRIT "Failed to open data socket!!\r\n"); 
    return OFC_FAILURE; 
} 

memset (&ifreq, 0, sizeof(ifreq)); 
strcpy (ifreq.ifr_name, gOfcGlobals.aDataIfName); 
if (sys_ioctl (socketFd, SIOCGIFINDEX, (unsigned long) &ifreq) < 0) 
{ 
    printk (KERN_CRIT "Ioctl failed to get IfIndex!!\r\n"); 
    return OFC_FAILURE; 
} 

memset (&socketBindAddr, 0, sizeof(socketBindAddr)); 
socketBindAddr.sll_family = AF_PACKET; 
socketBindAddr.sll_protocol = htons(ETH_P_ALL); 
if (sys_bind (socketFd, (struct sockaddr *) &socketBindAddr, 
    sizeof(socketBindAddr)) < 0) 
{ 
    printk (KERN_CRIT "Failed to bind socket\r\n"); 
    return OFC_FAILURE; 
} 
+0

簡潔に言えば、Syscallsは**ユーザー空間プログラム**で、*カーネルモジュール*では使用できません。いくつかのsyscallには、カーネル内での使用のためのアナログがあります。私は、 'ioctl'、' bind'、 'socket'のカーネル内の類義語についてはわかりません。 – Tsyvarev

答えて

1

sys_bind()sys_ioctl(及びsys_socket)がカーネルに(ローレベル)ユーザー空間インタフェースです。あなたが書いたコードは私たちには表示されていませんが、ネットアクセスにはより適切なカーネル内部インターフェイスを使用する必要があります。

+0

コードを追加しました。親切には、カーネルモジュールを使用してソケットを作成する手順があればお勧めします。 – user2522685

+0

申し訳ありませんが、私はカーネルモジュールでハイレベルなネットワーク化を行ったことはありません。私は接続をどのように開くのか見てNFSを見ましたが、紛失しました。おそらくNBDはより簡単な出発点でしょうか?おそらく '/ drivers/block/nbd.c'を読んでみてください。 –

+1

ソケットは、次の関数を使用してカーネルに作成することができます: sock_create()/ *ソケットを作成する*/ sock-> ops-> bind()/ * Bind Socket */ sock-> ops-> release()/*ソケットを閉じる*/ struct socketは、ユーザ空間のファイル記述子ではなく、カーネル内のソケットの構造体です。 – user2522685

関連する問題