2019-2020-1 20199306仕事の5週目の「Linuxカーネルの原理と分析」

三層のシステムコールのメカニズム

基本

  • ユーザモード、カーネルモードと割り込み
  • ユーザーモード:低レベルのコードに実行が制限された制御範囲、メモリアクセスの唯一の一部です。
  • カーネルモード:ハイレベルで行う、コードは、特権命令、任意の物理メモリへのアクセスを実行してもよいです。
  • ブレイク:ユーザーモードからメインモードカーネルモードに入ります。
  • 割り込みカテゴリ
  • ハードウェア割り込み:ユーザーモードプロセスの実行、ハードウェア割り込み信号がカーネルモードに出たとき、それは割り込みサービスルーチンに対応する割り込みが実行されます。
  • ソフト割り込み:ユーザーモードプロセスの実行中には、カーネルモードにシステムコール(特別な割り込み)と呼ばれます。

•コンテキストスイッチ登録
ユーザ・モード・カーネルモードへの切り替えは、ユーザモードレジスタコンテキストが保存されるべきである場合、一方のコアCPUの現在の状態にレジスタの値。EIPの値:int命令が割り込みメカニズムは、スタック上のいくつかのレジスタの値は、スタックはユーザーモードアドレス、ステータス・ワード、その後、CSが保存されます保存されますトリガされます。スタックの最上部には、対応するCPUのレジスタにカーネル・モード、カーネルモード・ステータス・ワードに対応しますが、とCS:システムコールの割り込みハンドラのエントリポイントにEIPレジスタの値はSYSTEM_CALLです。まず最初に、割り込みハンドラに、シーンを保存することになった後、INT命令または割込み信号が発生し、SAVE_ALLが実行されます。治療の終わりがRESTORE_ALLを実行し、サイトを復元することである前に割り込みハンドラの後、最後に割り込みます。

•APIの•APIの呼び出し関係やシステム:アプリケーション・プログラミング・インターフェースが、関数定義。

•システムコール:割り込み要求はソフト割り込みによってカーネルに送られ、INT命令の実行が割り込み要求をトリガします。

いくつかの内部のAPIのlibcライブラリは、通常のカプセル化システムコールを使用して定義され、その主な目的は、プログラマがコードを記述することができます配信システムは、パラメータを渡すためのアセンブリ命令とレジスタは、トリガ・システムを呼び出す必要はありません呼び出すことです。唯一のシステムコールに対応することができるAPIはまた、内部システムコールの複数であってもよいし、システムコールはまた、API呼び出しの複数であってもよいです。

•インテルのx86 CPUは、より少ない数の上位の権限、四つの異なる実行レベル0,1,2,3を定義します。Linuxのシステムは、2つの権限レベルそれらの0,3を使用しています。

同一のシステムコールを使用するには二つの方法で埋め込まれたCコードとアセンブリコードを使用して、APIライブラリ関数

方法の一つ:APIを使用します

  • hello20199306.cを作成し、コンパイル

  • コンパイルされたプログラムを実行します

方法2:Cのインラインアセンブリコード

  • コードは以下の通りです
int main(){    
char* msg = "hello";    
int len = 11;   
int result = 0;    

 __asm__ __volatile__("movl %2, %%edx;\n\r" /*传入参数:要显示的字符串长度*/             
"movl %1, %%ecx;\n\r" /*传入参赛:文件描述符(stdout)*/             
      "movl $1, %%ebx;\n\r" /*传入参数:要显示的字符串*/             
      "movl $4, %%eax;\n\r" /*系统调用号:4 sys_write*/            
      "int  $0x80" /*触发系统调用中断*/             
:"=m"(result) /*输出部分:本例并未使用*/            
:"m"(msg),"r"(len)  /*输入部分:绑定字符串和字符串长度变量*/             
:"%eax");           

return 0;
}
  • コンパイラ

  • ラン

概要

Linuxでのシステムコールは、割り込み(int型は0x80)によって達成されます。INT 80 EAXレジスタに格納された命令を実行する、ときにシステムコールの後、システムコール機能の数は、パラメータを順次EBX、ECX、EDX、ESI、EDIレジスタに配置する必要があり、システムコールに渡されています戻り値は、EAXレジスタで得ることができます。

システムコール番号のすべての機能は、ファイル/usr/include/bits/syscall.hで見つけることができ、使いやすさのために、それらが作られていますSYS_ 同様にSYS_WRITE、SYS_exitとして定義され、このようなマクロ。例えば、頻繁に使用される書き込み機能は以下のように定義される:
ssize_tの書き込み(INT FD、CONSTボイド*のBUF、size_tのCOUNT)。

関数の最後の関数はSYS_WRITE呼び出し、このシステムによって達成されます。命令は、INTは0x80を完了したとき、システムに、SYS_WRITE EAXレジスタを呼び出すのに対し、上記の規則に従って、それぞれFB、BUFを、パラメータ、および存在はEBX、ECX、およびEDXレジスタカウント、EAXレジスタの戻り値から得ることができます。

おすすめ

転載: www.cnblogs.com/Huyiming/p/11697969.html