2016-06-25 16 views
3

私は現在Assemblyを学んでおり、CPUレジスタがどのようにマルチタスクで動作するのか混乱しています。したがって、マルチタスキングシステム。 CPUはいつでも特定のプログラムの実行を一時停止し、別のプログラムを実行することができます。では、このステップでレジスタ値はどのように保持されますか?レジスタがスタックされているのですか?CPUレジスタとマルチタスク

+5

これは(強制的に)https://en.wikipedia.org/wiki/Context_switchであり、ハードウェアによって生成された(タイマーによる)割り込み(https://en.wikipedia.org/wiki/Interrupt)の助けを借りて行われます。割り込みCPUは、プログラムを一時停止し、レジスタをいくつかの場所に保存し、特定のアドレスの割り込みハンドラにジャンプします。いくつかのアーキテクチャにはタスクスイッチング用のハードウェアヘルパーがあり、x86にはTSS https://en.wikipedia.org/wiki/Task_state_segmentがあり、一部のx86 OSではそれを使用していました。ソフトウェアコンテキストスイッチ割り込みハンドラを使用すると、OS固有のフォーマットでレジスタをPCB https://en.wikipedia.org/wiki/Process_control_blockに保存できます。 – osgx

+0

WoWありがとうございました...これは私が探していたものです... –

+0

Dilhan、x86/x86_64またはARMをお探しですか? LinuxやWindowsの世界? – osgx

答えて

6

どのようにCPUレジスタがマルチタスクで動作するか。

CPUは基本的にマルチタスクでは動作しない可能性がありますが、タスクスイッチはソフトウェアで実装されている可能性があります。いくつかのCPU(Intel x86)は、ハードウェア状態(TSS https://en.wikipedia.org/wiki/Task_state_segment)とTR(タスクレジスタ)を持ち、タスク間で状態をアトミックに変更することがあります。 (TSSは依然としてprotection ringsリング0/RING3を切り替えるために使用されてもよい;しかし、タスクを切り替えることはない。)

だからマルチタスクシステムでは、CPUは、いつでも特定のプログラムの実行を一時停止し、別のプログラムを実行することができます。

ほぼ。

ほとんどのCPUでは、OSとユーザースペースのタスクを実行することができますが、外部イベント(ハードウェアからの信号、割り込み要求、IRQ)が現在のコード(タスク)の実行を一時停止する場合に使用されるinterruptsがあります。 interrupt handlers(ISR、割り込みサービスルーチン)と呼ばれるいくつかの特別なカーネル関数の1つにジャンプします。

この手順ではどのようにレジスタ値が保持されますか?

ほとんどのレジスタは割り込みエントリのままです。いくつかは割り込み入力プロセスでCPUによって保存されます。割り込み支持機構は、CPU内部に実装されて

、それはいくつかのスペースに現在のタスクの一部 CPUレジスタを保存しない(はい、それはcan saveto stack、x86のCPUは、* FLAGSをプッシュCS、IP)。 CPUはInterrupt Vector Table/Interrupt Descriptor Table(IDT)配列(IVTの場合は特別なメモリ位置に格納され、IDTの場合は特殊CPUレジスタIDTがポイントされます)に登録されたこれらのルーチンにジャンプします。 IRQ1の場合、レコード番号1(ルーチン1)を選択します。 IRQ 20の場合はルーチン20を選択します。

レジスタはスタックされていますか、または他の方法でプッシュされていますか?

両方。割り込みによってCPUによってプッシュされるものと、割り込みハンドラのコマンドによってプッシュされるものがあります。 (そして、カーネルモードでEIPを変更するコードもあります...)

ISRルーチンはCPUによって保存されたものを知っていて、さらにいくつかのレジスタ(基本的には必要です)を使用したい場合、または別の場所に保存する)、その割り込み作業を行い、手動で保存したレジスタを元に戻してから、特殊コマンド(iret in x86 word、スタックから「CS:IPとFLAGS」をリロードします)を使用して割り込みを終了します。元のIPがスタック内で変更されなかった場合、CPUは元のユーザーコード(元のタスク)の実行を継続し、すべてのレジスタを変更しません。作者や割り込みハンドラが望むなら、iretを実行する前にスタックのIPアドレスを変更するかもしれないので、他の場所に戻ります(カーネルモードやタスクに戻るか、PCを再起動するなど)。

現在の実行中のタスク(コンテキストスイッチ、wikiosdev)を変更することは、割り込みを使用して実行できる問題の1つです。基本的に2種類のコンテキスト切り替えがあります:不随意(タスクが実行され、CPUを離れたくない場合)および任意の(タスクがコンテキスト切り替えを実行するようにOSに要求した場合、現在のタスクはそれ以上実行できないか、現在のタスクが丁寧で、他のタスクを実行するチャンスが与えられている場合 - sched_yield、Linuxの場合)。

通常、非自発的なコンテキストスイッチは、定期的なタイマー割り込みの助けを借りて行われます。数年前、このタイマーは、10,1または3ミリ秒ごとに特定のIRQ(タイマー/ RTC IRQ)を生成するために使用されました。現在のタスクがあまりにも多くの時間実行されているか(time slice、量子数値time-sharingを超過しているか)、実行する準備ができている優先度の高いタスクがあるかどうかを判断するには、OS schedulerを呼び出します。

