4_ユーザ状態とコア状態-Linuxのシステム呼び出しを2つのCコードで実現

2818 ワード

陈诚原创作品转载请注明出典《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
==========================================================================
プログラマーがプログラミングするのは丈夫ではなく、バグが発生し、書いたプログラムがコンピュータのリソースを任意に制御できると危険なので、OSカーネル状態と
ユーザ状態の2つの概念.今週の実験は、オペレーティングシステムのユーザ状態、カーネル状態の切り替え、および割り込みについてです.
 
まずいくつかの理解について話します.
1)OSはシステム呼び出しを採用してユーザー状態プロセスとI/Oとの相互作用を実現し、ユーザー状態でシステム資源を呼び出すにはシステム呼び出しを採用しなければならない.
2)ユーザ状態からカーネル状態に入るには,システム呼び出し(trap陥没),割り込みの2つの方式がある.
3)状態切替時には,ユーザ状態スタックトップアドレス,当時の状態ワード,当時のcs:eip値などのレジスタコンテキストが保存される.
4)system_ callはlinux内のすべてのシステム呼び出しのエントリポイントであり、システム呼び出しのパラメータはeaxによって伝達される.
実験手順:以下に2つの異なるcコードを用いて、0 x 20号システムがgetpidを呼び出して現在のカーネル名を取得することを実現する.
1.ライブラリ関数APIを直接呼び出す
#include <stdio.h>
#include <unistd.h>

void main() {
    pid_t tt;
    tt = getpid();
    printf("%u
", tt); }

4_用户态与核心态-用两种C代码实现Linux的某个系统调用_第1张图片 4_用户态与核心态-用两种C代码实现Linux的某个系统调用_第2张图片 2.組み込みアセンブリを使用したcコード
#include <stdio.h>
#include <unistd.h>

void main() {
    pid_t tt;
    asm volatile (
            "movl $0x20, %%eax
\t" "int $0x80
\t" "movl %%eax, %0
\t" :"=m"(tt) ); printf("%u
", tt); } 

 
4_用户态与核心态-用两种C代码实现Linux的某个系统调用_第3张图片
 
解析:API関数getpid()はシステム呼び出しをカプセル化し、int 0 x 80文を実行するとカーネル状態のSystem_に入ります.call().
System_call()では割り込みサービスプログラムsys_が実行されます.getpid()は、サービス中断が完了した後、プロセス間スケジューリングがない場合、iretを実行してユーザーに戻る
ステータスは続行され、プロセス間スケジューリングがある場合はプロセス間スケジューリングが実行されます.
 
まとめ:今週の学習を通して、システム呼び出しと中断の関係、すなわちシステム呼び出しの3層皮:xyz(API)、system_コール(割り込み)
ベクトル)とsys_xyz(サービスプログラム).システム呼び出しは特殊な割り込みであり、eaxで呼び出し番号、ebx、ecxなどのパラメータ、eaxで再生する.
戻り値int 0 x 80は割り込み処理プログラムに入り、カーネル状態に入る.