SlideShare a Scribd company logo
1 of 31
Download to read offline
xv6のコンテキストスイッチを読む

              @mfumi2
自己紹介

●
    セキュリティキャンプ2012OS組
最近こんな本が出ました




              はじめてのOSコードリーディング
                         青柳隆宏著




              おすすめ! でも...
UNIX V6 を読む上で大変なところ

●
    PDP11
●
    Cの記法が古い (pre K&R)
●
    アセンブラの記法が特殊
●
    デフォルトが8進数
●
    etc...
xv6とは

●
    MITで開発された教育用OS
    http://pdos.csail.mit.edu/6.828/2012/xv6.html
●
    UNIX V6 を x86 向けに書き直したもの
●
    解説書有り
    http://pdos.csail.mit.edu/6.828/2012/xv6/book-
    rev7.pdf
xv6の特徴

●
    x86
●
    マルチプロセッサ対応
●
    バイナリはELF
●
    スワッピング機能はなし
●
    qemu+gdb で動作可
コンテキストスイッチ

●
    プロセスのコンテキストを切り替える
●
    コンテキスト …
    –   メモリ空間
        → cr3 レジスタを切り替える
    –   スタック
        → %esp を切り替える
    –   各種レジスタ
        → プロセスごとのスタックに退避&スタックから復帰
xv6のコンテキストスイッチ
• switch.S


             void swtch(struct context **old,
                                    struct context *new);




                       • proc.h
xv6のコンテキストスイッチ
    • switch.S
                 void swtch(struct context **old,
                                        struct context *new);
                             メモリ
                     %
                     %
                     %
★
                     %                              %esp
                     %eip(swtchの戻り先)



                                                   new(%edx)
                     %edi
                     %esi
                     %ebx
                     %ebp
                     %eip(swtchの戻り先)
xv6のコンテキストスイッチ
    • switch.S
                 void swtch(struct context **old,
                                        struct context *new);
                             メモリ
                     %edi
                     %esi
                     %ebx                           %esp
★
                     %ebp
                     %eip(swtchの戻り先)



                                                   new(%edx)
                     %edi
                     %esi
                     %ebx
                     %ebp
                     %eip(swtchの戻り先)
xv6のコンテキストスイッチ
    • switch.S
                 void swtch(struct context **old,
                                        struct context *new);
                             メモリ
                     %edi
                     %esi                           %esp
                     %ebx
★
                     %ebp
                     %eip(swtchの戻り先)



                                                   new(%edx)
                     %edi
                     %esi
                     %ebx
                     %ebp
                     %eip(swtchの戻り先)
xv6のコンテキストスイッチ
    • switch.S
                 void swtch(struct context **old,
                                        struct context *new);
                             メモリ
                     %edi                           %esp
                     %esi
                     %ebx
                     %ebp
★                    %eip(swtchの戻り先)



                                                   new(%edx)
                     %edi
                     %esi
                     %ebx
                     %ebp
                     %eip(swtchの戻り先)
xv6のコンテキストスイッチ
    • switch.S
                 void swtch(struct context **old,
                                        struct context *new);
                             メモリ                    %esp
                     %edi
                     %esi
                     %ebx
                     %ebp
                     %eip(swtchの戻り先)
★


                                                   new(%edx)
                     %edi
                     %esi
                     %ebx
                     %ebp
                     %eip(swtchの戻り先)
xv6のコンテキストスイッチ
    • switch.S
                 void swtch(struct context **old,
                                        struct context *new);
                             メモリ                    %esp
                     %edi                           *old(%eax)
                     %esi
                     %ebx
                     %ebp
                     %eip(swtchの戻り先)



★                                                  new(%edx)
                     %edi
                     %esi
                     %ebx
                     %ebp
                     %eip(swtchの戻り先)
xv6のコンテキストスイッチ
    • switch.S
                 void swtch(struct context **old,
                                        struct context *new);
                             メモリ                   *old(%eax)
                      %edi
                      %esi
                      %ebx
                      %ebp
                      %eip(swtchの戻り先)


                                                    %esp
                                                    new(%edx)
★                     %edi
                      %esi
                      %ebx
                      %ebp
                      %eip(swtchの戻り先)
