35
YLUG 読読読 [email protected] e.jp 読 17 読読読読読読読読 年年 年 年年 年 年 20011017 年年YLUG

第 17 回カーネル読書会

  • Upload
    kapono

  • View
    50

  • Download
    1

Embed Size (px)

DESCRIPTION

第 17 回カーネル読書会. 2001年10月17日 高杉@ YLUG. 読書会の目次. 1.シグナルと割込み 2.シグナル 3.割込み (1)ハードウェア割込み  ・ボトムハーフ (2)ソフトウェア割込み  ・システムコール (3)フォールト. シグナルと割込みを読む. ・ 詳解 Linux カーネル:監訳者ことば  本気で Linux カーネルを理解しようと考えた場合は、 PC ハードウェアの低レベルな機能の理解が必要。. ・ 詳解 Linux カーネル:はじめに  カーネルを完全に理解するには、ハードウェアを - PowerPoint PPT Presentation

Citation preview

Page 1: 第 17 回カーネル読書会

YLUG 読書会 [email protected]

第 17 回カーネル読書会

2001年10月17日

高杉@ YLUG

Page 2: 第 17 回カーネル読書会

YLUG 読書会 [email protected]

読書会の目次

1.シグナルと割込み

2.シグナル

3.割込み

(1)ハードウェア割込み

 ・ボトムハーフ

(2)ソフトウェア割込み

 ・システムコール

(3)フォールト

Page 3: 第 17 回カーネル読書会

YLUG 読書会 [email protected]

シグナルと割込みを読む

・詳解 Linux カーネル:監訳者ことば

 本気で Linux カーネルを理解しようと考えた場合は、

  PC ハードウェアの低レベルな機能の理解が必要。・詳解 Linux カーネル:はじめに

 カーネルを完全に理解するには、ハードウェアを

 制御するアセンブリ言語を少し学ぶ必要がある。

Page 4: 第 17 回カーネル読書会

YLUG 読書会 [email protected]

シグナルと割込みの勉強

アセンブラの理解が必要

(アセンブラルーチンが多い)ハードウェアの理解が必要

(ハードウェアの動作が見える)コンパイラ連携の理解が必要

(スタックや fixup の連携)

kernel 勉強に最適 !

ただ、とても難しい

Page 5: 第 17 回カーネル読書会

YLUG 読書会 [email protected]

シグナルと割込みの差

ユーザモード

・プロセスの処理中

カーネルモード

・カーネルの処理中

ハードウェアモード

・デバイスの動き

シグナル

割込み

Page 6: 第 17 回カーネル読書会

YLUG 読書会 [email protected]

シグナルとは

シグナルは、 Unix システムで使用される最も古いプロセス間通信の方法である。シグナルは、ひとつ以上のプロセスに対して非同期イベント (asynchronous events) を伝達するために使用される。シグナルが生成されるのは、キーボード割り込みがあったり、プロセスが仮想メモリ内に存在しない場所にアクセスしようとしてエラーが起きたときなどである。シグナルは、シェルが子プロセスに対してジョブ制御の信号を伝達するときにも利用される。 http://www.linux.or.jp/JF/JFdocs/The-Linux-Kernel-6.html

Page 7: 第 17 回カーネル読書会

YLUG 読書会 [email protected]

シグナルの遷移

signal

sigvec

sigaction RT-signal

BSD

伝統的な Signal

同一シグナルが発生すると対応できない問題があった。

現在の Signal

同一シグナルが発生するとブロックができる。ただ、1つしか保留できない。

次期の Signal ?

同一シグナルが発生した場合、 1つ以上の保留できる。

Page 8: 第 17 回カーネル読書会

YLUG 読書会 [email protected]

シグナルの一覧

番号 シグナル名 コメント

1 SIGHUP 端末やプロセスのハングアップ

2 SIGINT キーボードからの割込み

3 SIGQUIT キーボードからの終了

4 SIGILL 不正な命令の実行

5 SIGTRAP デバック用のブレークポイント

6 SIGABRT 異常終了

7 SIGBUS バスエラー

:31 SIGUNUSED 未使用( Linux2.4 では SIGSYS )

P282 表9-1

Page 9: 第 17 回カーネル読書会

YLUG 読書会 [email protected]

シグナルの送信

siginfo_t

struct task_struct

signal_struct   *sig

:

sigpending pending

:

sigqueue head

sigqueue tail

sigset_t signalsigset_t signal

struct sigpending

siginfo_t

send_sig_info やsend_sig で変更する。force_sig_info やforce_sig も良く似たもの。

P290 9.2

Page 10: 第 17 回カーネル読書会

YLUG 読書会 [email protected]

シグナルの受信

割込出口 例外出口syscall 出口

起動するプロセス決定

そのプロセスにシグナル有り ?

シグナル起動

sigpending

task_struct

P152 図4-5

Page 11: 第 17 回カーネル読書会

YLUG 読書会 [email protected]

シグナルの起動 P298 図9-1

do_signal()handle_signal()

setup_frame()

return

sys_sigreturn()restore_sigcontext

()

return

コンテキスト退避&   frame 操作

