第17回カーネル読書会 2001年10月17日 高杉@YLUG YLUG読書会 takasugi@yokohama.email.ne.jp.

Slides:



Advertisements
Similar presentations
システムプログラミング 第11回 シグナル 情報工学科 篠埜 功. 今回の内容 前回の補足( exit システムコールについ て) プロセス間通信 – シグナルの送信 --- 今回の内容 – パイプによる通信 – ソケットによる通信.
Advertisements

Linuxを組み込んだマイコンによる 遠隔監視システムの開発
2006/10/26 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
オペレーティングシステム (仮想記憶管理)
計算機システム概論・3回目 本日のトピック:割込みと入出力制御について 割込み制御について 問題点の明確化 割込みとは
オペレーティングシステム i386アーキテクチャ(3)
オペレーティングシステム (割り込み&仮想記憶管理)
榮樂 英樹 LilyVM と仮想化技術 榮樂 英樹
コンパイラ 2011年11月14日
IaaS 仮想マシン(VM)をネットワーク経由で提供 負荷に応じてVM数や性能を変更できる ハードウェアの導入・管理・維持コストの削減
坂井 修一 東京大学 大学院 情報理工学系研究科 電子情報学専攻 東京大学 工学部 電気工学科
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
●マルチプロセッサ管理 □ スケジューリング ☆ 対称型マルチプロセッサシステム ☆ プロセススケジューラ ☆ スケジューリングポリシー
オペレーティングシステム (OSの機能と構造)
App. A アセンブラ、リンカ、 SPIMシミュレータ
2006年度 計算機システム演習 第4回 2005年5月19日.
  【事例演習6】  数式インタプリタ      解 説     “インタプリタの基本的な仕組み”.
の まとめ 2007/04/02 (Mon) / d;id:hzkr
Ibaraki Univ. Dept of Electrical & Electronic Eng.
担当:青木義満、篠埜 功 情報工学科 3年生対象 専門科目 システムプログラミング 第8回、第9回 シグナル処理 担当:青木義満、篠埜 功
第3回 CPUの管理と例外処理 OSによるハードウェアの管理 CPUの構成、動作 CPUの管理 例外処理、割り込み処理 コンテキストスイッチ
オペレーティングシステム (割り込み処理)
Linuxカーネルについて 2014/01.
Ibaraki Univ. Dept of Electrical & Electronic Eng.
第5回 CPUの役割と仕組み3 割り込み、パイプライン、並列処理
割 込 み(1) オペレーティングシステム No.5.
オペレーティングシステム i386アーキテクチャ(2)
割り込み.
全体ミーティング 2009/6/24 D3 西川 賀樹.
割り込み.
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
Windowsの内部を知る
シグナル通信 普通の割込みとソフトウェア割込み ソフトウェア割込みとシグナル キーボードからのシグナル 例外 (exception)
Windowsの内部を知る
型付きアセンブリ言語を用いた安全なカーネル拡張
2012年度 計算機システム演習 第6回 福田 圭祐.
オペレーティングシステム (仮想記憶管理)
AMD64の仮想化技術を利用した 仮想マシンモニタの実装
全体ミーティング 金田憲二.
コンピュータ系実験Ⅲ 「ワンチップマイコンの応用」 第1週目 アセンブリ言語講座
オペレーティングシステム イントロダクション
オペレーティングシステムJ/K (仮想記憶管理)
第7回 授業計画の修正 中間テストの解説・復習 前回の補足(クロックアルゴリズム・PFF) 仮想記憶方式のまとめ 特別課題について
クラウドにおけるIntel SGXを用いた VMの安全な監視機構
オペレーティングシステム 第2回 割り込みとOSの構成
コンパイラ資料 実行時環境.
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング 第6回 システムプログラミング概要 プロセスの生成 担当:青木義満
IaaS環境におけるVMのメモリ暗号化による情報漏洩の防止
情報通信制御 情報通信工学科 3年 森村 知弘.
オペレーティングシステムJ/K 2004年11月15日2時限目
オペレーティングシステム i386アーキテクチャ(1)
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
組込みシステムとは コンピュータ制御システム?
第5回 メモリ管理(2) オーバレイ方式 論理アドレスとプログラムの再配置 静的再配置と動的再配置 仮想記憶とメモリ階層 セグメンテーション
オペレーティングシステム (OSの機能と構造)
コンピュータアーキテクチャ 第 2 回.
実装について 前田俊行.
2013年度 プログラミングⅠ ~ 内部構造と動作の仕組み(2) ~.
コンピュータアーキテクチャ 第 2 回.
コンピュータアーキテクチャ 第 5 回.
6.5 セマフォ セマフォ(semaphore): 複数のタスク(もしくはスレッド)が「同期」または「相互排除」の制御のために取得(acquire)・リリース(release)できるカーネルオブジェクトの総称.
ネットワーク・プログラミング デバイスドライバと環境変数.
コンピュータアーキテクチャ 第 5 回.
SMP/マルチコアに対応した 型付きアセンブリ言語
オペレーティングシステム (OSの機能と構造)
ネットワーク・プログラミング パイプライン通信とシグナル.
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
ネットワーク・プログラミング プロセスとファイルシステム管理.
L4-Linux のメモリ管理における問題点とその解決策
Presentation transcript:

