64ビットLinuxシステム呼び出しの追加とシステム呼び出しの原理

2208 ワード

ユーザアドレス空間とカーネルアドレス空間
各プロセスには、オペレーティングシステムのビット数に応じて固定されたサイズの仮想アドレス空間があります(ビット数は物理アドレスのサイズも決定します).例えば32ビットオペレーティングシステムは、その物理アドレスが32ビットであり、表示空間が2の32次方、すなわち4 GBである.システムカーネルはオペレーティングシステムの安定性にかかわることはよく知られていますが、私たちの一般的なプログラムは直接アクセスしたり操作したりするべきではありません.しかし、各プログラムは、システム呼び出しまたは中断によってカーネル実行カーネルの操作に陥ります.安全のために,仮想アドレス空間をカーネル状態仮想アドレス空間と呼ばれる独立した部分に分割した.このカーネル空間のサイズは固定され、32ビットは1 GBで、一般的に仮想アドレス空間の上位にある.また,対応する物理アドレス空間範囲も固定されている.
64ビットLinuxシステム呼び出しの追加
前言:システム呼び出しはカーネル状態に属するプログラム開発であるため,慎重である.また、モジュールロードとは異なり、システム呼び出しの追加はカーネルを再コンパイルする必要があるため、時間がかかります(30~60 min).また、システム呼び出しは一般的に本当に追加する必要はありません.システムにあるシステム呼び出しは十分です.私たち自身は一般的に冗長な蛇足を加えています.
ステップ1:sayDafanziなどの新しいシステム呼び出しの名前を確定し、linuxカーネルのソースコードを用意し、自分でダウンロードして対応するディレクトリに解凍すれば、私が確定したシステム呼び出しの名前はsayDafanziと呼ばれます.次に、linux-2.6.32.27のカーネルソースコードをダウンロードし、/usr/src/kernels/linux-2.6.32.27フォルダに解凍します.次の手順では、デフォルトのルートディレクトリはこのディレクトリに値します.ステップ2:システム呼び出し番号を追加し、システム呼び出し番号とカーネル関数を合わせます.64ビットは32ビットとは異なります.64ビットカーネルソースコードのarch/x 86/include/asm/unisted_64.hこのヘッダファイルに次のコードを適切に追加します.
#define __NR_sayDafanzi                         299  //299              1
__SYSCALL(__NR_sayDafanzi,sys_sayDafanzi)

ステップ2:システム呼び出しの実装
システム呼び出しで使用するカーネル関数をkernel/sysに置きます.cの下で、このカーネルは他の位置に置くこともできます.コードは次のとおりです.
SYSCALL_DEFINE0(sayDafanzi)  /*            ,      asmlinkage int      sys_sayDafanzi(void){}   */
{
     printk("dafanzi23333333333333");
     return 0;
}


ステップ4:カーネルを再コンパイルして、最初のステップで仮定したルートディレクトリmake mrproper、make olfconfig(常に車に戻る)、make、make modules、make modules_に戻ります.install、make installこのステップは時間がかかります
ステップ5:テスト
#include 
int main()
{
        syscall(299);  /* 2.6.19       __syscallx7  ,      ,        ,          */
        return 0;
}