シグナルハンドラ

sigreturn

コンテキスト回復&   frame 操作

Page 12: 第 17 回カーネル読書会

YLUG 読書会 [email protected]

フレームの操作 P300 図9-2

成長

foo スタック

コンテキストの退避とごまかしhandler スタック

foo() handler()

kernel

foo() と handler() の間のスタックにコンテキストを退避し、返りアドレスはごまかす。

バッファオーバフローと原理は同じ

Page 13: 第 17 回カーネル読書会

YLUG 読書会 [email protected]

シグナルセーフ

main()

foo()

handler()

foo()

foo() foo()

ハンドラ外部と内部で共用領域を更新してはいけない

(カウンタの更新やポインタの張替えなど)

P284 枠外

Page 14: 第 17 回カーネル読書会

YLUG 読書会 [email protected]

割込みの種類

種類 Intel ドキュメント割込み マスカブル・ノンマスカ

ブル周辺機器からの信号

例外 フォルト

割込み命令から再実行保護機能、 MMU により発生

トラップ

次命令から実行ソフトウェア割込みにより発生

アボート

致命的エラー

P117 4.2

Page 15: 第 17 回カーネル読書会

YLUG 読書会 [email protected]

割込みの一覧

番号 割込み コメント

0 除算エラー devide_error()

1 デバック例外 debug()

2 未使用 nmi()

: Intel が予約している ( 18から31まで )

32 タイマ IRQ は0

33 キーボード IRQ は1

34 カスケード IRQ は2

:255

P123 P137

Page 16: 第 17 回カーネル読書会

YLUG 読書会 [email protected]

割込みの処理

1.割込み元が割込み先へ移動できるかチェック。

2.割込み元が割込みを発生できるかチェック。

3.特権レベルが変更されていたら、スタックの用意が必要。

  TR レジスタから TSS を求めて、 SS と ESP を退避する。

4.スタックに EFLAGS と CS と EIP を退避する。

5. IDT のセレクタとオフセットを CS と EIP にロードする。

P125 4.2.5

Page 17: 第 17 回カーネル読書会

YLUG 読書会 [email protected]

割込みの動作 P125 4.2.5

IDTR

BASE LIMIT

256

IDT

割込みハンドラセグメント機構

CPLCS レジスタ

SEG SEL DPL

OFFSET

GDTR

BASE LIMIT

0

0

Kernel code,

User code,

:

TSS,LDT

TSS,LDT

:

TSS.LDT

Page 18: 第 17 回カーネル読書会

YLUG 読書会 [email protected]

割込みのスタック

GDTR

BASE LIMIT

0

0

Kernel code,

User code,

:

TSS,LDT

TSS,LDT

:

TSS.LDT

TSS,LDT

NR_tasks

セレクタ値

TSS

tss_structセグメント機構

P53 2.3P95 3.2.2

task_structTR

割込みでは、T ask は変更されず、特権レベルが変更される。

Type:B DPL

BASE ADDR

Page 19: 第 17 回カーネル読書会

YLUG 読書会 [email protected]

割込みからシグナルへ P176 5.5.3P244 7.4

IDT

割込みハンドラ

CPLCS レジスタ

sigpending

task_struct

シグナル登録

シグナル起動

セグメント機構

SEG SEL DPL

OFFSET

ボトムハーフ

Page 20: 第 17 回カーネル読書会

YLUG 読書会 [email protected]

スタックのイメージ図

signal_struct

tss_structセグメント機構

Type:B DPL

BASE ADDRtask_struct

P81 3.1

Kernel stackesp

User stack

0

0

Kernel code,

User code,

:

TSS,LDT

TSS,LDT

:

TSS.LDT

TSS,LDT

TR

Page 21: 第 17 回カーネル読書会

YLUG 読書会 [email protected]

割込みの具体例

CPUCPU

システムコールIRQ 割込み フォールト

Page 22: 第 17 回カーネル読書会

YLUG 読書会 [email protected]

irqaction

IRQ ハンドラ P138 図4-4P143 4.6.4

0 1

63 i

irq_desc_t status

hw_interrupt_type

action

depth irqaction

PIC 回路を操作する超低レベル IO ルーチン

( 8259A など)

IRQ 全体を抑止するのは、 CPU に命令を発行

個別 IRQ を抑止するのは、 PIC 回路に命令を発行

irqaction

Irq 共用

do_IRQ

Page 23: 第 17 回カーネル読書会

YLUG 読書会 [email protected]

ボトムハーフの種類

番号 コメント

CONSOLE_BH 仮想コンソール

IMMEDIATE_BH

即時実行タスクキュー

KEYBOARD_BH キーボード

SCSI_BH SCSI インタフェース

SERIAL_BH シリアルポート

TIMER_BH タイマ

TQUEUE_BH タイマ実行キュー

P145 4.6.6P146 表4-3

ボトムハーフは割り込みに対応した処理を行うが、優先度の低い関数である。

カーネルが適当なタイミングで呼び出されるのを待っている。

Page 24: 第 17 回カーネル読書会

YLUG 読書会 [email protected]

tqueue_struct { 呼び出す関数など}