第17回カーネル読書会 2001年10月17日 高杉@YLUG YLUG読書会 takasugi@yokohama.email.ne.jp

読書会の目次 1.シグナルと割込み 2.シグナル 3.割込み (1)ハードウェア割込み ・ボトムハーフ (2)ソフトウェア割込み  ・ボトムハーフ (2)ソフトウェア割込み  ・システムコール (3)フォールト YLUG読書会 takasugi@yokohama.email.ne.jp

シグナルと割込みを読む ・詳解Linuxカーネル:監訳者ことば 本気でLinuxカーネルを理解しようと考えた場合は、  PCハードウェアの低レベルな機能の理解が必要。 ・詳解Linuxカーネル:はじめに  カーネルを完全に理解するには、ハードウェアを  制御するアセンブリ言語を少し学ぶ必要がある。 YLUG読書会 takasugi@yokohama.email.ne.jp

シグナルと割込みの勉強 アセンブラの理解が必要 (アセンブラルーチンが多い) kernel勉強に最適! ハードウェアの理解が必要 ただ、とても難しい ハードウェアの理解が必要 (ハードウェアの動作が見える) コンパイラ連携の理解が必要 (スタックやfixupの連携) YLUG読書会 takasugi@yokohama.email.ne.jp

シグナルと割込みの差 ユーザモード ・プロセスの処理中 カーネルモード ・カーネルの処理中 シグナル ハードウェアモード ・デバイスの動き YLUG読書会 takasugi@yokohama.email.ne.jp

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

シグナルの遷移 signal sigaction RT-signal sigvec BSD 伝統的なSignal 同一シグナルが発生すると対応できない問題があった。 現在のSignal 同一シグナルが発生するとブロックができる。ただ、1つしか保留できない。 次期のSignal? 同一シグナルが発生した場合、 1つ以上の保留できる。 YLUG読書会 takasugi@yokohama.email.ne.jp

シグナルの一覧 P282 表9-1 番号 シグナル名 コメント 1 SIGHUP 端末やプロセスのハングアップ 2 SIGINT キーボードからの割込み 3 SIGQUIT キーボードからの終了 4 SIGILL 不正な命令の実行 5 SIGTRAP デバック用のブレークポイント 6 SIGABRT 異常終了 7 SIGBUS バスエラー : 31 SIGUNUSED 未使用(Linux2.4ではSIGSYS) YLUG読書会 takasugi@yokohama.email.ne.jp

シグナルの送信 P290 9.2 struct sigpending send_sig_infoや send_sigで変更する。 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 YLUG読書会 takasugi@yokohama.email.ne.jp

シグナルの受信 P152 図4-5 syscall出口 割込出口 例外出口 task_struct 起動するプロセス決定 sigpending そのプロセスにシグナル有り? シグナル起動 YLUG読書会 takasugi@yokohama.email.ne.jp

シグナルの起動 P298 図9-1 do_signal() handle_signal() setup_frame() return sys_sigreturn() restore_sigcontext() コンテキスト退避& frame操作 シグナルハンドラ sigreturn コンテキスト回復& frame操作 YLUG読書会 takasugi@yokohama.email.ne.jp

フレームの操作 P300 図9-2 foo() kernel handler() 成長 バッファオーバフローと原理は同じ fooスタック コンテキストの退避とごまかし foo()とhandler()の間のスタックにコンテキストを退避し、返りアドレスはごまかす。 handlerスタック 成長 バッファオーバフローと原理は同じ YLUG読書会 takasugi@yokohama.email.ne.jp

