確認した結果は次の通り。100.00^Cスタックメモリ空間が別のため、スタックはユーザ空間とカーネル空間でそれぞれ別になる。システムコール実行中は、呼び出し元ユーザスタックは変更されない。ユーザスタックとカーネルスタックを出力する。出力から分かる通り、スタックはそれぞれ異なる。entry_SYSCALL_64_after_hwframe+101システムコールの実装を確認する今回の例ではシステムコール呼び出しにsyscallを利用した。Manualカーネル起動時(init/main.c#start_kernel())にハンドラが登録されているため。syscall_init()で行う。ここでは、entry_SYSCALL_64という関数を登録している。ここでは、カーネル空間にスイッチしてレジスタを整えてdo_syscall_64を実行している。ここでは、ユーザがraxに設定したシステムコール番号をもとにsys_call_tableからハンドラを取り出して実行している。syscall_return_slowpath(regs);}なお、sys_call_tableはarch/x86/um/sys_call_table_64.cにある。対象の<asm/syscalls_64.h>は、ビルド時に生成されるらしい。<asm/syscalls_64.h>};ということで、上記のような流れでシステムコールが実行される。ユーザプロセスに戻るときは、sysretを利用し、上記と逆の操作(メモリをユーザ空間に切り替えて、退避していたシステムコール実行前の値をripレジスタに設定する)を行う。0x80割込みを利用する。利用して最適な呼び出し方の実装を後で選択できるようにしてるらしい。同様の仕組みなのかは調べきれてないので、今後調べる。vsyscallシステムコールは遅い?システムコールは遅いと言われているが、どれくらい遅いのかを試してみる。そのために、何もしないシステムコールを作成して実行時間を比較する。システムコールの追加方法は次のサイトを参考にした。ファイルは次のとおり。APPLICATIONSパッチファイル(noop.patch)は次のとおり。__x64_sys_noop上記を利用し、カーネルをビルドして再起動する。カーネルを再ビルドする次のとおり、システムコールが実装されていることがわかる。システムコールを利用するアセンブリを用意する。