xv6のコンテキストスイッチ
    • switch.S
                 void swtch(struct context **old,
                                        struct context *new);
                             メモリ                   *old(%eax)
                     %edi
                     %esi
                     %ebx
                     %ebp
                     %eip(swtchの戻り先)



                                                   new(%edx)
                     %edi                          %esp
                     %esi
                     %ebx
★                    %ebp
                     %eip(swtchの戻り先)
xv6のコンテキストスイッチ
    • switch.S
                 void swtch(struct context **old,
                                        struct context *new);
                             メモリ                   *old(%eax)
                     %edi
                     %esi
                     %ebx
                     %ebp
                     %eip(swtchの戻り先)



                                                   new(%edx)
                     %edi
                     %esi                           %esp
                     %ebx
                     %ebp
★                    %eip(swtchの戻り先)
xv6のコンテキストスイッチ
    • switch.S
                 void swtch(struct context **old,
                                        struct context *new);
                             メモリ                   *old(%eax)
                     %edi
                     %esi
                     %ebx
                     %ebp
                     %eip(swtchの戻り先)



                                                   new(%edx)
                     %edi
                     %esi
                     %ebx                           %esp
                     %ebp
                     %eip(swtchの戻り先)
★
xv6のコンテキストスイッチ
    • switch.S
                 void swtch(struct context **old,
                                        struct context *new);
                             メモリ                   *old(%eax)
                     %edi
                     %esi
                     %ebx
                     %ebp
                     %eip(swtchの戻り先)



                                                   new(%edx)
                     %edi
                     %esi
                     %ebx
                     %ebp                           %esp
                     %eip(swtchの戻り先)
★
xv6のコンテキストスイッチの流れ


ユーザプロセス1                                ユーザプロセス2

    タイマ割り込み                                 iret
                
割り込みハンドラ             スケジューラ             割り込みハンドラ
           swtch()            swtch()
(1) 割り込みの発生

●
    xv6では100msごとにタイマ割り込みが発生
●
    割り込みが発生すると
    –   特権レベルが3から0に移行
    –   スタックがカーネルスタックに切り替わる
        (TSSからカーネル用%espと%ssを読み込む)
    –   スタックに%ss, %esp, %eflags, %cs, %eip を積む
        (現在実行していたプロセスの状態を積む)
    –   対応する割り込みハンドラに移行
(1) 割り込みの発生

    xv6では
●
    vectors.S (vectors.plから生成される) 内に定義してあ
    る vector$i() ($iは割り込み番号) が呼び出される
    (割り込みハンドラの設定は trap.c の tvinit(), idtinit(), いずれも main.c
    のmain()から呼ばれる )
●
    vector$i から trapasm.S の alltraps() に飛ぶ
(2) 割り込みハンドラの処理
●
    trapasm.S alltraps




                         ・自動に退避されないレジスタを退避
                         ・カーネル用セグメントの設定
                         ・最終的に trap.c の trap()を呼ぶ
(2) 割り込みハンドラの処理

●
     trap.c の trap() でそれぞれの処理に応じた割り込み処
     理をおこなう
     (割り込みハンドラごとに処理をおこなっていない)
●
     タイマ割り込みの場合 CPU 時間切れなら proc.c の yield()を呼ぶ
●
     yield()からさらに proc.cの shced()が呼ばれる




    タイマ割り込み → vectors.S#vector$i() → trapasm.S#alltraps()
    → trap.c#trap() → proc.c#yield() → proc.c#shced()
(2) 割り込みハンドラの処理
●
    proc.c の sched()
    スケジューラプロセスにコンテキストスイッチする


                   ・proc‥現在のプロセスの情報をも
                   つ構造体
                   ・cpu‥各CPUが持つCPUの情報を
                   もつ構造体
                   それぞれproc.h で定義




                             コンテキストの切り替え
                   •swtch()からの戻り先 (cpu->scheduler.eip)
                    は proc.c の scheduler()
(3) スケジューラの処理   proc.c
                scheduler()




                   次に実行するプロセス
                   を探す(ラウンドロビン)




                  メモリ空間の切り替え
                  選択したプロセスにswtch()
★                  sched()のswtch()から
                   の戻り先
                   メモリ空間をカーネル用
                   に切り替え
(3) スケジューラの処理