シグナルセーフ P284 枠外 main() handler() foo() foo() foo() foo() ハンドラ外部と内部で共用領域を更新してはいけない (カウンタの更新やポインタの張替えなど) YLUG読書会 takasugi@yokohama.email.ne.jp

割込みの種類 種類 Intelドキュメント 割込み マスカブル・ノンマスカブル 例外 フォルト 割込み命令から再実行 トラップ P117 4.2 種類 Intelドキュメント 割込み マスカブル・ノンマスカブル 周辺機器からの信号 例外 フォルト 割込み命令から再実行 保護機能、MMUにより発生 トラップ 次命令から実行 ソフトウェア割込みにより発生 アボート 致命的エラー YLUG読書会 takasugi@yokohama.email.ne.jp

割込みの一覧 P123 P137 番号 割込み コメント 0 除算エラー devide_error() 1 デバック例外 debug() 2 未使用 nmi() : Intelが予約している(18から31まで) 32 タイマ IRQは0 33 キーボード IRQは1 34 カスケード IRQは2 255 YLUG読書会 takasugi@yokohama.email.ne.jp

割込みの処理 P125 4.2.5 1.割込み元が割込み先へ移動できるかチェック。 2.割込み元が割込みを発生できるかチェック。 3.特権レベルが変更されていたら、スタックの用意が必要。  TRレジスタからTSSを求めて、SSとESPを退避する。 4.スタックにEFLAGSとCSとEIPを退避する。 5.IDTのセレクタとオフセットをCSとEIPにロードする。 YLUG読書会 takasugi@yokohama.email.ne.jp

割込みの動作 P125 4.2.5 GDTR BASE LIMIT IDTR BASE LIMIT IDT 割込みハンドラ CSレジスタ BASE LIMIT Kernel code, User code, : TSS,LDT TSS.LDT CPL IDT SEG SEL DPL OFFSET 256 割込みハンドラ セグメント機構 YLUG読書会 takasugi@yokohama.email.ne.jp

割込みでは、Taskは変更されず、特権レベルが変更される。 割込みのスタック P53 2.3 P95 3.2.2 割込みでは、Taskは変更されず、特権レベルが変更される。 GDTR BASE LIMIT TSS Kernel code, User code, : TSS,LDT TSS.LDT Type:B DPL BASE ADDR TR セレクタ値 task_struct tss_struct NR_tasks セグメント機構 YLUG読書会 takasugi@yokohama.email.ne.jp

割込みからシグナルへ P176 5.5.3 P244 7.4 IDT task_struct sigpending 割込みハンドラ CSレジスタ IDT CPL task_struct SEG SEL DPL OFFSET sigpending 割込みハンドラ シグナル登録 ボトムハーフ セグメント機構 シグナル起動 YLUG読書会 takasugi@yokohama.email.ne.jp

スタックのイメージ図 P81 3.1 Kernel stack Type:B DPL BASE ADDR task_struct Kernel code, User code, : TSS,LDT TSS.LDT Kernel stack esp Type:B DPL BASE ADDR task_struct signal_struct tss_struct セグメント機構 TR User stack YLUG読書会 takasugi@yokohama.email.ne.jp

割込みの具体例 CPU IRQ割込み システムコール フォールト YLUG読書会 takasugi@yokohama.email.ne.jp

IRQハンドラ P138 図4-4 P143 4.6.4 status hw_interrupt_type action depth do_IRQ 0 1 i 63 PIC回路を操作する超低レベルIOルーチン (8259Aなど) irq_desc_t status hw_interrupt_type action depth irqaction irqaction irqaction IRQ全体を抑止するのは、CPUに命令を発行 個別IRQを抑止するのは、PIC回路に命令を発行 Irq共用 YLUG読書会 takasugi@yokohama.email.ne.jp

ボトムハーフの種類 P145 4.6.6 P146 表4-3 番号 コメント CONSOLE_BH 仮想コンソール IMMEDIATE_BH 即時実行タスクキュー KEYBOARD_BH キーボード SCSI_BH SCSIインタフェース SERIAL_BH シリアルポート TIMER_BH タイマ TQUEUE_BH タイマ実行キュー ボトムハーフは割り込みに対応した処理を行うが、優先度の低い関数である。 カーネルが適当なタイミングで呼び出されるのを待っている。 YLUG読書会 takasugi@yokohama.email.ne.jp

ボトムハーフの仕組み P147 4.6.6 割込み処理の遅延実行 TIMER_BH CONSOLE_BH : IMMEDIATE_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 { 呼び出す関数など } 割込み処理の遅延実行 YLUG読書会 takasugi@yokohama.email.ne.jp

