SlideShare ist ein Scribd-Unternehmen logo
1 von 25
Downloaden Sie, um offline zu lesen
12ステップで作る組込みOS自作入門
      9thステップ




                @sandai
【参考書籍】
12ステップで作る組込みOS自作入門
【内容】
1ステップずつ、実際に動かしながらプログラムを発展さ
せていく方式で無理なく学べる。OSやハードウェアに詳
しくない方にも理解できるよう
に十分な説明を提供

坂井 弘亮(著)
カットシステム(2010/5)

【税込価格】
4,410円

【サポートページ】
http://kozos.jp/books/makeos/
もくじ
1.優先度ベースのスケジューリング
2.優先度の実装
3.プログラムの実行
4.まとめ
1.優先度ベースのスケジューリング
優先度
●   組込みのOSでは一般的に優先度をベースにスケ
    ジューリングが行われている
●   優先度の高いスレッドが常に動作する
スレッドの状態
●   ここまでのプログラムのスレッドは常に「動作
    可能」の状態。常に動いているってこと
●   これだと複数スレッド間で同期的な動作をさせ
    られない
    –   あるスレッドが特定の処理を行うまで別スレッドが
        待ち合わせする、といったことができない
●   そこでスレッドに「待ち」という状態を追加す
    る
    –   スレッドを待ちにするシステム・コールを作る
●   待ち状態にするにはレディー・キューからス
    レッドを抜けばいい
スレッドにおける状態の呼び名
●   スレッドが「待ち」状態に入ることをスリープ
    やウェイティングと呼ぶ
●   スレッドがキューに繋がって動作可能の状態を
    レディーと呼ぶ
●   スリープ状態のスレッドをレディー状態に戻す
    ことをウェイクアップと呼ぶ
●   動作中のスレッドはアクティブやランニングな
    どと呼ぶ
●   このように、スレッドにはレディーとスリープ
    の2つの状態が存在する
優先度とプリエンプション
●   ここまでのプログラムだと、実行可能なスレッ
    ドが複数ある場合はシステム・コールによって
    順番に実行するようになっている
●   しかし、組込みシステムではあるスレッドがレ
    ディー状態になったとき、別のスレッドをさし
    おいてでも動作させたい場合がある
    –   たとえば車のエアバック制御は、衝突を検知したら
        一番に処理したい部分
●   ある割込みが発生した場合に、必ず一定時間内
    で処理を開始するという時間保証が行えるかど
    うかを、OSのリアルタイム性と言う
リアルタイムOS
●   リアルタイム性を提供するOSをリアルタイムOS
    と呼ぶ
●   ハードウェア制御だと、ある割込み発生から特
    定の処理を一定時間内に必ず行う必要があるな
    どの時間制約がある場合がある。こういったと
    きにOSのリアルタイム性は重要
●   複数のスレッドがレディー状態のとき、どれを
    動作するのか選択する必要があり、それに優先
    度が利用される
プリエンプション
●   スレッドの動作が別のスレッドに強制的に切り
    替わる動作を一般的にプリエンプションと呼ぶ
    –   優先度を持ったスレッドなら、優先度の低いスレッ
        ドの実行が中断され、優先度の高いスレッドが実行
        されることでこのように動作する
●   プリエンプションが可能であることをプリエン
    プティブと言い(先取り可能とも言う)、スレッ
    ドが突然中断するようなことが無いのであれば
    ノンプリエンプティブと呼ぶ
●   KOZOSはプリエンプティブなOSとして開発して
    いく
アイドル・スレッド
●   スレッドに優先度がつくと、やることがないと
    きにCPUを省電力モードにするアイドル・ス
    レッドが簡単に実装できる
●   今のプログラムだとレディー・キューが空にな
    るとシステムダウンしてしまうため、空になら
    ないよう一番低い優先度で「ムダななんらかの
    処理」をするスレッドを常に動かしておく必要
    がある
while(1) {
    // なにもしない状態
}
省電力モード
●   一般的なCPUには省電力モードという状態があ
    る
    –   x86でいうところのHLT命令かな
●   CPUを省電力モードにすると命令の実行を停止
    し、割込みが入るまで待つ状態になる
    –   クロックが止まるので省電になるようだ
●   他に動作する処理がないなら、アイドル・ス
    レッドを実行して待機状態にすれば良い
