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
YLUG 読書会 [email protected]
読書会の目次
1.シグナルと割込み
2.シグナル
3.割込み
(1)ハードウェア割込み
・ボトムハーフ
(2)ソフトウェア割込み
・システムコール
(3)フォールト
YLUG 読書会 [email protected]
シグナルと割込みを読む
・詳解 Linux カーネル:監訳者ことば
本気で Linux カーネルを理解しようと考えた場合は、
PC ハードウェアの低レベルな機能の理解が必要。・詳解 Linux カーネル:はじめに
カーネルを完全に理解するには、ハードウェアを
制御するアセンブリ言語を少し学ぶ必要がある。
YLUG 読書会 [email protected]
シグナルと割込みの勉強
アセンブラの理解が必要
(アセンブラルーチンが多い)ハードウェアの理解が必要
(ハードウェアの動作が見える)コンパイラ連携の理解が必要
(スタックや fixup の連携)
kernel 勉強に最適 !
ただ、とても難しい
YLUG 読書会 [email protected]
シグナルと割込みの差
ユーザモード
・プロセスの処理中
カーネルモード
・カーネルの処理中
ハードウェアモード
・デバイスの動き
シグナル
割込み
YLUG 読書会 [email protected]
シグナルとは
シグナルは、 Unix システムで使用される最も古いプロセス間通信の方法である。シグナルは、ひとつ以上のプロセスに対して非同期イベント (asynchronous events) を伝達するために使用される。シグナルが生成されるのは、キーボード割り込みがあったり、プロセスが仮想メモリ内に存在しない場所にアクセスしようとしてエラーが起きたときなどである。シグナルは、シェルが子プロセスに対してジョブ制御の信号を伝達するときにも利用される。 http://www.linux.or.jp/JF/JFdocs/The-Linux-Kernel-6.html
YLUG 読書会 [email protected]
シグナルの遷移
signal
sigvec
sigaction RT-signal
BSD
伝統的な Signal
同一シグナルが発生すると対応できない問題があった。
現在の Signal
同一シグナルが発生するとブロックができる。ただ、1つしか保留できない。
次期の Signal ?
同一シグナルが発生した場合、 1つ以上の保留できる。
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
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
YLUG 読書会 [email protected]
シグナルの受信
割込出口 例外出口syscall 出口
起動するプロセス決定
そのプロセスにシグナル有り ?
シグナル起動
sigpending
task_struct
P152 図4-5
YLUG 読書会 [email protected]
シグナルの起動 P298 図9-1
do_signal()handle_signal()
setup_frame()
return
sys_sigreturn()restore_sigcontext
()
return
コンテキスト退避& frame 操作
シグナルハンドラ
sigreturn
コンテキスト回復& frame 操作
YLUG 読書会 [email protected]
フレームの操作 P300 図9-2
成長
foo スタック
コンテキストの退避とごまかしhandler スタック
foo() handler()
kernel
foo() と handler() の間のスタックにコンテキストを退避し、返りアドレスはごまかす。
バッファオーバフローと原理は同じ
YLUG 読書会 [email protected]
シグナルセーフ
main()
foo()
handler()
foo()
foo() foo()
ハンドラ外部と内部で共用領域を更新してはいけない
(カウンタの更新やポインタの張替えなど)
P284 枠外
YLUG 読書会 [email protected]
割込みの種類
種類 Intel ドキュメント割込み マスカブル・ノンマスカ
ブル周辺機器からの信号
例外 フォルト
割込み命令から再実行保護機能、 MMU により発生
トラップ
次命令から実行ソフトウェア割込みにより発生
アボート
致命的エラー
P117 4.2
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
YLUG 読書会 [email protected]
割込みの処理
1.割込み元が割込み先へ移動できるかチェック。
2.割込み元が割込みを発生できるかチェック。
3.特権レベルが変更されていたら、スタックの用意が必要。
TR レジスタから TSS を求めて、 SS と ESP を退避する。
4.スタックに EFLAGS と CS と EIP を退避する。
5. IDT のセレクタとオフセットを CS と EIP にロードする。
P125 4.2.5
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
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
YLUG 読書会 [email protected]
割込みからシグナルへ P176 5.5.3P244 7.4
IDT
割込みハンドラ
CPLCS レジスタ
sigpending
task_struct
シグナル登録
シグナル起動
セグメント機構
SEG SEL DPL
OFFSET
ボトムハーフ
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
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
YLUG 読書会 [email protected]
ボトムハーフの種類
番号 コメント
CONSOLE_BH 仮想コンソール
IMMEDIATE_BH
即時実行タスクキュー
KEYBOARD_BH キーボード
SCSI_BH SCSI インタフェース
SERIAL_BH シリアルポート
TIMER_BH タイマ
TQUEUE_BH タイマ実行キュー
P145 4.6.6P146 表4-3
ボトムハーフは割り込みに対応した処理を行うが、優先度の低い関数である。
カーネルが適当なタイミングで呼び出されるのを待っている。
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 { 呼び出す関数など}
割込み処理の遅延実行
YLUG 読書会 [email protected]
動作のタイミング P152 図4-5
例外出口割込出口 syscall 出口
ボトムハーフ実行
ボトムハーフ実行
元はカーネル?
再スケジュール?
シグナル実行
リターン
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
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
YLUG 読書会 [email protected]
システムコール P266 図8-1
ユーザモード
カーネルモード
main malloc sys_call do_mmap
malloc() mmap()
returnreturnreturn
ret_from_syscall ()このタイミングでボトム
ハーフやシグナルが起動される
割り込みゲートで特権レベル・スタッ
ク・コードが変更される
do_mmap
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
YLUG 読書会 [email protected]
例外と fixup コード
カーネル
P274 8.2.6P679 B.2
ユーザ
do_page_faule()
割込処理
get_user
fixup ルーチン
search_exeption_table() フォルトしたアドレスから
リカバするための命令を
検索して、 JMP する。_ex_table
フォルトするかもしれない命令アドレス
リカバするための命令アドレス
フォルトするかもしれない命令アドレス
リカバするための命令アドレス
フォルトするかもしれない命令アドレス
リカバするための命令アドレス
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 バイト戻して、引数(レジスタ)を整え、リタンすると再実行
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
YLUG 読書会 [email protected]
今後の課題
●2.4 系カーネルで拡張された機能
TSS が 2.2 系はプロセス毎、 2.4 系はCPU 毎
softirq と tasklet について
● カーネル内の他制御
メモリ管理やファイルシステムなど
YLUG 読書会 [email protected]
参考文献
● 詳解 Linux カーネル O’REILLY Japan DANIEL P.BOVET MARCO CESATI 著 高橋 浩和 早川 仁 監訳
●Pentium ファミリ ディベロッパ ズマニュー ーアル
● はじめて読む 486 ASCII 蒲地 輝尚 著