tqueue_struct { 呼び出す関数など}

ボトムハーフの仕組み P147 4.6.6

TIMER_BH

CONSOLE_BH

:

IMMEDIATE_BH

TQUEUE_BH

bh_base

do_bottom_half()

tqueue_bh(){ run_task_queue(&tq_**)}

timer_bh(){ update_times() run_old_timers() run_timer_list()}

tqueue_struct { 呼び出す関数など}

割込み処理の遅延実行

Page 25: 第 17 回カーネル読書会

YLUG 読書会 [email protected]

動作のタイミング P152 図4-5

例外出口割込出口 syscall 出口

ボトムハーフ実行

ボトムハーフ実行

元はカーネル?

再スケジュール?

シグナル実行

リターン

Page 26: 第 17 回カーネル読書会

YLUG 読書会 [email protected]

優先度のイメージ

割込み処理

ボトムハーフ

カーネルモード処理

シグナル処理

ユーザモード処理

優先度

Page 27: 第 17 回カーネル読書会

YLUG 読書会 [email protected]

SMP での割込み

CPU 0(ローカルAPIC )

CPU 0(ローカルAPIC )

CPU 1(ローカルAPIC )

CPU 1(ローカルAPIC )

I/O APICI/O APICICC バス

do_irq 実行 do_irq 実行

Lock で制御しながら切替実行 (interleave)

P360 11.4.4P352 図 11-2

Page 28: 第 17 回カーネル読書会

YLUG 読書会 [email protected]

SMP でのボトムハーフ

CPU 0(ローカルAPIC )

CPU 0(ローカルAPIC )

CPU 1(ローカルAPIC )

CPU 1(ローカルAPIC )

I/O APICI/O APICICC バス

・誰かボトムハーフを実行している。・ボトムハーフが禁止されてる。・誰か割込みハンドラを実行している。・割込みが禁止されている。

BH 実行中

P364 11.4.5

Page 29: 第 17 回カーネル読書会

YLUG 読書会 [email protected]

システムコール P266 図8-1

ユーザモード

カーネルモード

main malloc sys_call do_mmap

malloc() mmap()

returnreturnreturn

ret_from_syscall ()このタイミングでボトム

ハーフやシグナルが起動される

割り込みゲートで特権レベル・スタッ

ク・コードが変更される

do_mmap

Page 30: 第 17 回カーネル読書会

YLUG 読書会 [email protected]

引数へアクセス

CR3

ページディレクトリテーブ

ルページテーブ

ルページ

カーネル

ユーザ

U/S ビットOFF

4 K バイト

1024 個の PTE

物理 0x00100000

論理 0xc0000000

物理 0x???00000

論理 0x00000000

カーネルからはユーザは見える。

ユーザからカーネルは見れない。

swapper_pg_dir

P272 8.2.5P75 2.5.5

U/S ビットON

Page 31: 第 17 回カーネル読書会

YLUG 読書会 [email protected]

例外と fixup コード

カーネル

P274 8.2.6P679 B.2

ユーザ

do_page_faule()

割込処理

get_user

fixup ルーチン

search_exeption_table()  フォルトしたアドレスから

 リカバするための命令を

 検索して、 JMP する。_ex_table

フォルトするかもしれない命令アドレス

リカバするための命令アドレス

フォルトするかもしれない命令アドレス

リカバするための命令アドレス

フォルトするかもしれない命令アドレス

リカバするための命令アドレス

Page 32: 第 17 回カーネル読書会

YLUG 読書会 [email protected]

システムコールの再実行P302 9.3.4

do_signal()handle_signal()

setup_frame()

return

sys_sigreturn()restore_sigcontext

()

return

コンテキスト退避&   frame 操作

シグナルハンドラ

sigreturn

コンテキスト回復&   frame 操作

eip を 2 バイト戻して、引数(レジスタ)を整え、リタンすると再実行

eip を 2 バイト戻して、引数(レジスタ)を整え、リタンすると再実行

Page 33: 第 17 回カーネル読書会

YLUG 読書会 [email protected]

ページフォルト P245 図 7.5

コピーオンライト

デマンドペ ジンー

SIGSEGV 

Oops     

fixup 処理    

CR2割込

0x0edo_page_fault() fault したアドレ

Kernel か?

find_vma

不正 syscall

YesNo

   7.4.4        7.4.3      7.4.1(9.2)      3.4.1        8.2.6

Page 34: 第 17 回カーネル読書会

YLUG 読書会 [email protected]

今後の課題

●2.4 系カーネルで拡張された機能

  TSS が 2.2 系はプロセス毎、 2.4 系はCPU 毎

  softirq と tasklet について

● カーネル内の他制御

 メモリ管理やファイルシステムなど

Page 35: 第 17 回カーネル読書会

YLUG 読書会 [email protected]

参考文献

● 詳解 Linux カーネル  O’REILLY Japan  DANIEL P.BOVET MARCO CESATI 著 高橋 浩和 早川 仁 監訳

●Pentium ファミリ ディベロッパ ズマニュー ーアル

● はじめて読む 486   ASCII 蒲地 輝尚 著