マエカワの備忘録的な何か

思い立ったが吉日

オペレーティングシステム 其の三 20170426

DMA(Direct Memory Access)

 どっさりデータを扱うデバイスがほしくなる時がある

  →このやり取りはメモリとハードディスク間で行われ、2種類の方法がある

   ①プログラムI/O方式

    CPUを介してメモリとハードディスクのデータ伝送をする

     →CPUが忙しくなってほかのことができなくなってしまう

   ②DMA方式

    I/Oデバイスがメモリに直接アクセス!!代わりにDMAコントローラというハードウェアを使う

     ⇒CPUが最初に送り先アドレスデータ量を指示する

      ⇒送信し終わったらI/Oデバイス割り込みを使ってCPUに伝える

    ⇒伝送している間、CPUで別のことをすることができる

 

割り込みについてもう少し応用例を

 遅延:割り込み発生からハンドラ終了までの時間

  ex)車のブレーキ制御などは遅延がダイレクトに影響してくる

 

 ・通常は先に入った方の割り込みハンドラを優先する(通常割り込み)

   割り込み禁止→ハンドラが始まった時「禁止」に、終わった時「許可」に


f:id:maekawa_yoshimiki_1119:20170428161714j:image

 

 ・多重レベル割り込み

   ⇒優先度の高い割り込みは通常割り込みに割り込む


f:id:maekawa_yoshimiki_1119:20170428161659j:image

 ここでは命令Bが優先度の高い命令になっている

動作モード

 プログラムのミスにより違うアドレスを書き換えてしまうことがある

  ⇒OSのデータ、プログラムの破たん、ハードウェアの暴走などが起きてしまうことも

   ⇒ユーザープログラムにできることを制限したい(重要な部分はOSにしかできないようにする)

 そこで、4つの(実質2つの)動作モードの出番

  権限を持たせることにより実行できるオペレーションを制限していく

   ・Ring0:ユーザーモード

   ・Ring3:カーネルモード

 

メモリ分離

  ユーザーが使えるメモリ空間、OSが使えるメモリ空間が分離されている


f:id:maekawa_yoshimiki_1119:20170428161537j:image

 

 動作モード、コード、メモリ空間は時間で切り替わる

  ⇒ではどうやって切り替えをしているのか(ユーザーからカーネル(権限昇格))

   ⇒割り込みハンドラに移るときにモード切替をしている


f:id:maekawa_yoshimiki_1119:20170428161624j:image

 

 疑問:割り込みハンドラでは常にOSが実行しているのか??

 

システムコール

 ユーザー空間からOSに命令を依頼する

  ⇒ソフトウェア割り込みで呼び出す(あらかじめ汎用レジスタに呼び出す命令に対応した引数を入れておく)

  ⇒int 0x80 でカーネル空間にシステムコール。命令を依頼することができる。


f:id:maekawa_yoshimiki_1119:20170428161844j:image

 

例:アセンブリ言語でhello,worldを表示するには

//helloworld.s

message : ascil "hello,world "

mov $4,%eax //システムコール番号4=write

mov $1,%ebx //通常出力

mov $message,%ecx

mov $12,%edx //文字数

int 0x80 //システムコール