第
This presentation is the property of its rightful owner.
Sponsored Links
1 / 35

第 17 回カーネル読書会 PowerPoint PPT Presentation


  • 76 Views
  • Uploaded on
  • Presentation posted in: General

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

Download Presentation

第 17 回カーネル読書会

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


17

第17回カーネル読書会

2001年10月17日

高杉@YLUG

[email protected]


17

読書会の目次

1.シグナルと割込み

2.シグナル

3.割込み

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

 ・ボトムハーフ

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

 ・システムコール

(3)フォールト

[email protected]


17

シグナルと割込みを読む

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

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

PCハードウェアの低レベルな機能の理解が必要。

・詳解Linuxカーネル:はじめに

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

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

[email protected]


17

シグナルと割込みの勉強

アセンブラの理解が必要

(アセンブラルーチンが多い)

kernel勉強に最適!

ただ、とても難しい

ハードウェアの理解が必要

(ハードウェアの動作が見える)

コンパイラ連携の理解が必要

(スタックやfixupの連携)

[email protected]


17

シグナルと割込みの差

ユーザモード

・プロセスの処理中

カーネルモード

・カーネルの処理中

シグナル

ハードウェアモード

・デバイスの動き

割込み

[email protected]


17

シグナルとは

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

http://www.linux.or.jp/JF/JFdocs/The-Linux-Kernel-6.html

[email protected]


17

シグナルの遷移

signal

sigaction

RT-signal

sigvec

BSD

現在のSignal

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

伝統的なSignal

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

次期のSignal?

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

[email protected]


17

シグナルの一覧

P282 表9-1

[email protected]


17

シグナルの送信

P290 9.2

struct sigpending

signal_struct *sig

:

sigpending pending

:

sigqueue head

sigqueue tail

sigset_t signal

siginfo_t

siginfo_t

send_sig_infoや

send_sigで変更する。

force_sig_infoや

force_sigも良く似たもの。

struct task_struct

[email protected]


17

シグナルの受信

P152 図4-5

syscall出口

割込出口

例外出口

task_struct

起動するプロセス決定

sigpending

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

シグナル起動

[email protected]


17

シグナルの起動

P298 図9-1

do_signal()

handle_signal()

setup_frame()

return

sys_sigreturn()

restore_sigcontext()

return

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

シグナルハンドラ

sigreturn

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

[email protected]


17

フレームの操作

P300 図9-2

foo()

kernel

handler()

fooスタック

コンテキストの退避とごまかし

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

handlerスタック

成長

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

[email protected]


17

シグナルセーフ

P284 枠外

main()

handler()

foo()

foo()

foo()

foo()

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

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

[email protected]


17

割込みの種類

P117 4.2

[email protected]


17

割込みの一覧

P123 P137

[email protected]


17

割込みの処理

P125 4.2.5

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

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

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

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

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

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

[email protected]


17

割込みの動作

P125 4.2.5

GDTR

BASE

LIMIT

IDTR

CSレジスタ

BASE

LIMIT

0

0

Kernel code,

User code,

:

TSS,LDT

TSS,LDT

:

TSS.LDT

CPL

IDT

SEG SEL DPL

OFFSET

256

割込みハンドラ

セグメント機構

[email protected]


17

割込みのスタック

P53 2.3

P95 3.2.2

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

GDTR

BASE

LIMIT

TSS

0

0

Kernel code,

User code,

:

TSS,LDT

TSS,LDT

:

TSS.LDT

TSS,LDT

Type:B DPL

BASE ADDR

TR

セレクタ値

task_struct

tss_struct

NR_tasks

セグメント機構

[email protected]


17

割込みからシグナルへ

P176 5.5.3

P244 7.4

CSレジスタ

IDT

CPL

task_struct

SEG SEL DPL

OFFSET

sigpending

割込みハンドラ

シグナル登録

ボトムハーフ

セグメント機構

シグナル起動

[email protected]


17

スタックのイメージ図

P81 3.1

0

0

Kernel code,

User code,

:

TSS,LDT

TSS,LDT

:

TSS.LDT

TSS,LDT

Kernel stack

esp