while(1) {
    // ビジーループよりこうした命令を使うべきだね
    (CPUを省電力モードに遷移する命令);
}
2.優先度の実装
プログラムの修正と追加
●   追加ファイル
    –   test09_1.c,test09_2,test09_3...スレッドとなる
        サンプルプログラム
●   修正ファイル
    –   kozos.h,kozos.c...優先度を実装
    –   syscall.h,syscall.c...スレッド制御のシステム
        コール追加
    –   main.c...アイドル・スレッド追加
    –   Makefile
プログラムの修正内容
●   スレッドの状態を制御するシステム・コールの
    追加
    –   kz_wait(),kz_sleep(),kz_wakeup(),kz_getid(),kz
        _chpri()
●   優先度の追加
    –   構造体に値を持たせて
●   readayqueを配列化
    –   優先度のスレッド別にまとめる形
    –   ここのらへんのスケジューリングのアルゴリズムが
        少し複雑かなってぐらいで、あとは8thステップの
        延長
3.プログラムの実行
ビルドの失敗(kozos.c)
●   パディングのサイズを変更
typedef struct _kz_thread {
    .
    .
    kz_context context;
    char dummy[8]; ←dummy[16]からdummy[8]にした
} kz_thread;
プログラムの実行
/Users/sandai/12step/src/09/os% sudo cu -l /dev/tty.usbserial-FTG6PQ4H
kzload> run
.
.
test09_3 started.
test09_3 wakeup in (test09_1).
test09_1 sleep out.
test09_1 chpri in.
test09_3 wakeup out.
test09_3 wakeup in (test09_2).
test09_2 sleep out.
test09_2 chpri in.
test09_1 chpri out.
test09_1 wait in.
test09_3 wakeup out.
test09_3 wait in.
test09_2 chpri out.
test09_2 wait in.
test09_1 wait out.
test09_1 trap in.
test09_1 DOWN.
test09_1 EXIT.
test09_3 wait out.
test09_3 exit in.
test09_3 EXIT.
test09_2 wait out.
test09_2 exit.
test09_2 EXIT.
4.まとめ
まとめ1
●   8thステップを理解していないと9thステップは
    何をやっているのかわからないはず
●   プログラムの修正部分に難しいコードはない
●   システム・コールとスケジューリング部分のア
    ルゴリズムの処理の流れが難しいので、そこを
    まとめておこう
まとめ2
●   下記のkz_run()のうち、test09_1_id = ...の
    処理の流れを記述しておく
●   kz_start()でstart_threads()が起動した後の
    ことなので注意