●
    何故sched()のswtch()からscheduler()に戻るのか?
    → ブートローダから呼ばれることになる main.c の
    main()でinitプロセス(proc[0])を起動後shceduler()を呼
    ぶため
(4) 割り込みハンドラの処理(後半)
    ●
        proc.c の sched()
        scheduler() から swtch() によって選択されたプロセスの再開




★
                                   ここから処理が再開
(4) 割り込みハンドラの処理(後半)

●
    最終的にalltrap() まで return し,そこで iret して割り込み終了
●
    iret でスタックからプロセスの状態を復帰させる.このとき特権レ
    ベルも3に戻る
    スタックが切り替わっているので別のプロセス状態に戻る

    trapasm.S
                                    メモリ
                               %eip
                               %cs
                               %eflags
                               %esp
                               %ss
xv6のコンテキストスイッチの流れ(再掲)


ユーザプロセス1                                ユーザプロセス2

    タイマ割り込み                                 iret
                
割り込みハンドラ             スケジューラ             割り込みハンドラ
           swtch()            swtch()
まとめ

●
    PDP11がいやな人はxv6読んでみたらどうでしょうか
●
    いろいろと改造のしどころ有り

More Related Content

What's hot

第 1 回 Jetson ユーザー勉強会
第 1 回 Jetson ユーザー勉強会第 1 回 Jetson ユーザー勉強会
第 1 回 Jetson ユーザー勉強会NVIDIA Japan
 
第1回ROS勉強会発表資料 ROS+Gazeboではじめるロボットシミュレーション
第1回ROS勉強会発表資料 ROS+Gazeboではじめるロボットシミュレーション第1回ROS勉強会発表資料 ROS+Gazeboではじめるロボットシミュレーション
第1回ROS勉強会発表資料 ROS+Gazeboではじめるロボットシミュレーションakio19937
 
研究者のための Python による FPGA 入門
研究者のための Python による FPGA 入門研究者のための Python による FPGA 入門
研究者のための Python による FPGA 入門ryos36
 
Deep Dive into the Linux Kernel - メモリ管理におけるCompaction機能について
Deep Dive into the Linux Kernel - メモリ管理におけるCompaction機能についてDeep Dive into the Linux Kernel - メモリ管理におけるCompaction機能について
Deep Dive into the Linux Kernel - メモリ管理におけるCompaction機能についてNTT DATA Technology & Innovation
 
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けモノビット エンジン
 
Yoctoで綺麗なkernel configを作る
Yoctoで綺麗なkernel configを作るYoctoで綺麗なkernel configを作る
Yoctoで綺麗なkernel configを作るshimadah
 
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps条件分岐とcmovとmaxps
条件分岐とcmovとmaxpsMITSUNARI Shigeo
 
0章 Linuxカーネルを読む前に最低限知っておくべきこと
0章 Linuxカーネルを読む前に最低限知っておくべきこと0章 Linuxカーネルを読む前に最低限知っておくべきこと
0章 Linuxカーネルを読む前に最低限知っておくべきことmao999
 
【Unity】 Behavior TreeでAIを作る
 【Unity】 Behavior TreeでAIを作る 【Unity】 Behavior TreeでAIを作る
【Unity】 Behavior TreeでAIを作るtorisoup
 
ゼロから始める自作 CPU 入門
ゼロから始める自作 CPU 入門ゼロから始める自作 CPU 入門
ゼロから始める自作 CPU 入門Hirotaka Kawata
 
C++でできる!OS自作入門
C++でできる!OS自作入門C++でできる!OS自作入門
C++でできる!OS自作入門uchan_nos
 
Rust で RTOS を考える
Rust で RTOS を考えるRust で RTOS を考える
Rust で RTOS を考えるryuz88
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチMasami Ichikawa
 
カスタムメモリマネージャと高速なメモリアロケータについて
カスタムメモリマネージャと高速なメモリアロケータについてカスタムメモリマネージャと高速なメモリアロケータについて
カスタムメモリマネージャと高速なメモリアロケータについてalwei
 
不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarrayRyosuke839
 
STMとROSをシリアル通信させて移動ロボットを作る
STMとROSをシリアル通信させて移動ロボットを作るSTMとROSをシリアル通信させて移動ロボットを作る
STMとROSをシリアル通信させて移動ロボットを作るmozyanari
 