Type:B DPL

BASE ADDR

task_struct

signal_struct

tss_struct

セグメント機構

TR

User stack

[email protected]


17

割込みの具体例

CPU

IRQ割込み

システムコール

フォールト

[email protected]


17

IRQハンドラ

P138 図4-4

P143 4.6.4

do_IRQ

0 1

i

63

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

(8259Aなど)

status

hw_interrupt_type

action

depth

irq_desc_t

irqaction

irqaction

irqaction

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

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

Irq共用

[email protected]


17

ボトムハーフの種類

P145 4.6.6

P146 表4-3

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

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

[email protected]


17

ボトムハーフの仕組み

P147 4.6.6

timer_bh(){

update_times()

run_old_timers()

run_timer_list()

}

bh_base

TIMER_BH

CONSOLE_BH

:

IMMEDIATE_BH

TQUEUE_BH

tqueue_bh(){

run_task_queue(&tq_**)

}

do_bottom_half()

tqueue_struct {

呼び出す関数など

}

tqueue_struct {

呼び出す関数など

}

tqueue_struct {

呼び出す関数など

}

割込み処理の遅延実行

[email protected]


17

動作のタイミング

P152 図4-5

割込出口

例外出口

syscall出口

ボトムハーフ実行

ボトムハーフ実行

元はカーネル?

再スケジュール?

シグナル実行

リターン

[email protected]


17

優先度のイメージ

割込み処理

ボトムハーフ

カーネルモード処理

優先度

シグナル処理

ユーザモード処理

[email protected]


17

SMPでの割込み

P360 11.4.4

P352 図11-2

Lockで制御しながら

切替実行(interleave)

do_irq実行

do_irq実行

CPU 0

(ローカルAPIC)

CPU 1

(ローカルAPIC)

ICCバス

I/O APIC

[email protected]


17

SMPでのボトムハーフ

P364 11.4.5

・誰かボトムハーフを実行している。

・ボトムハーフが禁止されてる。

・誰か割込みハンドラを実行している。

・割込みが禁止されている。

BH実行中

CPU 0

(ローカルAPIC)

CPU 1

(ローカルAPIC)

ICCバス

I/O APIC

[email protected]


17

システムコール

P266 図8-1

割り込みゲートで特権レベル・スタック・コードが変更される

ユーザモード

カーネルモード

main

malloc

sys_call

do_mmap

do_mmap

malloc()

mmap()

return

return

return

ret_from_syscall()

このタイミングでボトムハーフやシグナルが起動される

[email protected]


17

引数へアクセス

P272 8.2.5

P75 2.5.5

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

物理0x00100000

論理0xc0000000

ページ

ページテーブル

CR3

カーネル

swapper_pg_dir

U/SビットOFF

U/SビットON

物理0x???00000

論理0x00000000

4Kバイト

1024個のPTE

ユーザ

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

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

[email protected]


Fixup

例外とfixupコード

P274 8.2.6

P679 B.2

割込処理

カーネル

fixupルーチン

do_page_faule()

get_user

search_exeption_table()

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

 リカバするための命令を

 検索して、JMPする。

ユーザ

_ex_table

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

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

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

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

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

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

[email protected]


17

システムコールの再実行

P302 9.3.4

do_signal()

handle_signal()

setup_frame()

return

sys_sigreturn()

restore_sigcontext()

return

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

シグナルハンドラ

sigreturn

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

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

[email protected]


17

ページフォルト

P245 図7.5

0x0e

CR2

faultしたアドレス

do_page_fault()

Kernelか?

No

Yes

find_vma

不正syscall

コピーオンライト

デマンド

ページング

SIGSEGV

Oops

fixup処理    

7.4.47.4.37.4.1(9.2)3.4.18.2.6

[email protected]


17

今後の課題

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

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

softirqとtaskletについて

●カーネル内の他制御

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

[email protected]


17

参考文献

●詳解Linuxカーネル O’REILLY Japan

DANIEL P.BOVET MARCO CESATI著

 高橋 浩和 早川 仁 監訳

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

●はじめて読む486ASCII

 蒲地 輝尚 著

[email protected]


  • Login