動作のタイミング P152 図4-5 割込出口 例外出口 syscall出口 リターン ボトムハーフ実行 ボトムハーフ実行 元はカーネル? 再スケジュール? シグナル実行 リターン YLUG読書会 takasugi@yokohama.email.ne.jp

優先度のイメージ 高 割込み処理 ボトムハーフ カーネルモード処理 優先度 シグナル処理 ユーザモード処理 低 YLUG読書会 takasugi@yokohama.email.ne.jp

SMPでの割込み P360 11.4.4 P352 図11-2 do_irq実行 do_irq実行 CPU 0 (ローカルAPIC) Lockで制御しながら 切替実行(interleave) do_irq実行 do_irq実行 CPU 0 (ローカルAPIC) CPU 1 (ローカルAPIC) ICCバス I/O APIC YLUG読書会 takasugi@yokohama.email.ne.jp

SMPでのボトムハーフ P364 11.4.5 BH実行中 CPU 0 (ローカルAPIC) CPU 1 (ローカルAPIC) ICCバス ・誰かボトムハーフを実行している。 ・ボトムハーフが禁止されてる。 ・誰か割込みハンドラを実行している。 ・割込みが禁止されている。 BH実行中 CPU 0 (ローカルAPIC) CPU 1 (ローカルAPIC) ICCバス I/O APIC YLUG読書会 takasugi@yokohama.email.ne.jp

システムコール P266 図8-1 ユーザモード カーネルモード main malloc sys_call do_mmap malloc() 割り込みゲートで特権レベル・スタック・コードが変更される ユーザモード カーネルモード main malloc sys_call do_mmap malloc() mmap() do_mmap return return return ret_from_syscall() このタイミングでボトムハーフやシグナルが起動される YLUG読書会 takasugi@yokohama.email.ne.jp

引数へアクセス P272 8.2.5 P75 2.5.5 CR3 カーネルからはユーザは見える。 ユーザからカーネルは見れない。 ページディレクトリテーブル 物理0x00100000 論理0xc0000000 ページテーブル ページ CR3 カーネル swapper_pg_dir U/SビットOFF U/SビットON 物理0x???00000 論理0x00000000 4Kバイト 1024個のPTE ユーザ カーネルからはユーザは見える。 ユーザからカーネルは見れない。 YLUG読書会 takasugi@yokohama.email.ne.jp

例外とfixupコード P274 8.2.6 P679 B.2 do_page_faule() 割込処理 カーネル fixupルーチン do_page_faule() get_user search_exeption_table()  フォルトしたアドレスから  リカバするための命令を  検索して、JMPする。 ユーザ _ex_table フォルトするかもしれない命令アドレス リカバするための命令アドレス フォルトするかもしれない命令アドレス リカバするための命令アドレス フォルトするかもしれない命令アドレス リカバするための命令アドレス YLUG読書会 takasugi@yokohama.email.ne.jp

システムコールの再実行 P302 9.3.4 eipを2バイト戻して、引数(レジスタ)を整え、リタンすると再実行 do_signal() handle_signal() setup_frame() return sys_sigreturn() restore_sigcontext() コンテキスト退避& frame操作 シグナルハンドラ sigreturn コンテキスト回復& frame操作 eipを2バイト戻して、引数(レジスタ)を整え、リタンすると再実行 YLUG読書会 takasugi@yokohama.email.ne.jp

ページフォルト P245 図7.5 0x0e do_page_fault() CR2 faultしたアドレス 割 込 Kernelか? No Yes find_vma 不正syscall コピーオンライト デマンド ページング SIGSEGV  Oops     fixup処理       7.4.4      7.4.3     7.4.1(9.2)     3.4.1      8.2.6 YLUG読書会 takasugi@yokohama.email.ne.jp

今後の課題 ●2.4系カーネルで拡張された機能 TSSが2.2系はプロセス毎、2.4系はCPU毎 softirqとtaskletについて ●カーネル内の他制御  メモリ管理やファイルシステムなど YLUG読書会 takasugi@yokohama.email.ne.jp

参考文献 ●詳解Linuxカーネル O’REILLY Japan DANIEL P.BOVET MARCO CESATI著  高橋 浩和 早川 仁 監訳 ●Pentiumファミリーディベロッパーズマニュアル ●はじめて読む486 ASCII  蒲地 輝尚 著 YLUG読書会 takasugi@yokohama.email.ne.jp