What's hot (20)

明日使えないすごいビット演算
明日使えないすごいビット演算明日使えないすごいビット演算
明日使えないすごいビット演算
 
第 1 回 Jetson ユーザー勉強会
第 1 回 Jetson ユーザー勉強会第 1 回 Jetson ユーザー勉強会
第 1 回 Jetson ユーザー勉強会
 
第1回ROS勉強会発表資料 ROS+Gazeboではじめるロボットシミュレーション
第1回ROS勉強会発表資料 ROS+Gazeboではじめるロボットシミュレーション第1回ROS勉強会発表資料 ROS+Gazeboではじめるロボットシミュレーション
第1回ROS勉強会発表資料 ROS+Gazeboではじめるロボットシミュレーション
 
研究者のための Python による FPGA 入門
研究者のための Python による FPGA 入門研究者のための Python による FPGA 入門
研究者のための Python による FPGA 入門
 
Deep Dive into the Linux Kernel - メモリ管理におけるCompaction機能について
Deep Dive into the Linux Kernel - メモリ管理におけるCompaction機能についてDeep Dive into the Linux Kernel - メモリ管理におけるCompaction機能について
Deep Dive into the Linux Kernel - メモリ管理におけるCompaction機能について
 
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分け
 
Yoctoで綺麗なkernel configを作る
Yoctoで綺麗なkernel configを作るYoctoで綺麗なkernel configを作る
Yoctoで綺麗なkernel configを作る
 
UnityとROSの連携について
UnityとROSの連携についてUnityとROSの連携について
UnityとROSの連携について
 
Marp Tutorial
Marp TutorialMarp Tutorial
Marp Tutorial
 
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps条件分岐とcmovとmaxps
条件分岐とcmovとmaxps
 
0章 Linuxカーネルを読む前に最低限知っておくべきこと
0章 Linuxカーネルを読む前に最低限知っておくべきこと0章 Linuxカーネルを読む前に最低限知っておくべきこと
0章 Linuxカーネルを読む前に最低限知っておくべきこと
 
【Unity】 Behavior TreeでAIを作る
 【Unity】 Behavior TreeでAIを作る 【Unity】 Behavior TreeでAIを作る
【Unity】 Behavior TreeでAIを作る
 
ゼロから始める自作 CPU 入門
ゼロから始める自作 CPU 入門ゼロから始める自作 CPU 入門
ゼロから始める自作 CPU 入門
 
lsh
lshlsh
lsh
 
C++でできる!OS自作入門
C++でできる!OS自作入門C++でできる!OS自作入門
C++でできる!OS自作入門
 
Rust で RTOS を考える
Rust で RTOS を考えるRust で RTOS を考える
Rust で RTOS を考える
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチ
 
カスタムメモリマネージャと高速なメモリアロケータについて
カスタムメモリマネージャと高速なメモリアロケータについてカスタムメモリマネージャと高速なメモリアロケータについて
カスタムメモリマネージャと高速なメモリアロケータについて
 
不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray
 
STMとROSをシリアル通信させて移動ロボットを作る
STMとROSをシリアル通信させて移動ロボットを作るSTMとROSをシリアル通信させて移動ロボットを作る
STMとROSをシリアル通信させて移動ロボットを作る
 

Viewers also liked

あなたの知らないネットワークプログラミングの世界
あなたの知らないネットワークプログラミングの世界あなたの知らないネットワークプログラミングの世界
あなたの知らないネットワークプログラミングの世界Ryousei Takano
 
An other world awaits you
An other world awaits youAn other world awaits you
An other world awaits you信之 岩永
 
Kernel vm study_2_xv6_scheduler_part1_revised
Kernel vm study_2_xv6_scheduler_part1_revisedKernel vm study_2_xv6_scheduler_part1_revised
Kernel vm study_2_xv6_scheduler_part1_revisedToshiaki Nozawa
 
とある帽子の大蛇料理Ⅱ
とある帽子の大蛇料理Ⅱとある帽子の大蛇料理Ⅱ
とある帽子の大蛇料理ⅡMasami Ichikawa
 
100Gbpsソフトウェアルータの実現可能性に関する論文
100Gbpsソフトウェアルータの実現可能性に関する論文100Gbpsソフトウェアルータの実現可能性に関する論文
100Gbpsソフトウェアルータの実現可能性に関する論文y_uuki
 
