序文
アプリケーションの特定の局面では、カーネルの保留、およびC ++でのいくつかのより多くの最近の進展を得るために、一定期間の前に。現在の日常の仕事はいくつかのパフォーマンスの分析に遭遇し、別のロックAPIの問題の選択は、我々が見つかりました。そのため、APIのユーザー・モードのプログラム、特にその関係の背後にある動作原理へと事前につながる、カーネル、不明瞭なカーネルの実装プロセスを呼び出します期待を分析することはできません。この目的のために、我々は遭遇した仕事の問題を結合しようとする、など:
- どのようにユーザーモードアプリケーション実行システムコール。
- 関係とカーネルモードとユーザーモードのロックが基本となる実装をロックとは何ですか。
- 異なるユーザーモードロックの比較アプローチ理論解析の非ロック機構(スピンロックは、ロック、ロック状態を読み取ります)。
- どのように達成するために特定のカーネルでlibaioを非同期IO;
- システムコール、スレッドのスケジューリング、システムのパフォーマンスに、それぞれの割り込みは、CPUの消費量に影響を与えます。
我々は、これらの基本的な問題を通して比較的近い関係を確立するためにそれらを助け、知識の心を介して取得する互いから分離して、上記整理することを願っています。
ABCシステムコール
システムコール機能
オペレーティング・システムの観点から、カーネルのシステムコールは、最低レベルのユーザ・モード・プログラム、オペレーティング・ソフトウェアまたはハードウェア・インターフェースを提供します。Linuxシステムでは、各ハードウェア・システム・アーキテクチャは、このようなMIPS以下のシステムコールテーブルとして、独自のシステムコールテーブルがあります。
EXPORT(sys_call_table)
PTR sys_read /* 5000 */
PTR sys_write
PTR sys_open
PTR sys_close
....
PTR sys_statx
PTR sys_rseq
PTR sys_io_pgetevents
.size sys_call_table,.-sys_call_table
...
NESTED(handle_sys64, PT_SIZE, sp)
#if !defined(CONFIG_MIPS32_O32) && !defined(CONFIG_MIPS32_N32)
/*
* When 32-bit compatibility is configured scall_o32.S
* already did this.
*/
.set noat
SAVE_SOME
TRACE_IRQS_ON_RELOAD
STI
.set at
.....
syscall_common:
dsubu t2, v0, __NR_64_Linux
sltiu t0, t2, __NR_64_Linux_syscalls + 1
beqz t0, illegal_syscall
dsll t0, t2, 3 # offset into table
dla t2, sys_call_table
daddu t0, t2, t0
ld t2, (t0) # syscall routine
beqz t2, illegal_syscall
jalr t2 # Do The Real Thing (TM)
作業プロセスのシステムコール
ビューの呼び出し側の視点から:
(1)動作仕様基準システムコールパラメータ及びデータに調製;
(2)標準インタフェースモードシステムコール、システムコールインターフェース呼び出しを介し。
参照するには、発信者の視点から:
システムのユーザモード、一般的な呼処理システムのハードウェアとカーネルによって状態(1)プロセッサの状態の後、すなわち中断プロセスの保護は、第1のCPU環境です。
(2)システムコールのタイプの分析、適切な処理ルーチンへのシステムコールを、
(3)システムコール処理サブルーチン実行、回復プロセスのCPUまたは設定し、新たなシーンが中断され、その後、jiongが、プロセスや新しいプロセスを中断返す実装をダウンし続けます。
ユーザーモードアプリケーションの高速システムコール
現在の急速な発展のために、あなたはすぐに次libaioを2迅速な通話を実現するなど、システムコールで呼び出すことができます。
/* Actual syscalls */
int io_setup(int maxevents, io_context_t *ctxp) {
return syscall(_io_setup, maxevents, ctxp);
}
int io_destroy(io_context_t ctx) {
return syscall(__io_destroy, ctx);
}
上記の例によれば、読者は自分のシステムコールを呼び出すことができます。