通常は、システムコールの助けを借りて任意のコンテキストスイッチを実行します(OSは特権分離を使用してring3のユーザ空間コードとring0のカーネルスペースコードを実行します - protection ringsの概念)特権レベル(ソフトウェアで生成された割り込みで実装されている可能性があります;古いlinux/BSDではint 80h)。ユーザー空間コードは、ファイルやソケットからread、ファイルからwriteなど、いくつかの作業を行うようにカーネルに要求します。 sched_yieldのシステムコールがあれば、スケジューラを実行して他のタスクに切り替えるようにカーネルに依頼することもできます。システムコール​​- 実行中のタスクがブロックされ、状態がTASK_RUNNINGに切り替わる)、システムコールはOSスケジューラも呼び出します。

OSスケジューラは、現在のタスクを実行可能状態にしておくか(実行可能状態にある場合)、他のタスクに切り替えることができます(実際には他のタスクのカーネルモードにもなります。 CS:IP + FLAGS)と、それはswitch_to ASMマクロを使用してください:http://lxr.free-electrons.com/source/arch/x86/include/asm/switch_to.h?v=4.6#L27:そこに唯一の非睡眠ユーザタスクだったし、それがスリープ状態になる場合

33   /*                \ 
34   * Context-switching clobbers all registers, so we clobber  \ 
35   * them explicitly, via unused output variables.    \ 
36   * (EAX and EBP is not listed because EBP is saved/restored  \ 
37   * explicitly for wchan access and EAX is the return value of \ 
38   * __switch_to())            \ 
39   */                \ 
40   unsigned long ebx, ecx, edx, esi, edi;       \ 
41                   \ 
42   asm volatile("pushfl\n\t"    /* save flags */  \ 
43      "pushl %%ebp\n\t"   /* save EBP */  \ 
44      "movl %%esp,%[prev_sp]\n\t"  /* save ESP */ \ 
45      "movl %[next_sp],%%esp\n\t"  /* restore ESP */ \ 
46      "movl $1f,%[prev_ip]\n\t" /* save EIP */  \ 
47      "pushl %[next_ip]\n\t"  /* restore EIP */  \ 
48      __switch_canary         \ 
49      "jmp __switch_to\n"  /* regparm call */  \ 
50      "1:\t"            \ 
51      "popl %%ebp\n\t"   /* restore EBP */  \ 
52      "popfl\n"     /* restore flags */  \ 
53                   \ 

は、目に見えるタスクが実行する準備ができてはありません。しかし、実際にはpid 0のスワッパまたはidleと呼ばれる目に見えないタスクがあり、優先順位は最も低く、常に実行可能です。 CPUを冷却するために特別なCPU命令をループで実行します。 - HLT;実行可能なタスクを見つけるために、スケジューラへのイベント/コールのチェックを行うこともできます。

ユーザースペースとカーネルスペースの分離と分離(すべてのコードがリング0で実行されている)のない不思議なリアルタイムOS(「V」から始まり、バージョン5で終わる名前)は、割り込み;スケジューラーへの通常の呼び出しによって。

便利なリンク:

-1

CPUを切り替えるハードウェアタスクの

  • http://wiki.osdev.org/Task_State_Segment。では、このステップでレジスタ値はどのように保持されますか?レジスタがスタックされているのですか?

  • ほとんどのプロセッサは、実行が中断されたときにプロセスレジスタを保存するために使用されるプロセスコンテキストブロック(PCB)構造を定義します。そのようなプロセッサはまた、1つのステップでレジスタセットを保存またはロードするプロセスコンテンツを保存し、プロセスコンテキストをロードする命令を有する。

    レジスタはスタックにプッシュされません。

    プロセススイッチのようなものになります。ほとんどのシステムで

    SAVEPROCESSCONTEXT address_of_running_process_pcb 
    LOADPROCESSCONTEXT address_of_new_process_pdb 
    

    を、割り込みは、プロセスのない懸濁液はありませんので、一度に実行されているものは何でもプロセスによってサービスされています。

    +0

    ユーザー、どのようなボリュームとインテルアーキテクチャソフトウェア開発者マニュアル(x86/x86_64 CPUアーキテクチャーの定義)のページで、PCBブロックの定義を調べる必要がありますか?なぜWikiはCPUのではなく、OSの一部としてPCBについて言いますか? https://en.wikipedia.org/wiki/Process_control_block "...特定のプロセスを管理するのに必要な情報を含むオペレーティングシステムカーネル*のデータ構造*です.PCBは、"プロセスの現れ**オペレーティングシステム** ""。 x86、arm、mipsの "Save Process Content"命令は何ですか? – osgx

    +0

    Intelは奇妙なシステムを使用しています。タスク状態セグメントとXSAVE(および関連する命令 - 第13章)を見る必要があります。 PCBはOSによって維持されます。 CPUは構造体の構造を定義します。 – user3344003

    +0

    CPUは依然としてPCB構造を定義しておらず、TSSのみを定義しています。 TSSはほとんどのOSで使用されていません。 – osgx

    関連する問題