User-space Network Processing
User-space Network ProcessingUser-space Network Processing
User-space Network ProcessingRyousei Takano
 
デバドラを書いてみよう!
デバドラを書いてみよう!デバドラを書いてみよう!
デバドラを書いてみよう!Masami Ichikawa
 
I/O仮想化最前線〜ネットワークI/Oを中心に〜
I/O仮想化最前線〜ネットワークI/Oを中心に〜I/O仮想化最前線〜ネットワークI/Oを中心に〜
I/O仮想化最前線〜ネットワークI/Oを中心に〜Ryousei Takano
 
Disruptive IP Networking with Intel DPDK on Linux
Disruptive IP Networking with Intel DPDK on LinuxDisruptive IP Networking with Intel DPDK on Linux
Disruptive IP Networking with Intel DPDK on LinuxNaoto MATSUMOTO
 
クラウド環境におけるキャッシュメモリQoS制御の評価
クラウド環境におけるキャッシュメモリQoS制御の評価クラウド環境におけるキャッシュメモリQoS制御の評価
クラウド環境におけるキャッシュメモリQoS制御の評価Ryousei Takano
 
Async deepdive before de:code
Async deepdive before de:codeAsync deepdive before de:code
Async deepdive before de:codeKouji Matsui
 
continuatioN Linking
continuatioN LinkingcontinuatioN Linking
continuatioN LinkingKouji Matsui
 
これからの「async/await」の話をしよう
これからの「async/await」の話をしようこれからの「async/await」の話をしよう
これからの「async/await」の話をしようKouji Matsui
 
async/awaitダークサイド is 何
async/awaitダークサイド is 何async/awaitダークサイド is 何
async/awaitダークサイド is 何Kouji Matsui
 
Xeon dとlagopusと、pktgen dpdk
Xeon dとlagopusと、pktgen dpdkXeon dとlagopusと、pktgen dpdk
Xeon dとlagopusと、pktgen dpdkMasaru Oki
 
Dpdk環境の話
Dpdk環境の話Dpdk環境の話
Dpdk環境の話Masaru Oki
 
async/await不要論
async/await不要論async/await不要論
async/await不要論bleis tift
 

Viewers also liked (20)

あなたの知らないネットワークプログラミングの世界
あなたの知らないネットワークプログラミングの世界あなたの知らないネットワークプログラミングの世界
あなたの知らないネットワークプログラミングの世界
 
An other world awaits you
An other world awaits youAn other world awaits you
An other world awaits you
 
Kernel vm study_2_xv6_scheduler_part1_revised
Kernel vm study_2_xv6_scheduler_part1_revisedKernel vm study_2_xv6_scheduler_part1_revised
Kernel vm study_2_xv6_scheduler_part1_revised
 
πολλαπλασιασμοι ενοτητα 11
πολλαπλασιασμοι ενοτητα 11πολλαπλασιασμοι ενοτητα 11
πολλαπλασιασμοι ενοτητα 11
 
とある帽子の大蛇料理Ⅱ
とある帽子の大蛇料理Ⅱとある帽子の大蛇料理Ⅱ
とある帽子の大蛇料理Ⅱ
 
Bish Bash Bosh & Co
Bish Bash Bosh & Co Bish Bash Bosh & Co
Bish Bash Bosh & Co
 
100Gbpsソフトウェアルータの実現可能性に関する論文
100Gbpsソフトウェアルータの実現可能性に関する論文100Gbpsソフトウェアルータの実現可能性に関する論文
100Gbpsソフトウェアルータの実現可能性に関する論文
 
User-space Network Processing
User-space Network ProcessingUser-space Network Processing
User-space Network Processing
 
デバドラを書いてみよう!
デバドラを書いてみよう!デバドラを書いてみよう!
デバドラを書いてみよう!
 
I/O仮想化最前線〜ネットワークI/Oを中心に〜
I/O仮想化最前線〜ネットワークI/Oを中心に〜I/O仮想化最前線〜ネットワークI/Oを中心に〜
I/O仮想化最前線〜ネットワークI/Oを中心に〜
 
