Submit Search
xv6のコンテキストスイッチを読む
3 likes
5,276 views
M
mfumi
第2回APASEC+第2期サイボウズ・ラボユース合同勉強会 (2013/3/29) 発表資料
Technology
Read more
1 of 31
Download now
Downloaded 14 times
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
More Related Content
PDF
x86とコンテキストスイッチ
Masami Ichikawa
PDF
EthernetやCPUなどの話
Takanori Sejima
PPTX
Map
kikairoya
PDF
C++でCプリプロセッサを作ったり速くしたりしたお話
Kinuko Yasuda
PDF
eBPFは何が嬉しいのか
Yutaro Hayakawa
PDF
イマドキC++erのモテカワリソース管理術
Kohsuke Yuasa
PDF
ダブル配列の豆知識
s5yata
PDF
CRC-32
7shi
x86とコンテキストスイッチ
Masami Ichikawa
EthernetやCPUなどの話
Takanori Sejima
Map
kikairoya
C++でCプリプロセッサを作ったり速くしたりしたお話
Kinuko Yasuda
eBPFは何が嬉しいのか
Yutaro Hayakawa
イマドキC++erのモテカワリソース管理術
Kohsuke Yuasa
ダブル配列の豆知識
s5yata
CRC-32
7shi
What's hot
(20)
PDF
高速な倍精度指数関数expの実装
MITSUNARI Shigeo
PDF
C++ マルチスレッドプログラミング
Kohsuke Yuasa
PDF
C++でできる!OS自作入門
uchan_nos
PPTX
C#とILとネイティブと
信之 岩永
PDF
SSE4.2の文字列処理命令の紹介
MITSUNARI Shigeo
PDF
Deflate
7shi
PDF
条件分岐とcmovとmaxps
MITSUNARI Shigeo
PDF
Intro to SVE 富岳のA64FXを触ってみた
MITSUNARI Shigeo
PDF
ゲーム開発者のための C++11/C++14
Ryo Suzuki
PDF
LLVM最適化のこつ
MITSUNARI Shigeo
PDF
様々な全域木問題
tmaehara
PPTX
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
Miki Shimogai
PDF
カスタムメモリマネージャと高速なメモリアロケータについて
alwei
PDF
ARM CPUにおけるSIMDを用いた高速計算入門
Fixstars Corporation
PDF
Union find(素集合データ構造)
AtCoder Inc.
PDF
Dockerfile を書くためのベストプラクティス解説編
Masahito Zembutsu
PDF
Web エンジニアが postgre sql を選ぶ 3 つの理由
Soudai Sone
PDF
Xbyakの紹介とその周辺
MITSUNARI Shigeo
PDF
プログラムを高速化する話
京大 マイコンクラブ
PDF
コンテナの作り方「Dockerは裏方で何をしているのか?」
Masahito Zembutsu
高速な倍精度指数関数expの実装
MITSUNARI Shigeo
C++ マルチスレッドプログラミング
Kohsuke Yuasa
C++でできる!OS自作入門
uchan_nos
C#とILとネイティブと
信之 岩永
SSE4.2の文字列処理命令の紹介
MITSUNARI Shigeo
Deflate
7shi
条件分岐とcmovとmaxps
MITSUNARI Shigeo
Intro to SVE 富岳のA64FXを触ってみた
MITSUNARI Shigeo
ゲーム開発者のための C++11/C++14
Ryo Suzuki
LLVM最適化のこつ
MITSUNARI Shigeo
様々な全域木問題
tmaehara
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
Miki Shimogai
カスタムメモリマネージャと高速なメモリアロケータについて
alwei
ARM CPUにおけるSIMDを用いた高速計算入門
Fixstars Corporation
Union find(素集合データ構造)
AtCoder Inc.
Dockerfile を書くためのベストプラクティス解説編
Masahito Zembutsu
Web エンジニアが postgre sql を選ぶ 3 つの理由
Soudai Sone
Xbyakの紹介とその周辺
MITSUNARI Shigeo
プログラムを高速化する話
京大 マイコンクラブ
コンテナの作り方「Dockerは裏方で何をしているのか?」
Masahito Zembutsu
Ad
Viewers also liked
(20)
PDF
あなたの知らないネットワークプログラミングの世界
Ryousei Takano
PPTX
An other world awaits you
信之 岩永
PDF
Kernel vm study_2_xv6_scheduler_part1_revised
Toshiaki Nozawa
PDF
πολλαπλασιασμοι ενοτητα 11
Γιαννόπουλος Γιάννης
PDF
とある帽子の大蛇料理Ⅱ
Masami Ichikawa
PPTX
Bish Bash Bosh & Co
Bish Bash Bosh & Co
PDF
100Gbpsソフトウェアルータの実現可能性に関する論文
y_uuki
PDF
User-space Network Processing
Ryousei Takano
PDF
デバドラを書いてみよう!
Masami Ichikawa
PDF
I/O仮想化最前線〜ネットワークI/Oを中心に〜
Ryousei Takano
PDF
Disruptive IP Networking with Intel DPDK on Linux
Naoto MATSUMOTO
PDF
クラウド環境におけるキャッシュメモリQoS制御の評価
Ryousei Takano
PDF
DPDKを拡張してみた話し
Lagopus SDN/OpenFlow switch
PDF
Async deepdive before de:code
Kouji Matsui
PDF
continuatioN Linking
Kouji Matsui
PDF
これからの「async/await」の話をしよう
Kouji Matsui
PDF
async/awaitダークサイド is 何
Kouji Matsui
PDF
Xeon dとlagopusと、pktgen dpdk
Masaru Oki
PDF
Dpdk環境の話
Masaru Oki
PDF
async/await不要論
bleis tift
あなたの知らないネットワークプログラミングの世界
Ryousei Takano
An other world awaits you
信之 岩永
Kernel vm study_2_xv6_scheduler_part1_revised
Toshiaki Nozawa
πολλαπλασιασμοι ενοτητα 11
Γιαννόπουλος Γιάννης
とある帽子の大蛇料理Ⅱ
Masami Ichikawa
Bish Bash Bosh & Co
Bish Bash Bosh & Co
100Gbpsソフトウェアルータの実現可能性に関する論文
y_uuki
User-space Network Processing
Ryousei Takano
デバドラを書いてみよう!
Masami Ichikawa
I/O仮想化最前線〜ネットワークI/Oを中心に〜
Ryousei Takano
Disruptive IP Networking with Intel DPDK on Linux
Naoto MATSUMOTO
クラウド環境におけるキャッシュメモリQoS制御の評価
Ryousei Takano
DPDKを拡張してみた話し
Lagopus SDN/OpenFlow switch
Async deepdive before de:code
Kouji Matsui
continuatioN Linking
Kouji Matsui
これからの「async/await」の話をしよう
Kouji Matsui
async/awaitダークサイド is 何
Kouji Matsui
Xeon dとlagopusと、pktgen dpdk
Masaru Oki
Dpdk環境の話
Masaru Oki
async/await不要論
bleis tift
Ad
Similar to xv6のコンテキストスイッチを読む
(10)
PDF
PFI Seminar 2010/02/18
Preferred Networks
PDF
V6read#3
magoroku Yamamoto
PDF
d-kami x86-1
Daisuke Kamikawa
PDF
2011.09.18 v7から始めるunix まとめ
Makiko Konoshima
PDF
初めてのCPUを作ってみた
Eric Sartre
PDF
mbedではじめる組み込みHaskellプログラミング
Kiwamu Okabe
PPTX
もしも… Javaでヘテロジニアスコアが使えたら…
Yasumasa Suenaga
PDF
V6 unix in okinawa
magoroku Yamamoto
PDF
Tora pointer3
MARISHI
PDF
llvm入門
MITSUNARI Shigeo
PFI Seminar 2010/02/18
Preferred Networks
V6read#3
magoroku Yamamoto
d-kami x86-1
Daisuke Kamikawa
2011.09.18 v7から始めるunix まとめ
Makiko Konoshima
初めてのCPUを作ってみた
Eric Sartre
mbedではじめる組み込みHaskellプログラミング
Kiwamu Okabe
もしも… Javaでヘテロジニアスコアが使えたら…
Yasumasa Suenaga
V6 unix in okinawa
magoroku Yamamoto
Tora pointer3
MARISHI
llvm入門
MITSUNARI Shigeo
More from mfumi
(12)
PDF
MMDs 12.3 SVM
mfumi
PDF
MMDs10.6-7
mfumi
PDF
IA16 2
mfumi
PDF
IA16
mfumi
PDF
IA14
mfumi
PDF
木を綺麗に描画するアルゴリズム
mfumi
PDF
MMDs Chapter 9
mfumi
PDF
グラフを奇麗に描画するアルゴリズム
mfumi
PDF
Algorithms Introduction 9章
mfumi
PDF
MMDs 6.3-6.5
mfumi
PDF
MMDs Chapter 5.1 PageRank
mfumi
PDF
ファイルの隠し方
mfumi
MMDs 12.3 SVM
mfumi
MMDs10.6-7
mfumi
IA16 2
mfumi
IA16
mfumi
IA14
mfumi
木を綺麗に描画するアルゴリズム
mfumi
MMDs Chapter 9
mfumi
グラフを奇麗に描画するアルゴリズム
mfumi
Algorithms Introduction 9章
mfumi
MMDs 6.3-6.5
mfumi
MMDs Chapter 5.1 PageRank
mfumi
ファイルの隠し方
mfumi
xv6のコンテキストスイッチを読む
1.
xv6のコンテキストスイッチを読む
@mfumi2
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読んでみたらどうでしょうか ● いろいろと改造のしどころ有り
Download