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

「Linuxカーネルの解析」

第三章のメカニズムのシステムコール(上)

4.1ユーザーモード、カーネルモードと割り込み

  • システムを扱うコールは、ライブラリ関数を介して行われ
  • ユーザーモードとカーネルモードの区別
    • カーネル・モード:高レベルのコードを実行する特権命令を実行することができる、任意の物理メモリへのアクセス
    • ユーザーモード:低レベルの命令
  • また、システムコールが中断しました
    • ユーザーモードからの割り込み処理は、カーネルモードのメインフォームを入力します
    • ユーザーモード、カーネルモード、ユーザ・モード・レジスタ・コンテキストに切り替えるとレジスタ状態の値が現在のCPUのコアに入れている間には、保存してください

      システムコールの4.2の概要

  • システムの意義コール:
    間違ったシステムを作るために、ハードウェアデバイスは、インタフェースのセットを提供してユーザーモードプロセスが相互作用として
  • システムコールの機能と特徴:
    • プログラムは、基盤となるハードウェアからユーザーを解放します
    • 新システムは、大幅にセキュリティが向上します
    • これは、ユーザーが携帯性をプログラムすることができます

      4.2.1 APIとシステムの間の関係は、オペレーティングシステムを呼び出し、

  • API:アプリケーション・プログラミング・インターフェース
    • ただ、関数定義
    • ソフトウェア割り込みシステムによる割り込み要求は、カーネルに呼び出すと
  • 包装システムコール、システムコールを発行する唯一の目的を使用して定義されたライブラリルーチンlibcのいくつかの内部API
    • 各システムコールは、パッケージ化されたシステムコールルーチンに対応します
    • ライブラリルーチンは、プログラマにAPIコールを定義し、これらのパッケージを使用します
  • 必ずしもすべてのAPIは、特定のシステムコール(1への多くの一から一、多くの1つ、)に対応します
  • 返却値
    • ほとんどの通常のカプセル化システムコールは、その値が対応するシステムコールの意味に依存整数を返します
    • -1の戻り値は、カーネルプロセスは、ほとんどの場合、要求を満たすことができませんを示しています
    • 特定のエラーコードを含む更なる定義のerrno変数のlibc

4.2.2以降のシステムコールとパラメータの受け渡し

  • ユーザ・モード・プロセスは、システムコールを呼び出したときに、CPUの切り替えは、モードカーネルとシステムコールカーネル関数とSYSTEM_CALLの実行を開始します
  • パラメータの受け渡し
    • カーネルは、多くの異なるシステムコールを実装します
    • システムコール番号と呼ばれるパラメータを使用して、EAXレジスタ転送

4.3 APIライブラリ関数Cコードと同一のシステムコールトリガーに埋め込まれたアセンブリコードを使用して

4.3.1 APIライブラリ関数は、システムコールをトリガー

  • コード
#include<stdio.h>
#include<sys/types.h>
int main(void)
{
    int u_id;
    printf("%u\n",u_id);
    return 0;
}
  • 実行ショット

システムコールに埋め込まれたコードを開始4.3.2 Cアセンブラコード

  • コード
#include <stdio.h>
#include <unistd.h>
int main(void){
    int u_id;
    asm volatile(
            "movl $0x14, %%eax\n\t"   //将系统调用号赋给eax寄存器
            "int $0x80\n\t"           //执行系统调用
            "movl %%eax, %0\n\t"      //将系统调用执行后的返回值赋给变量tt
            :"=m"(u_id)  
            );
    printf("%u\n",u_id);
    return 0;
    }
  • 実行ショット

おすすめ

転載: www.cnblogs.com/hsj910/p/11677494.html