static int start_threads(int argc, char *argv[])
{
    test09_1_id = kz_run(test09_1_main, "test09_1", 1, 0x100, 0,
    .
    .
まとめ3
●   kz_run()
    –   kz_syscall()に渡すデータを構造体に保存
    –   kz_syscall()呼び出し
●   kz_syscall()
    –   current->syscall.xxxにシステムコールのタイプと
        kz_run()で受け取った構造体を設定
    –   asm volatile(“trapa #0”)で割込みが発生して
        thread_intr()呼び出し
まとめ4
●   thread_intr()
    –   handlers[type]()によりsyscall_intr()呼び出し
         ● 最終的にthread_run()が呼び出されてp-

           >un.run.ret = にcurrentが代入される
    –   schedule()呼び出し
         ● この部分でスケジューリングされるため、優先

           順位の高い初期スレッドのidleスレッドが動作
           対象。test09_1_mainには映らないので注意
    –   dispatch()呼び出し
         ● currentにあるidleスレッドのstart_threadsが

           実行を再開
まとめ5
●   dispatch()が呼ばれると、割込みが発生した
    kz_syscall()にあるasm volatile(“trapa
    #0”)から続く
●   特に処理がないので、kz_run()に戻り、return
    param.un.run.retでtest09_1_idにその値が代
    入され、test09_2_id = ...と処理が同じよう
    に続く
まとめまとめ
●   kz_run()の流れは以上のような形
●   優先順位によってschedlue()で動作するスレッ
    ドが決まるので、ここを気をつけてみる必要が
    ある
●   あとはkz_sleep()が難しいかも。レディー・
    キューから外した場合、test09_1_idにスレッ
    ドIDが保存されていて、kz_sleep()ではそれを
    使ってレディー・キューに再度入れていること
    になっている
    –   スリープさせたスレッドの管理が微妙な気がするけ
        れど、こういうものなんだろうか

Weitere ähnliche Inhalte

Was ist angesagt?

Linuxのプロセススケジューラ(Reading the Linux process scheduler)
Linuxのプロセススケジューラ(Reading the Linux process scheduler)Linuxのプロセススケジューラ(Reading the Linux process scheduler)
Linuxのプロセススケジューラ(Reading the Linux process scheduler)
Hiraku Toyooka
 
Completely Fair Scheduler (CFS)
Completely Fair Scheduler (CFS)Completely Fair Scheduler (CFS)
Completely Fair Scheduler (CFS)
gokzy
 
x86-64/Linuxに独自メモリ空間を勝手増設
x86-64/Linuxに独自メモリ空間を勝手増設x86-64/Linuxに独自メモリ空間を勝手増設
x86-64/Linuxに独自メモリ空間を勝手増設
Minoru Nakamura
 

Was ist angesagt? (20)

リアルタイムOsのカスタマイズ
リアルタイムOsのカスタマイズリアルタイムOsのカスタマイズ
リアルタイムOsのカスタマイズ
 
[Basic 8] プロセスとスレッド / 入出力 / シェル
[Basic 8] プロセスとスレッド / 入出力 / シェル[Basic 8] プロセスとスレッド / 入出力 / シェル
[Basic 8] プロセスとスレッド / 入出力 / シェル
 
[Basic 7] OS の基本 / 割り込み / システム コール / メモリ管理
[Basic 7] OS の基本 / 割り込み / システム コール / メモリ管理[Basic 7] OS の基本 / 割り込み / システム コール / メモリ管理
[Basic 7] OS の基本 / 割り込み / システム コール / メモリ管理
 
[Basic 9] 並列処理 / 排他制御
[Basic 9] 並列処理 / 排他制御[Basic 9] 並列処理 / 排他制御
[Basic 9] 並列処理 / 排他制御
 
リアルタイムOSの必要性とTOPPERS/SSPの紹介
リアルタイムOSの必要性とTOPPERS/SSPの紹介リアルタイムOSの必要性とTOPPERS/SSPの紹介
リアルタイムOSの必要性とTOPPERS/SSPの紹介
 
Linuxのプロセススケジューラ(Reading the Linux process scheduler)
Linuxのプロセススケジューラ(Reading the Linux process scheduler)Linuxのプロセススケジューラ(Reading the Linux process scheduler)
Linuxのプロセススケジューラ(Reading the Linux process scheduler)
 
プロセスとコンテキストスイッチ
プロセスとコンテキストスイッチプロセスとコンテキストスイッチ
プロセスとコンテキストスイッチ
 
さわってみようTOPPERS/SSP
さわってみようTOPPERS/SSPさわってみようTOPPERS/SSP
さわってみようTOPPERS/SSP
 
ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。
 
あるコンテキストスイッチの話
あるコンテキストスイッチの話あるコンテキストスイッチの話
あるコンテキストスイッチの話
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチ
 
Linux女子会 - お仕事メリハリ術♪(プロセススケジューラ編)
Linux女子会 - お仕事メリハリ術♪(プロセススケジューラ編)Linux女子会 - お仕事メリハリ術♪(プロセススケジューラ編)
Linux女子会 - お仕事メリハリ術♪(プロセススケジューラ編)
 
X86opti01 nothingcosmos
X86opti01 nothingcosmosX86opti01 nothingcosmos
X86opti01 nothingcosmos
 
systemd 再入門
systemd 再入門systemd 再入門
systemd 再入門
 
Completely Fair Scheduler (CFS)
Completely Fair Scheduler (CFS)Completely Fair Scheduler (CFS)
Completely Fair Scheduler (CFS)
 
Minix Learning
Minix LearningMinix Learning
Minix Learning
 
Read daemon on 20121110 by shinaisan
Read daemon on 20121110 by shinaisanRead daemon on 20121110 by shinaisan
Read daemon on 20121110 by shinaisan
 
ぼくnmonです
ぼくnmonですぼくnmonです
ぼくnmonです
 
x86-64/Linuxに独自メモリ空間を勝手増設
x86-64/Linuxに独自メモリ空間を勝手増設x86-64/Linuxに独自メモリ空間を勝手増設
x86-64/Linuxに独自メモリ空間を勝手増設
 
Intel TSX について x86opti
Intel TSX について x86optiIntel TSX について x86opti
Intel TSX について x86opti
 

Andere mochten auch

30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
Hirotaka Kawata
 
低レイヤー入門
低レイヤー入門低レイヤー入門
低レイヤー入門
demuyan
 

Andere mochten auch (14)

組み込み向けC++のやり方を探る - mbedで楽しい組み込みプログラミング -
組み込み向けC++のやり方を探る - mbedで楽しい組み込みプログラミング -組み込み向けC++のやり方を探る - mbedで楽しい組み込みプログラミング -
組み込み向けC++のやり方を探る - mbedで楽しい組み込みプログラミング -
 
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
 
QEMUでARM64bitベアメタルプログラミング
QEMUでARM64bitベアメタルプログラミングQEMUでARM64bitベアメタルプログラミング
QEMUでARM64bitベアメタルプログラミング
 
組込みOSを作ってみよう!(オープンソースカンファレンス内セミナー資料)
組込みOSを作ってみよう!(オープンソースカンファレンス内セミナー資料)組込みOSを作ってみよう!(オープンソースカンファレンス内セミナー資料)
組込みOSを作ってみよう!(オープンソースカンファレンス内セミナー資料)
 
やってよかったOS作り
やってよかったOS作りやってよかったOS作り
やってよかったOS作り
 
低レイヤー入門
低レイヤー入門低レイヤー入門
低レイヤー入門
 
人工知能概論 1
人工知能概論 1人工知能概論 1
人工知能概論 1
 
ゼロから始める自作 CPU 入門
ゼロから始める自作 CPU 入門ゼロから始める自作 CPU 入門
ゼロから始める自作 CPU 入門
 
【2000行弱!】x86用自作カーネルの紹介
【2000行弱!】x86用自作カーネルの紹介【2000行弱!】x86用自作カーネルの紹介
【2000行弱!】x86用自作カーネルの紹介
 
Web系だって低レイヤーがやりたいんだよ! コンパイラことはじめ
Web系だって低レイヤーがやりたいんだよ! コンパイラことはじめWeb系だって低レイヤーがやりたいんだよ! コンパイラことはじめ
Web系だって低レイヤーがやりたいんだよ! コンパイラことはじめ
 
C++でできる!OS自作入門
C++でできる!OS自作入門C++でできる!OS自作入門
C++でできる!OS自作入門
 
Ctfのためのpython入門
Ctfのためのpython入門Ctfのためのpython入門
Ctfのためのpython入門
 
ハッキング実演
ハッキング実演ハッキング実演
ハッキング実演
 
CTF超入門 (for 第12回セキュリティさくら)
CTF超入門 (for 第12回セキュリティさくら)CTF超入門 (for 第12回セキュリティさくら)
CTF超入門 (for 第12回セキュリティさくら)
 

Ähnlich wie 【学習メモ#9th】12ステップで作る組込みOS自作入門

LPICレベル1技術解説セミナー(2012/11/11)
LPICレベル1技術解説セミナー(2012/11/11)LPICレベル1技術解説セミナー(2012/11/11)
LPICレベル1技術解説セミナー(2012/11/11)
Kazuko Itoda
 
分散メモリ環境におけるシェルスクリプトの高速化手法の提案
分散メモリ環境におけるシェルスクリプトの高速化手法の提案分散メモリ環境におけるシェルスクリプトの高速化手法の提案
分散メモリ環境におけるシェルスクリプトの高速化手法の提案
Keisuke Umeno
 
Q4 Mでメッセージキュー
Q4 MでメッセージキューQ4 Mでメッセージキュー
Q4 Mでメッセージキュー
ngi group.
 
あんなテスト、こんなテスト(this and that about testing)
あんなテスト、こんなテスト(this and that about testing)あんなテスト、こんなテスト(this and that about testing)
あんなテスト、こんなテスト(this and that about testing)
Takuya Tsuchida
 
Java concurrency in_practice_chap06
Java concurrency in_practice_chap06Java concurrency in_practice_chap06
Java concurrency in_practice_chap06
ohtsuchi
 
HandlerSocket plugin for MySQL
HandlerSocket plugin for MySQLHandlerSocket plugin for MySQL
HandlerSocket plugin for MySQL
akirahiguchi
 
COD2012 C3 : SQL Server 2012で振り返る、SQLOSのスレッド スケジューリング
COD2012 C3 : SQL Server 2012で振り返る、SQLOSのスレッド スケジューリングCOD2012 C3 : SQL Server 2012で振り返る、SQLOSのスレッド スケジューリング
COD2012 C3 : SQL Server 2012で振り返る、SQLOSのスレッド スケジューリング
Masayuki Ozawa
 
Principles of Transaction Processing Second Edition 7章 1, 2節
Principles of Transaction Processing Second Edition 7章 1, 2節Principles of Transaction Processing Second Edition 7章 1, 2節
Principles of Transaction Processing Second Edition 7章 1, 2節
Yuichiro Saito
 
LPICレベル1技術解説セミナー(2012/11/11)
LPICレベル1技術解説セミナー(2012/11/11)LPICレベル1技術解説セミナー(2012/11/11)
LPICレベル1技術解説セミナー(2012/11/11)
Kazuko Kanai
 
Principles of Transaction Processing Second Edition 9章 4~9節
Principles of Transaction Processing Second Edition 9章 4~9節Principles of Transaction Processing Second Edition 9章 4~9節
Principles of Transaction Processing Second Edition 9章 4~9節
Yuichiro Saito
 

Ähnlich wie 【学習メモ#9th】12ステップで作る組込みOS自作入門 (20)

LPICレベル1技術解説セミナー(2012/11/11)
LPICレベル1技術解説セミナー(2012/11/11)LPICレベル1技術解説セミナー(2012/11/11)
LPICレベル1技術解説セミナー(2012/11/11)
 
分散メモリ環境におけるシェルスクリプトの高速化手法の提案
分散メモリ環境におけるシェルスクリプトの高速化手法の提案分散メモリ環境におけるシェルスクリプトの高速化手法の提案
分散メモリ環境におけるシェルスクリプトの高速化手法の提案
 
Q4 Mでメッセージキュー
Q4 MでメッセージキューQ4 Mでメッセージキュー
Q4 Mでメッセージキュー
 
PHPとシグナル、その裏側
PHPとシグナル、その裏側PHPとシグナル、その裏側
PHPとシグナル、その裏側
 
あんなテスト、こんなテスト(this and that about testing)
あんなテスト、こんなテスト(this and that about testing)あんなテスト、こんなテスト(this and that about testing)
あんなテスト、こんなテスト(this and that about testing)
 
Java concurrency in_practice_chap06
Java concurrency in_practice_chap06Java concurrency in_practice_chap06
Java concurrency in_practice_chap06
 
HandlerSocket plugin for MySQL
HandlerSocket plugin for MySQLHandlerSocket plugin for MySQL
HandlerSocket plugin for MySQL
 
jenkinsで遊ぶ
jenkinsで遊ぶjenkinsで遊ぶ
jenkinsで遊ぶ
 
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
 
TotalViewを使った代表的なバグに対するアプローチ
TotalViewを使った代表的なバグに対するアプローチTotalViewを使った代表的なバグに対するアプローチ
TotalViewを使った代表的なバグに対するアプローチ
 
Powershell勉強会 v5 (こちらが最新です。)
Powershell勉強会 v5 (こちらが最新です。)Powershell勉強会 v5 (こちらが最新です。)
Powershell勉強会 v5 (こちらが最新です。)
 
COD2012 C3 : SQL Server 2012で振り返る、SQLOSのスレッド スケジューリング
COD2012 C3 : SQL Server 2012で振り返る、SQLOSのスレッド スケジューリングCOD2012 C3 : SQL Server 2012で振り返る、SQLOSのスレッド スケジューリング
COD2012 C3 : SQL Server 2012で振り返る、SQLOSのスレッド スケジューリング
 
Principles of Transaction Processing Second Edition 7章 1, 2節
Principles of Transaction Processing Second Edition 7章 1, 2節Principles of Transaction Processing Second Edition 7章 1, 2節
Principles of Transaction Processing Second Edition 7章 1, 2節
 
LPICレベル1技術解説セミナー(2012/11/11)
LPICレベル1技術解説セミナー(2012/11/11)LPICレベル1技術解説セミナー(2012/11/11)
LPICレベル1技術解説セミナー(2012/11/11)
 
短距離古典分子動力学計算の 高速化と大規模並列化
短距離古典分子動力学計算の 高速化と大規模並列化短距離古典分子動力学計算の 高速化と大規模並列化
短距離古典分子動力学計算の 高速化と大規模並列化
 
運用構築技術者の為のPSプログラミング第1回
運用構築技術者の為のPSプログラミング第1回運用構築技術者の為のPSプログラミング第1回
運用構築技術者の為のPSプログラミング第1回
 
Spmv9forpublic
Spmv9forpublicSpmv9forpublic
Spmv9forpublic
 
継続的デリバリー読書会資料 #1
継続的デリバリー読書会資料 #1継続的デリバリー読書会資料 #1
継続的デリバリー読書会資料 #1
 
Principles of Transaction Processing Second Edition 9章 4~9節
Principles of Transaction Processing Second Edition 9章 4~9節Principles of Transaction Processing Second Edition 9章 4~9節
Principles of Transaction Processing Second Edition 9章 4~9節
 
20180613 [TensorFlow分散学習] Horovodによる分散学習の実装方法と解説
20180613 [TensorFlow分散学習] Horovodによる分散学習の実装方法と解説20180613 [TensorFlow分散学習] Horovodによる分散学習の実装方法と解説
20180613 [TensorFlow分散学習] Horovodによる分散学習の実装方法と解説
 

Kürzlich hochgeladen

Kürzlich hochgeladen (10)

知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
論文紹介: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
 
論文紹介: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...
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
論文紹介: 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 を勉強してみる その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デバイス
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 

【学習メモ#9th】12ステップで作る組込みOS自作入門

  • 5. 優先度 ● 組込みのOSでは一般的に優先度をベースにスケ ジューリングが行われている ● 優先度の高いスレッドが常に動作する
  • 6. スレッドの状態 ● ここまでのプログラムのスレッドは常に「動作 可能」の状態。常に動いているってこと ● これだと複数スレッド間で同期的な動作をさせ られない – あるスレッドが特定の処理を行うまで別スレッドが 待ち合わせする、といったことができない ● そこでスレッドに「待ち」という状態を追加す る – スレッドを待ちにするシステム・コールを作る ● 待ち状態にするにはレディー・キューからス レッドを抜けばいい
  • 7. スレッドにおける状態の呼び名 ● スレッドが「待ち」状態に入ることをスリープ やウェイティングと呼ぶ ● スレッドがキューに繋がって動作可能の状態を レディーと呼ぶ ● スリープ状態のスレッドをレディー状態に戻す ことをウェイクアップと呼ぶ ● 動作中のスレッドはアクティブやランニングな どと呼ぶ ● このように、スレッドにはレディーとスリープ の2つの状態が存在する
  • 8. 優先度とプリエンプション ● ここまでのプログラムだと、実行可能なスレッ ドが複数ある場合はシステム・コールによって 順番に実行するようになっている ● しかし、組込みシステムではあるスレッドがレ ディー状態になったとき、別のスレッドをさし おいてでも動作させたい場合がある – たとえば車のエアバック制御は、衝突を検知したら 一番に処理したい部分 ● ある割込みが発生した場合に、必ず一定時間内 で処理を開始するという時間保証が行えるかど うかを、OSのリアルタイム性と言う
  • 9. リアルタイムOS ● リアルタイム性を提供するOSをリアルタイムOS と呼ぶ ● ハードウェア制御だと、ある割込み発生から特 定の処理を一定時間内に必ず行う必要があるな どの時間制約がある場合がある。こういったと きにOSのリアルタイム性は重要 ● 複数のスレッドがレディー状態のとき、どれを 動作するのか選択する必要があり、それに優先 度が利用される
  • 10. プリエンプション ● スレッドの動作が別のスレッドに強制的に切り 替わる動作を一般的にプリエンプションと呼ぶ – 優先度を持ったスレッドなら、優先度の低いスレッ ドの実行が中断され、優先度の高いスレッドが実行 されることでこのように動作する ● プリエンプションが可能であることをプリエン プティブと言い(先取り可能とも言う)、スレッ ドが突然中断するようなことが無いのであれば ノンプリエンプティブと呼ぶ ● KOZOSはプリエンプティブなOSとして開発して いく
  • 11. アイドル・スレッド ● スレッドに優先度がつくと、やることがないと きにCPUを省電力モードにするアイドル・ス レッドが簡単に実装できる ● 今のプログラムだとレディー・キューが空にな るとシステムダウンしてしまうため、空になら ないよう一番低い優先度で「ムダななんらかの 処理」をするスレッドを常に動かしておく必要 がある while(1) { // なにもしない状態 }
  • 12. 省電力モード ● 一般的なCPUには省電力モードという状態があ る – x86でいうところのHLT命令かな ● CPUを省電力モードにすると命令の実行を停止 し、割込みが入るまで待つ状態になる – クロックが止まるので省電になるようだ ● 他に動作する処理がないなら、アイドル・ス レッドを実行して待機状態にすれば良い while(1) { // ビジーループよりこうした命令を使うべきだね (CPUを省電力モードに遷移する命令); }
  • 14. プログラムの修正と追加 ● 追加ファイル – test09_1.c,test09_2,test09_3...スレッドとなる サンプルプログラム ● 修正ファイル – kozos.h,kozos.c...優先度を実装 – syscall.h,syscall.c...スレッド制御のシステム コール追加 – main.c...アイドル・スレッド追加 – Makefile
  • 15. プログラムの修正内容 ● スレッドの状態を制御するシステム・コールの 追加 – kz_wait(),kz_sleep(),kz_wakeup(),kz_getid(),kz _chpri() ● 優先度の追加 – 構造体に値を持たせて ● readayqueを配列化 – 優先度のスレッド別にまとめる形 – ここのらへんのスケジューリングのアルゴリズムが 少し複雑かなってぐらいで、あとは8thステップの 延長
  • 17. ビルドの失敗(kozos.c) ● パディングのサイズを変更 typedef struct _kz_thread { . . kz_context context; char dummy[8]; ←dummy[16]からdummy[8]にした } kz_thread;
  • 18. プログラムの実行 /Users/sandai/12step/src/09/os% sudo cu -l /dev/tty.usbserial-FTG6PQ4H kzload> run . . test09_3 started. test09_3 wakeup in (test09_1). test09_1 sleep out. test09_1 chpri in. test09_3 wakeup out. test09_3 wakeup in (test09_2). test09_2 sleep out. test09_2 chpri in. test09_1 chpri out. test09_1 wait in. test09_3 wakeup out. test09_3 wait in. test09_2 chpri out. test09_2 wait in. test09_1 wait out. test09_1 trap in. test09_1 DOWN. test09_1 EXIT. test09_3 wait out. test09_3 exit in. test09_3 EXIT. test09_2 wait out. test09_2 exit. test09_2 EXIT.
  • 20. まとめ1 ● 8thステップを理解していないと9thステップは 何をやっているのかわからないはず ● プログラムの修正部分に難しいコードはない ● システム・コールとスケジューリング部分のア ルゴリズムの処理の流れが難しいので、そこを まとめておこう
  • 21. まとめ2 ● 下記のkz_run()のうち、test09_1_id = ...の 処理の流れを記述しておく ● kz_start()でstart_threads()が起動した後の ことなので注意 static int start_threads(int argc, char *argv[]) { test09_1_id = kz_run(test09_1_main, "test09_1", 1, 0x100, 0, . .
  • 22. まとめ3 ● kz_run() – kz_syscall()に渡すデータを構造体に保存 – kz_syscall()呼び出し ● kz_syscall() – current->syscall.xxxにシステムコールのタイプと kz_run()で受け取った構造体を設定 – asm volatile(“trapa #0”)で割込みが発生して thread_intr()呼び出し
  • 23. まとめ4 ● thread_intr() – handlers[type]()によりsyscall_intr()呼び出し ● 最終的にthread_run()が呼び出されてp- >un.run.ret = にcurrentが代入される – schedule()呼び出し ● この部分でスケジューリングされるため、優先 順位の高い初期スレッドのidleスレッドが動作 対象。test09_1_mainには映らないので注意 – dispatch()呼び出し ● currentにあるidleスレッドのstart_threadsが 実行を再開
  • 24. まとめ5 ● dispatch()が呼ばれると、割込みが発生した kz_syscall()にあるasm volatile(“trapa #0”)から続く ● 特に処理がないので、kz_run()に戻り、return param.un.run.retでtest09_1_idにその値が代 入され、test09_2_id = ...と処理が同じよう に続く
  • 25. まとめまとめ ● kz_run()の流れは以上のような形 ● 優先順位によってschedlue()で動作するスレッ ドが決まるので、ここを気をつけてみる必要が ある ● あとはkz_sleep()が難しいかも。レディー・ キューから外した場合、test09_1_idにスレッ ドIDが保存されていて、kz_sleep()ではそれを 使ってレディー・キューに再度入れていること になっている – スリープさせたスレッドの管理が微妙な気がするけ れど、こういうものなんだろうか