Disruptive IP Networking with Intel DPDK on Linux
Disruptive IP Networking with Intel DPDK on LinuxDisruptive IP Networking with Intel DPDK on Linux
Disruptive IP Networking with Intel DPDK on Linux
 
クラウド環境におけるキャッシュメモリQoS制御の評価
クラウド環境におけるキャッシュメモリQoS制御の評価クラウド環境におけるキャッシュメモリQoS制御の評価
クラウド環境におけるキャッシュメモリQoS制御の評価
 
DPDKを拡張してみた話し
DPDKを拡張してみた話しDPDKを拡張してみた話し
DPDKを拡張してみた話し
 
Async deepdive before de:code
Async deepdive before de:codeAsync deepdive before de:code
Async deepdive before de:code
 
continuatioN Linking
continuatioN LinkingcontinuatioN Linking
continuatioN Linking
 
これからの「async/await」の話をしよう
これからの「async/await」の話をしようこれからの「async/await」の話をしよう
これからの「async/await」の話をしよう
 
async/awaitダークサイド is 何
async/awaitダークサイド is 何async/awaitダークサイド is 何
async/awaitダークサイド is 何
 
Xeon dとlagopusと、pktgen dpdk
Xeon dとlagopusと、pktgen dpdkXeon dとlagopusと、pktgen dpdk
Xeon dとlagopusと、pktgen dpdk
 
Dpdk環境の話
Dpdk環境の話Dpdk環境の話
Dpdk環境の話
 
async/await不要論
async/await不要論async/await不要論
async/await不要論
 

More from mfumi

MMDs 12.3 SVM
MMDs 12.3 SVMMMDs 12.3 SVM
MMDs 12.3 SVMmfumi
 
MMDs10.6-7
MMDs10.6-7MMDs10.6-7
MMDs10.6-7mfumi
 
IA16 2
IA16 2IA16 2
IA16 2mfumi
 
IA16
IA16IA16
IA16mfumi
 
IA14
IA14IA14
IA14mfumi
 
木を綺麗に描画するアルゴリズム
木を綺麗に描画するアルゴリズム木を綺麗に描画するアルゴリズム
木を綺麗に描画するアルゴリズムmfumi
 
MMDs Chapter 9
MMDs Chapter 9MMDs Chapter 9
MMDs Chapter 9mfumi
 
グラフを奇麗に描画するアルゴリズム
グラフを奇麗に描画するアルゴリズムグラフを奇麗に描画するアルゴリズム
グラフを奇麗に描画するアルゴリズムmfumi
 
Algorithms Introduction 9章
Algorithms Introduction 9章Algorithms Introduction 9章
Algorithms Introduction 9章mfumi
 
MMDs 6.3-6.5
MMDs 6.3-6.5MMDs 6.3-6.5
MMDs 6.3-6.5mfumi
 
MMDs Chapter 5.1 PageRank
MMDs Chapter 5.1 PageRankMMDs Chapter 5.1 PageRank
MMDs Chapter 5.1 PageRankmfumi
 
ファイルの隠し方
ファイルの隠し方ファイルの隠し方
ファイルの隠し方mfumi
 

More from mfumi (12)

MMDs 12.3 SVM
MMDs 12.3 SVMMMDs 12.3 SVM
MMDs 12.3 SVM
 
MMDs10.6-7
MMDs10.6-7MMDs10.6-7
MMDs10.6-7
 
IA16 2
IA16 2IA16 2
IA16 2
 
IA16
IA16IA16
IA16
 
IA14
IA14IA14
IA14
 
木を綺麗に描画するアルゴリズム
木を綺麗に描画するアルゴリズム木を綺麗に描画するアルゴリズム
木を綺麗に描画するアルゴリズム
 
MMDs Chapter 9
MMDs Chapter 9MMDs Chapter 9
MMDs Chapter 9
 
グラフを奇麗に描画するアルゴリズム
グラフを奇麗に描画するアルゴリズムグラフを奇麗に描画するアルゴリズム
グラフを奇麗に描画するアルゴリズム
 
Algorithms Introduction 9章
Algorithms Introduction 9章Algorithms Introduction 9章
Algorithms Introduction 9章
 
MMDs 6.3-6.5
MMDs 6.3-6.5MMDs 6.3-6.5
MMDs 6.3-6.5
 
