1 / 35

第 17 回カーネル読書会

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

kapono
Télécharger la présentation

第 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. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

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

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

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

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

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

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

  8. シグナルの一覧 P282 表9-1 takasugi@yokohama.email.ne.jp

  9. シグナルの送信 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 takasugi@yokohama.email.ne.jp

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

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

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

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

  14. 割込みの種類 P117 4.2 takasugi@yokohama.email.ne.jp

  15. 割込みの一覧 P123 P137 takasugi@yokohama.email.ne.jp

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

  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 割込みハンドラ セグメント機構 takasugi@yokohama.email.ne.jp

  18. 割込みのスタック 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 セグメント機構 takasugi@yokohama.email.ne.jp

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

  20. スタックのイメージ図 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 takasugi@yokohama.email.ne.jp

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

  22. 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共用 takasugi@yokohama.email.ne.jp

  23. ボトムハーフの種類 P145 4.6.6 P146 表4-3 ボトムハーフは割り込みに対応した処理を行うが、優先度の低い関数である。 カーネルが適当なタイミングで呼び出されるのを待っている。 takasugi@yokohama.email.ne.jp

  24. ボトムハーフの仕組み 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 { 呼び出す関数など } 割込み処理の遅延実行 takasugi@yokohama.email.ne.jp

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

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

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

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

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

  30. 引数へアクセス 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 ユーザ カーネルからはユーザは見える。 ユーザからカーネルは見れない。 takasugi@yokohama.email.ne.jp

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

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

  33. ページフォルト 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 takasugi@yokohama.email.ne.jp

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

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

More Related