アプリケーションが好き勝手にデバイス操作やその他のアプリケーションに影響を与える操作を実行できると危ない。中核部分をカーネルと呼び、この機能の実行依頼をシステムコールと呼ぶ。システムコール(処理を依頼すること)によって、次を実現できる。不正な要求のチェック次からは、どのようにシステムコールが動作するかを説明する。システムコールの利用方法システムコールはつまりカーネル関数の呼び出しだが、通常の関数と同じ方法ではカーネル関数は呼び出せない。命令ポインタに関数アドレスが設定されることだが、ユーザ空間とカーネル空間はメモリ空間が異なるため、ユーザアプリケーションがカーネルのメモリ領域にアクセスできないから。www.kimullaa.comそのため、割込みやsyscall命令を利用したシステムコール専用の手続きが用意されている。(バイナリレベルでの呼び出し規約)を定めている。そのため、システムコールの呼び出し前にはレジスタなどを決められた通りに設定する必要がある。arch/x86/entry/entry_64.Sで次のように記載されている。実行してみるsyscallを利用したシステムコールの呼び出しをアセンブリで実施してみる。worldと表示される。worldなお、システムコール番号は次で確認できる。60...念のため、straceを利用してシステムコールが呼び出されていることを確認する。+++リングプロテクションさきほどシステムコールを通してカーネル関数を呼び出せることを説明した。それでは、カーネル関数をユーザ空間に全て実装し直せば、システムコールは不要になるのだろうか?これはリングプロテクションで防げる。仕組みで、下図のように階層構造になっている。レベルごとに実行可能な命令に差をつけ、なおかつ、システムコール時にだけレベルを切り替えることで、ユーザからの意図しない命令実行を防ぐことができる。レベルも定義している。リングプロテクション次のアセンブリを用意し、意図しない操作を防げることを確認する。ユーザモードだと許可されない命令。faultが発生してプロセスが強制終了する。protectionという一般保護違反のメッセージが表示される。(/root/kernel/main)上記から、意図しないリソース操作をユーザ空間からは行えないことがわかる。ユーザモード当然だが、ユーザに許可された命令の範囲であれば例外は発生しない。命令を利用した次のプログラムを作成する。syscallこれを実行すると、ユーザモードで無限ループする。