MMDs Chapter 5.1 PageRank
MMDs Chapter 5.1 PageRankMMDs Chapter 5.1 PageRank
MMDs Chapter 5.1 PageRank
 
ファイルの隠し方
ファイルの隠し方ファイルの隠し方
ファイルの隠し方
 

Recently uploaded

知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptxsn679259
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Gamesatsushi061452
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...Toru Tamaki
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsWSO2
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video UnderstandingToru Tamaki
 

Recently uploaded (10)

知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 

xv6のコンテキストスイッチを読む

  • 2. 自己紹介 ● セキュリティキャンプ2012OS組
  • 3. 最近こんな本が出ました はじめてのOSコードリーディング 青柳隆宏著 おすすめ! でも...
  • 4. UNIX V6 を読む上で大変なところ ● PDP11 ● Cの記法が古い (pre K&R) ● アセンブラの記法が特殊 ● デフォルトが8進数 ● etc...
  • 5. xv6とは ● MITで開発された教育用OS http://pdos.csail.mit.edu/6.828/2012/xv6.html ● UNIX V6 を x86 向けに書き直したもの ● 解説書有り http://pdos.csail.mit.edu/6.828/2012/xv6/book- rev7.pdf
  • 6. xv6の特徴 ● x86 ● マルチプロセッサ対応 ● バイナリはELF ● スワッピング機能はなし ● qemu+gdb で動作可
  • 7. コンテキストスイッチ ● プロセスのコンテキストを切り替える ● コンテキスト … – メモリ空間 → cr3 レジスタを切り替える – スタック → %esp を切り替える – 各種レジスタ → プロセスごとのスタックに退避&スタックから復帰
  • 8. xv6のコンテキストスイッチ • switch.S void swtch(struct context **old, struct context *new); • proc.h
  • 9. xv6のコンテキストスイッチ • switch.S void swtch(struct context **old, struct context *new); メモリ % % % ★ % %esp %eip(swtchの戻り先) new(%edx) %edi %esi %ebx %ebp %eip(swtchの戻り先)
  • 10. xv6のコンテキストスイッチ • switch.S void swtch(struct context **old, struct context *new); メモリ %edi %esi %ebx %esp ★ %ebp %eip(swtchの戻り先) new(%edx) %edi %esi %ebx %ebp %eip(swtchの戻り先)
  • 11. xv6のコンテキストスイッチ • switch.S void swtch(struct context **old, struct context *new); メモリ %edi %esi %esp %ebx ★ %ebp %eip(swtchの戻り先) new(%edx) %edi %esi %ebx %ebp %eip(swtchの戻り先)
  • 12. xv6のコンテキストスイッチ • switch.S void swtch(struct context **old, struct context *new); メモリ %edi %esp %esi %ebx %ebp ★ %eip(swtchの戻り先) new(%edx) %edi %esi %ebx %ebp %eip(swtchの戻り先)
  • 13. xv6のコンテキストスイッチ • switch.S void swtch(struct context **old, struct context *new); メモリ %esp %edi %esi %ebx %ebp %eip(swtchの戻り先) ★ new(%edx) %edi %esi %ebx %ebp %eip(swtchの戻り先)
  • 14. xv6のコンテキストスイッチ • switch.S void swtch(struct context **old, struct context *new); メモリ %esp %edi *old(%eax) %esi %ebx %ebp %eip(swtchの戻り先) ★ new(%edx) %edi %esi %ebx %ebp %eip(swtchの戻り先)
  • 15. xv6のコンテキストスイッチ • switch.S void swtch(struct context **old, struct context *new); メモリ *old(%eax) %edi %esi %ebx %ebp %eip(swtchの戻り先) %esp new(%edx) ★ %edi %esi %ebx %ebp %eip(swtchの戻り先)
  • 16. xv6のコンテキストスイッチ • switch.S void swtch(struct context **old, struct context *new); メモリ *old(%eax) %edi %esi %ebx %ebp %eip(swtchの戻り先) new(%edx) %edi %esp %esi %ebx ★ %ebp %eip(swtchの戻り先)
  • 17. xv6のコンテキストスイッチ • switch.S void swtch(struct context **old, struct context *new); メモリ *old(%eax) %edi %esi %ebx %ebp %eip(swtchの戻り先) new(%edx) %edi %esi %esp %ebx %ebp ★ %eip(swtchの戻り先)
  • 18. xv6のコンテキストスイッチ • switch.S void swtch(struct context **old, struct context *new); メモリ *old(%eax) %edi %esi %ebx %ebp %eip(swtchの戻り先) new(%edx) %edi %esi %ebx %esp %ebp %eip(swtchの戻り先) ★
  • 19. xv6のコンテキストスイッチ • switch.S void swtch(struct context **old, struct context *new); メモリ *old(%eax) %edi %esi %ebx %ebp %eip(swtchの戻り先) new(%edx) %edi %esi %ebx %ebp %esp %eip(swtchの戻り先) ★
  • 20. xv6のコンテキストスイッチの流れ ユーザプロセス1 ユーザプロセス2 タイマ割り込み iret   割り込みハンドラ スケジューラ 割り込みハンドラ swtch() swtch()
  • 21. (1) 割り込みの発生 ● xv6では100msごとにタイマ割り込みが発生 ● 割り込みが発生すると – 特権レベルが3から0に移行 – スタックがカーネルスタックに切り替わる (TSSからカーネル用%espと%ssを読み込む) – スタックに%ss, %esp, %eflags, %cs, %eip を積む (現在実行していたプロセスの状態を積む) – 対応する割り込みハンドラに移行
  • 22. (1) 割り込みの発生 xv6では ● vectors.S (vectors.plから生成される) 内に定義してあ る vector$i() ($iは割り込み番号) が呼び出される (割り込みハンドラの設定は trap.c の tvinit(), idtinit(), いずれも main.c のmain()から呼ばれる ) ● vector$i から trapasm.S の alltraps() に飛ぶ
  • 23. (2) 割り込みハンドラの処理 ● trapasm.S alltraps ・自動に退避されないレジスタを退避 ・カーネル用セグメントの設定 ・最終的に trap.c の trap()を呼ぶ
  • 24. (2) 割り込みハンドラの処理 ● trap.c の trap() でそれぞれの処理に応じた割り込み処 理をおこなう (割り込みハンドラごとに処理をおこなっていない) ● タイマ割り込みの場合 CPU 時間切れなら proc.c の yield()を呼ぶ ● yield()からさらに proc.cの shced()が呼ばれる タイマ割り込み → vectors.S#vector$i() → trapasm.S#alltraps() → trap.c#trap() → proc.c#yield() → proc.c#shced()
  • 25. (2) 割り込みハンドラの処理 ● proc.c の sched() スケジューラプロセスにコンテキストスイッチする ・proc‥現在のプロセスの情報をも つ構造体 ・cpu‥各CPUが持つCPUの情報を もつ構造体 それぞれproc.h で定義 コンテキストの切り替え •swtch()からの戻り先 (cpu->scheduler.eip) は proc.c の scheduler()
  • 26. (3) スケジューラの処理 proc.c scheduler() 次に実行するプロセス を探す(ラウンドロビン) メモリ空間の切り替え 選択したプロセスにswtch() ★ sched()のswtch()から の戻り先 メモリ空間をカーネル用 に切り替え
  • 27. (3) スケジューラの処理 ● 何故sched()のswtch()からscheduler()に戻るのか? → ブートローダから呼ばれることになる main.c の main()でinitプロセス(proc[0])を起動後shceduler()を呼 ぶため
  • 28. (4) 割り込みハンドラの処理(後半) ● proc.c の sched() scheduler() から swtch() によって選択されたプロセスの再開 ★ ここから処理が再開
  • 29. (4) 割り込みハンドラの処理(後半) ● 最終的にalltrap() まで return し,そこで iret して割り込み終了 ● iret でスタックからプロセスの状態を復帰させる.このとき特権レ ベルも3に戻る スタックが切り替わっているので別のプロセス状態に戻る trapasm.S メモリ %eip %cs %eflags %esp %ss
  • 30. xv6のコンテキストスイッチの流れ(再掲) ユーザプロセス1 ユーザプロセス2 タイマ割り込み iret   割り込みハンドラ スケジューラ 割り込みハンドラ swtch() swtch()
  • 31. まとめ ● PDP11がいやな人はxv6読んでみたらどうでしょうか ● いろいろと改造のしどころ有り