狠狠撸

狠狠撸Share a Scribd company logo
12ステップで作る组込み翱厂自作入门
      11thステップ




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

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

【税込価格】
4,410円

【サポートページ】
http://kozos.jp/books/makeos/
もくじ
1.タスク间通信
2.関数の再入と排他
3.碍翱窜翱厂でのタスク间通信
4.メッセージ通信の実装
5.プログラムの実行
6.まとめ
1.タスク间通信
タスク間通信
●   組込みOSのカーネルはできるだけコンパクトに
    しておきたい
    –   高機能やリアルタイム性を求められるため
●   だから、デバイス?ドライバや、ファイル?シ
    ステムなどといったリアルタイム性を保証でき
    ないサービスは、カーネルの外でスレッドとし
    て実装する
●   とはいえ、そういったアプリは一般に単体で動
    作できるものは少ない
    –   機能別にスレッドに分けることが多い
    –   そこでスレッド同士でデータのやり取りができるタ
        スク間通信をできるようにする
システム?タスク
●   基本サービスを行うスレッドのことを一般にシ
    ステム?タスクと呼ぶ
    –   任意サイズのメモリ管理を実装するとして、OSの機
        能として実装すると空きメモリの検索時間が保証で
        きない
    –   そこでメモリ管理を行うようなスレッドを作成し、
        任意サイズ必要な場合はそのスレッドにタスク間通
        信で依頼して領域を割り当ててもらう、などといっ
        た実装ができる
●   こういったOSのカーネルとセットで利用するス
    レッドがシステム?タスク
ユーザ?タスク
●   OSのユーザ側で作成するアプリケーション?プ
    ログラムは、ユーザ?タスクと呼ぶ
    –   ユーザが使う目的のスレッドと考えれば良いかな
●   OSからみればシステム?タスクもユーザ?タス
    クもOSで動作しているスレッドにすぎない
    –   両者の違いは使われ方の違いなだけ
2.関数の再入と排他
関数の再入
●   タスク間通信が必要な理由はもうひとつ関数の
    再入を避けるというものがある
●   関数の再入とは、あるスレッドが特定の関数を
    実行している最中に割込みによって別スレッド
    が動作し、その別スレッドがその関数を実行し
    てしまうこと
    –   別々のスレッドで同じタイミングで同じ関数を実行
        してしまうようなことかな
●   関数内でstaticなデータをやり取りしている場
    合、内容を上書きし合うといった問題が起きる
再入問題の回避
●   回避する手段はいくつかの方法がある
    –   仮想メモリを実装し、タスクをスレッドでなくプロ
        セス化する
    –   サービスをOS内部に実装し、システム?コールを利
        用して呼び出すようにする
    –   関数をリエントラントな構造にする
    –   関数内の排他が必要な部分に履いた処理を入れる
        (割込み禁止など)
    –   再入が発生しない設計にする
    –   サービスをスレッド化する
仮想メモリを実装
●   関数の再入はメモリを共通資源として複数のス
    レッドが扱っていることに問題がある
●   そこでタスクごとに独立した仮想的なメモリ空
    間を割り当てれば良い
●   この仮想的なメモリを仮想メモリ、そのメモリ
    のアドレスを仮想メモリと呼ぶ
●   仮想メモリにより動作するアドレス空間が独立
    しているタスクをプロセスと呼ぶ
    –   スレッドはアドレス空間は共通なので、他のスレッ
        ドの変数などにアクセスできるが、プロセスではそ
        ういったことはできない
●   スレッド?モデル、プロセス?モデルなどとし
    て区別される
MMU
●   仮想メモリではMMUと呼ばれる専用ハードウェ
    アが仮想アドレスから実際のメモリアドレスに
    アドレス変換をした上で行われる
    – 実際のメモリを物理アドレスと呼ぶ
●   タスクごとにメモリ空間は独立するので、結果
    的にメモリ保護を行うこともできる
●   メリットはいろいろあるが組込みOSには向かな
    い
    –   H8にはMMUが無い
    –   リアルタイム性や高速性に向いていない
    –   そもそも組込みOSではメモリ保護は必要ない
サービスをOS内部に実装
●   OSの機能としてカーネル内部に実装する方法が
    ある
●   システム?コールによってOSに依頼する形
●   とはいえ、OSの肥大化に繋がるし、再入を防止
    したいサービスを全てカーネルに含ませるとい
    うポリシーの無い設計になってしまうので、あ
    まり良い手段とはいえない
関数をリエントラントな構造にする
●   関数が再入されても問題が発生しない構造に
    なっていることをリエントラント(再入可能)と
    言う
    –   リエントラントにするには、たとえば静的変数では
        なく自動変数を利用するなどするといった手段があ
        る
●   ただし、関数内部でさらに別の関数を呼び出し
    ている場合は、その関数もリエントラントにし
    なきゃいけない
●   つまりライブラリ関数全体をリエントラントに
    する必要がある
排他処理を入れる
●   静的変数を操作している部分で割込み禁止にす
    ることで、スレッドのディスパッチを防止する
    ことで再入されなくしてしまう方法もある
    –   INTR_DISABLEやINTR_ENABLEとか使う
void log_output(char *message)
{
    static char buf[256];
    time_t t;

    time(&t)

    INTR_DISABLE;
    strcpy(buf, ctime(&t));
    strcpy(buf + strlen(buf), message);
    puts(buf);
    INTR_ENABLE;
}
排他
●   ある資源にアクセスしている最中に他の処理が
    その資源にアクセスしないようほ保証すること
    を排他と言う
●   排他には割込み禁止/許可の他に、ロック、セ
    マフォ、ミューテックスと呼ばれる機能を利用
    する方法がある
●   ロックをアプリケーション?レベルで実現しよ
    うとすると様々な問題があるので、一般にセマ
    フォという排他の仕組みをOS側で提供する
セマフォ
●   セマフォとはロックをOS側で行うような仕組み
    獲得?解放をカウンタで管理することで、複数
    のスレッドが再入する場合のスレッド数の上限
    を管理することができる
●   上限が1のセマフォはバイナリ?セマフォと呼
    ばれ、常にひとつのスレッドしか実行できない
●   ミューテックスはバイナリ?セマフォに近い
void log_output(char *message)
{
    .
    .
    kz_getsem(ID); ←セマフォ獲得
    strcpy(buf, ctime(&t));
    strcpy(buf + strlen(buf), message);
    puts(buf);
    kz_relsem(ID); ←セマフォ解放
}
割込み禁止でする排他の話
●   割込み禁止から有効に戻すまでの間を割り込み
    禁止区画と呼ぶ
    –   INTR_DISABLEからINTR_ENABLEの間
●   この方法での排他は割込みの遅延(遅延割込み)
    が発生する問題がある
    –   割込み禁止中に割込みが発生した場合、現在行なっ
        ている割込み処理を終えてから発生するので、割込
        みが遅延する形になる
    –   割込み禁止区画が長いとキーボードを叩いても反応
        が鈍いとか、マウスの動きが鈍くなったりする
●   一般に「割込み処理は短く」「割込み禁止は最
    小に」が鉄則
再入が発生しない設計にする
●   スレッドの優先度を工夫して優先度の大小の関
    係で動作が奪われないようにしたりできるが
●   優先度が動作に依存するため慎重に設計する必
    要がある
●   現実的には割込み禁止にするなど確実で小回り
    の効く対策が人気
●   排他が不要な構成にするというのは理想だけ
    ど、難しいな
サービスをスレッド化する
●   再入の根本的な原因はひとつの資源を複数のス
    レッドから操作してしまっていること
●   簡単な解決策は資源を管理するスレッドを実装
    して、このスレッドを通して資源を操作する
●   これができるようにするには、スレッド同士の
    通信ができるようにならなきゃいけない
    –   つまりタスク間通信が必要
●   組込みOSはカーネルをコンパクトにしたいので
    基本的にサービスはスレッドとして実装する
    –   サービスを利用する場合はタスク通信でスレッドに
        依頼する
3.碍翱窜翱厂でのタスク间通信
メッセージ
●   KOZOSのタスク間通信はOS内部からシステム?
    コールを発行することで、送信と受信の間に構
    造体をかませてやりとりするになっている
    –   この構造体をメッセージ?ボックスと本書では呼ん
        でいる
    –   また、KOZOSのタスク間通信をメッセージと呼ぶ
メッセージの仕組み
●   メッセージのやり取りは送信用のシステム?
    コールを呼び出して、受信側でメッセージ受信
    用のシステム?コールを呼び出して受け取る
●   受信用のシステム?コールを呼び出してもメッ
    セージが送信側で送信されていない場合は、ス
    リープして待ち合わせる
    – 待ち合わせによりスリープすることを一般に
      ブロックと言う
●   受信用のシステム?コールを読んでいないのに
    送信側が複数送信を行ったときは、メッセージ
    はキューに蓄えられる
メッセージのシステム?コール
●   kz_send()とkz_recv()
     – どちらも第1引数にメッセージID、第2と第3
       で整数値とchar型のポインタを持つ
●   第2と第3でint型のデータ(2バイト)とchar型の
    ポインタ(4バイト)を渡せるようにしている
     – バッファのサイズとアドレスを渡すと
       か、argc、argv[]形式で任意のデータを渡
       す、といった融通が効くから
メッセージで同期的処理もできる
●   スレッド同士で情報のやりとりだけではなく、
    動作タイミングを取り合うこともできる
    – あるスレッドの処理が完了してからもう一方
      のスレッドで処理を開始するといったことが
      可能
●   スレッドの動作状態と関係無く別の動作が行わ
    れることを非同期処理と言う
4.メッセージ通信の実装
プログラムの修正と追加
●   修正ファイル
    –   defines.h...メッセージIDの定義
    –   syscall.h,syscall.c...システム?コール追加
    –   kozos.h,kozos.c...システム?コール追加
    –   main.c...起動するスレッドの修正
    –   Makefile
●   追加ファイル
●   test11_1.c,test11_2.c
メッセージ送受信
●   メッセージのやり取りはシステム?コールに
    よって行い、メッセージボックスの構造体を間
    に挟んで行う
●   特に難しい処理はないが、メッセージボックス
    はキューになっている
    –   リンクリスト構造で、headとtailのポインタを持つ
    –   tailポインタを持つのはリンクリストの最後尾を毎
        回検索するのが無駄であるため
メッセージ送受信の流れ
●   送信側は基本的にメッセージボックスにメッ
    セージ(構造体)を保存するだけのことをする
    –   受信待ちスレッドがある場合は受信処理を行い、カ
        レントスレッドをレディ?キューに繋ぎ直す
●   受信側は受信するメッセージがない場合はス
    リープ状態に入る
    –   スリープ状態で送信処理が行われたときに、そちら
        で受信処理が行われるわけ
●   スリープする必要がなければメッセージを取得
    する
    –   メッセージボックスは複数のメッセージを持つ場合
        にキューとなり、メッセージ取得は順番に取得が為
        される
5.プログラムの実行
プログラムの実行
/Users/sandai/12step/src/11/os% sudo cu -l /dev/tty.usbserial-FTG6PQ4H
.
.
kzload> run
starting from entry point: ffc020
kozos boot succeed!
test11_1 started.
test11_1 recv in.
test11_2 started.
test11_2 send in.
test11_1 recv out.
static memory
.
.
.
test11_2 recv out.
allocated memory
test11_2 exit.
test11_2 EXIT.
6.まとめ
まとめ
●   タスク間通信を実装したことでOSの重い処理を
    システム?タスクとしてスレッド化できるよう
    になった
●   OSの機能をコンパクトにする設計をマイクロ?
    カーネル、様々な機能を全て詰め込んだものを
    モノリシック?カーネルと呼ぶ

More Related Content

What's hot (20)

ROSチュートリアル ROBOMECH2018
ROSチュートリアル ROBOMECH2018ROSチュートリアル ROBOMECH2018
ROSチュートリアル ROBOMECH2018
Ryuichi Ueda
?
笔贬笔+惭测厂蚕尝を使ったスケーラブルなソーシャルゲーム开発
笔贬笔+惭测厂蚕尝を使ったスケーラブルなソーシャルゲーム开発笔贬笔+惭测厂蚕尝を使ったスケーラブルなソーシャルゲーム开発
笔贬笔+惭测厂蚕尝を使ったスケーラブルなソーシャルゲーム开発
infinite_loop
?
蝉测蝉濒辞补诲や监视などの话(仮)
蝉测蝉濒辞补诲や监视などの话(仮)蝉测蝉濒辞补诲や监视などの话(仮)
蝉测蝉濒辞补诲や监视などの话(仮)
Takanori Sejima
?
NAND Flash から InnoDB にかけての話(仮)
NAND Flash から InnoDB にかけての話(仮)NAND Flash から InnoDB にかけての話(仮)
NAND Flash から InnoDB にかけての話(仮)
Takanori Sejima
?
トランザクションを厂别谤颈补濒颈锄补产濒别にする4つの方法
トランザクションを厂别谤颈补濒颈锄补产濒别にする4つの方法トランザクションを厂别谤颈补濒颈锄补产濒别にする4つの方法
トランザクションを厂别谤颈补濒颈锄补产濒别にする4つの方法
Kumazaki Hiroki
?
Embedded Virtualization applied in Mobile Devices
Embedded Virtualization applied in Mobile DevicesEmbedded Virtualization applied in Mobile Devices
Embedded Virtualization applied in Mobile Devices
National Cheng Kung University
?
笔辞蝉迟驳谤别厂蚕尝の関数属性を知ろう
笔辞蝉迟驳谤别厂蚕尝の関数属性を知ろう笔辞蝉迟驳谤别厂蚕尝の関数属性を知ろう
笔辞蝉迟驳谤别厂蚕尝の関数属性を知ろう
kasaharatt
?
[Okta x Jamf合同新年会] Okta Workflowsによるノーコート?業務改善 ?Jamf APIを使ってMac端末情報を自動収集してみよう?
[Okta x Jamf合同新年会] Okta Workflowsによるノーコート?業務改善 ?Jamf APIを使ってMac端末情報を自動収集してみよう?[Okta x Jamf合同新年会] Okta Workflowsによるノーコート?業務改善 ?Jamf APIを使ってMac端末情報を自動収集してみよう?
[Okta x Jamf合同新年会] Okta Workflowsによるノーコート?業務改善 ?Jamf APIを使ってMac端末情報を自動収集してみよう?
Ryo Sasaki
?
ScyllaDBユーザー勉強会 #1
ScyllaDBユーザー勉強会 #1ScyllaDBユーザー勉強会 #1
ScyllaDBユーザー勉強会 #1
Changhwan Lee
?
押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)
押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)
押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)
NTT DATA Technology & Innovation
?
あなたの知らない笔辞蝉迟驳谤别厂蚕尝监视の世界
あなたの知らない笔辞蝉迟驳谤别厂蚕尝监视の世界あなたの知らない笔辞蝉迟驳谤别厂蚕尝监视の世界
あなたの知らない笔辞蝉迟驳谤别厂蚕尝监视の世界
Yoshinori Nakanishi
?
颁驳谤辞耻辫あれこれ-第4回コンテナ型仮想化の情报交换会资料
颁驳谤辞耻辫あれこれ-第4回コンテナ型仮想化の情报交换会资料颁驳谤辞耻辫あれこれ-第4回コンテナ型仮想化の情报交换会资料
颁驳谤辞耻辫あれこれ-第4回コンテナ型仮想化の情报交换会资料
KamezawaHiroyuki
?
笔补测笔补测での办8蝉活用事例
笔补测笔补测での办8蝉活用事例笔补测笔补测での办8蝉活用事例
笔补测笔补测での办8蝉活用事例
PayPay Corporation
?
大规模ソーシャルゲーム开発から学んだ笔贬笔&惭测厂蚕尝実践テクニック
大规模ソーシャルゲーム开発から学んだ笔贬笔&惭测厂蚕尝実践テクニック大规模ソーシャルゲーム开発から学んだ笔贬笔&惭测厂蚕尝実践テクニック
大规模ソーシャルゲーム开発から学んだ笔贬笔&惭测厂蚕尝実践テクニック
infinite_loop
?
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門
Fixstars Corporation
?
Kubernetes 基盤における非機能試験の deepdive(Kubernetes Novice Tokyo #17 発表資料)
Kubernetes 基盤における非機能試験の deepdive(Kubernetes Novice Tokyo #17 発表資料)Kubernetes 基盤における非機能試験の deepdive(Kubernetes Novice Tokyo #17 発表資料)
Kubernetes 基盤における非機能試験の deepdive(Kubernetes Novice Tokyo #17 発表資料)
NTT DATA Technology & Innovation
?
Linux の hugepage の開発動向
Linux の hugepage の開発動向Linux の hugepage の開発動向
Linux の hugepage の開発動向
Naoya Horiguchi
?
イミュータブルデータモデル(入门编)
イミュータブルデータモデル(入门编)イミュータブルデータモデル(入门编)
イミュータブルデータモデル(入门编)
Yoshitaka Kawashima
?
Linux/DB Tuning (DevSumi2010, Japanese)
Linux/DB Tuning (DevSumi2010, Japanese)Linux/DB Tuning (DevSumi2010, Japanese)
Linux/DB Tuning (DevSumi2010, Japanese)
Yoshinori Matsunobu
?
ROSチュートリアル ROBOMECH2018
ROSチュートリアル ROBOMECH2018ROSチュートリアル ROBOMECH2018
ROSチュートリアル ROBOMECH2018
Ryuichi Ueda
?
笔贬笔+惭测厂蚕尝を使ったスケーラブルなソーシャルゲーム开発
笔贬笔+惭测厂蚕尝を使ったスケーラブルなソーシャルゲーム开発笔贬笔+惭测厂蚕尝を使ったスケーラブルなソーシャルゲーム开発
笔贬笔+惭测厂蚕尝を使ったスケーラブルなソーシャルゲーム开発
infinite_loop
?
蝉测蝉濒辞补诲や监视などの话(仮)
蝉测蝉濒辞补诲や监视などの话(仮)蝉测蝉濒辞补诲や监视などの话(仮)
蝉测蝉濒辞补诲や监视などの话(仮)
Takanori Sejima
?
NAND Flash から InnoDB にかけての話(仮)
NAND Flash から InnoDB にかけての話(仮)NAND Flash から InnoDB にかけての話(仮)
NAND Flash から InnoDB にかけての話(仮)
Takanori Sejima
?
トランザクションを厂别谤颈补濒颈锄补产濒别にする4つの方法
トランザクションを厂别谤颈补濒颈锄补产濒别にする4つの方法トランザクションを厂别谤颈补濒颈锄补产濒别にする4つの方法
トランザクションを厂别谤颈补濒颈锄补产濒别にする4つの方法
Kumazaki Hiroki
?
笔辞蝉迟驳谤别厂蚕尝の関数属性を知ろう
笔辞蝉迟驳谤别厂蚕尝の関数属性を知ろう笔辞蝉迟驳谤别厂蚕尝の関数属性を知ろう
笔辞蝉迟驳谤别厂蚕尝の関数属性を知ろう
kasaharatt
?
[Okta x Jamf合同新年会] Okta Workflowsによるノーコート?業務改善 ?Jamf APIを使ってMac端末情報を自動収集してみよう?
[Okta x Jamf合同新年会] Okta Workflowsによるノーコート?業務改善 ?Jamf APIを使ってMac端末情報を自動収集してみよう?[Okta x Jamf合同新年会] Okta Workflowsによるノーコート?業務改善 ?Jamf APIを使ってMac端末情報を自動収集してみよう?
[Okta x Jamf合同新年会] Okta Workflowsによるノーコート?業務改善 ?Jamf APIを使ってMac端末情報を自動収集してみよう?
Ryo Sasaki
?
ScyllaDBユーザー勉強会 #1
ScyllaDBユーザー勉強会 #1ScyllaDBユーザー勉強会 #1
ScyllaDBユーザー勉強会 #1
Changhwan Lee
?
押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)
押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)
押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)
NTT DATA Technology & Innovation
?
あなたの知らない笔辞蝉迟驳谤别厂蚕尝监视の世界
あなたの知らない笔辞蝉迟驳谤别厂蚕尝监视の世界あなたの知らない笔辞蝉迟驳谤别厂蚕尝监视の世界
あなたの知らない笔辞蝉迟驳谤别厂蚕尝监视の世界
Yoshinori Nakanishi
?
颁驳谤辞耻辫あれこれ-第4回コンテナ型仮想化の情报交换会资料
颁驳谤辞耻辫あれこれ-第4回コンテナ型仮想化の情报交换会资料颁驳谤辞耻辫あれこれ-第4回コンテナ型仮想化の情报交换会资料
颁驳谤辞耻辫あれこれ-第4回コンテナ型仮想化の情报交换会资料
KamezawaHiroyuki
?
笔补测笔补测での办8蝉活用事例
笔补测笔补测での办8蝉活用事例笔补测笔补测での办8蝉活用事例
笔补测笔补测での办8蝉活用事例
PayPay Corporation
?
大规模ソーシャルゲーム开発から学んだ笔贬笔&惭测厂蚕尝実践テクニック
大规模ソーシャルゲーム开発から学んだ笔贬笔&惭测厂蚕尝実践テクニック大规模ソーシャルゲーム开発から学んだ笔贬笔&惭测厂蚕尝実践テクニック
大规模ソーシャルゲーム开発から学んだ笔贬笔&惭测厂蚕尝実践テクニック
infinite_loop
?
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門
Fixstars Corporation
?
Kubernetes 基盤における非機能試験の deepdive(Kubernetes Novice Tokyo #17 発表資料)
Kubernetes 基盤における非機能試験の deepdive(Kubernetes Novice Tokyo #17 発表資料)Kubernetes 基盤における非機能試験の deepdive(Kubernetes Novice Tokyo #17 発表資料)
Kubernetes 基盤における非機能試験の deepdive(Kubernetes Novice Tokyo #17 発表資料)
NTT DATA Technology & Innovation
?
Linux の hugepage の開発動向
Linux の hugepage の開発動向Linux の hugepage の開発動向
Linux の hugepage の開発動向
Naoya Horiguchi
?
イミュータブルデータモデル(入门编)
イミュータブルデータモデル(入门编)イミュータブルデータモデル(入门编)
イミュータブルデータモデル(入门编)
Yoshitaka Kawashima
?
Linux/DB Tuning (DevSumi2010, Japanese)
Linux/DB Tuning (DevSumi2010, Japanese)Linux/DB Tuning (DevSumi2010, Japanese)
Linux/DB Tuning (DevSumi2010, Japanese)
Yoshinori Matsunobu
?

Viewers also liked (19)

【学习メモ#6迟丑】12ステップで作る组込み翱厂自作入门
【学习メモ#6迟丑】12ステップで作る组込み翱厂自作入门 【学习メモ#6迟丑】12ステップで作る组込み翱厂自作入门
【学习メモ#6迟丑】12ステップで作る组込み翱厂自作入门
sandai
?
【学习メモ#4迟丑】12ステップで作る组込み翱厂自作入门
【学习メモ#4迟丑】12ステップで作る组込み翱厂自作入门【学习メモ#4迟丑】12ステップで作る组込み翱厂自作入门
【学习メモ#4迟丑】12ステップで作る组込み翱厂自作入门
sandai
?
【学习メモ#5迟丑】12ステップで作る组込み翱厂自作入门
【学习メモ#5迟丑】12ステップで作る组込み翱厂自作入门【学习メモ#5迟丑】12ステップで作る组込み翱厂自作入门
【学习メモ#5迟丑】12ステップで作る组込み翱厂自作入门
sandai
?
【学习メモ#3谤诲】12ステップで作る组込み翱厂自作入门
【学习メモ#3谤诲】12ステップで作る组込み翱厂自作入门【学习メモ#3谤诲】12ステップで作る组込み翱厂自作入门
【学习メモ#3谤诲】12ステップで作る组込み翱厂自作入门
sandai
?
組み込み向けC++のやり方を探る - mbedで楽しい組み込みプログラミング -
組み込み向けC++のやり方を探る - mbedで楽しい組み込みプログラミング -組み込み向けC++のやり方を探る - mbedで楽しい組み込みプログラミング -
組み込み向けC++のやり方を探る - mbedで楽しい組み込みプログラミング -
Kishi Shundo
?
蚕贰惭鲍で础搁惭64产颈迟ベアメタルプログラミング
蚕贰惭鲍で础搁惭64产颈迟ベアメタルプログラミング蚕贰惭鲍で础搁惭64产颈迟ベアメタルプログラミング
蚕贰惭鲍で础搁惭64产颈迟ベアメタルプログラミング
Yuma Ohgami
?
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
Hirotaka Kawata
?
组込み翱厂を作ってみよう!(オープンソースカンファレンス内セミナー资料)
组込み翱厂を作ってみよう!(オープンソースカンファレンス内セミナー资料)组込み翱厂を作ってみよう!(オープンソースカンファレンス内セミナー资料)
组込み翱厂を作ってみよう!(オープンソースカンファレンス内セミナー资料)
kozossakai
?
【学习メモ#1蝉迟】12ステップで作る组込み翱厂自作入门
【学习メモ#1蝉迟】12ステップで作る组込み翱厂自作入门【学习メモ#1蝉迟】12ステップで作る组込み翱厂自作入门
【学习メモ#1蝉迟】12ステップで作る组込み翱厂自作入门
sandai
?
やってよかった翱厂作り
やってよかった翱厂作りやってよかった翱厂作り
やってよかった翱厂作り
Hidemi Kawai
?
低レイヤー入门
低レイヤー入门低レイヤー入门
低レイヤー入门
demuyan
?
人工知能概論 1
人工知能概論 1人工知能概論 1
人工知能概論 1
Tadahiro Taniguchi
?
ゼロから始める自作 CPU 入門
ゼロから始める自作 CPU 入門ゼロから始める自作 CPU 入門
ゼロから始める自作 CPU 入門
Hirotaka Kawata
?
【2000行弱!】虫86用自作カーネルの绍介
【2000行弱!】虫86用自作カーネルの绍介【2000行弱!】虫86用自作カーネルの绍介
【2000行弱!】虫86用自作カーネルの绍介
Yuma Ohgami
?
Web系だって低レイヤーがやりたいんだよ! コンパイラことはじめ
Web系だって低レイヤーがやりたいんだよ! コンパイラことはじめWeb系だって低レイヤーがやりたいんだよ! コンパイラことはじめ
Web系だって低レイヤーがやりたいんだよ! コンパイラことはじめ
Nisei Kimura
?
颁++でできる!翱厂自作入门
颁++でできる!翱厂自作入门颁++でできる!翱厂自作入门
颁++でできる!翱厂自作入门
uchan_nos
?
颁迟蹿のための辫测迟丑辞苍入门
颁迟蹿のための辫测迟丑辞苍入门颁迟蹿のための辫测迟丑辞苍入门
颁迟蹿のための辫测迟丑辞苍入门
shiracamus
?
ハッキング実演
ハッキング実演ハッキング実演
ハッキング実演
Ken Ogura
?
CTF超入門 (for 第12回セキュリティさくら)
CTF超入門 (for 第12回セキュリティさくら)CTF超入門 (for 第12回セキュリティさくら)
CTF超入門 (for 第12回セキュリティさくら)
kikuchan98
?
【学习メモ#6迟丑】12ステップで作る组込み翱厂自作入门
【学习メモ#6迟丑】12ステップで作る组込み翱厂自作入门 【学习メモ#6迟丑】12ステップで作る组込み翱厂自作入门
【学习メモ#6迟丑】12ステップで作る组込み翱厂自作入门
sandai
?
【学习メモ#4迟丑】12ステップで作る组込み翱厂自作入门
【学习メモ#4迟丑】12ステップで作る组込み翱厂自作入门【学习メモ#4迟丑】12ステップで作る组込み翱厂自作入门
【学习メモ#4迟丑】12ステップで作る组込み翱厂自作入门
sandai
?
【学习メモ#5迟丑】12ステップで作る组込み翱厂自作入门
【学习メモ#5迟丑】12ステップで作る组込み翱厂自作入门【学习メモ#5迟丑】12ステップで作る组込み翱厂自作入门
【学习メモ#5迟丑】12ステップで作る组込み翱厂自作入门
sandai
?
【学习メモ#3谤诲】12ステップで作る组込み翱厂自作入门
【学习メモ#3谤诲】12ステップで作る组込み翱厂自作入门【学习メモ#3谤诲】12ステップで作る组込み翱厂自作入门
【学习メモ#3谤诲】12ステップで作る组込み翱厂自作入门
sandai
?
組み込み向けC++のやり方を探る - mbedで楽しい組み込みプログラミング -
組み込み向けC++のやり方を探る - mbedで楽しい組み込みプログラミング -組み込み向けC++のやり方を探る - mbedで楽しい組み込みプログラミング -
組み込み向けC++のやり方を探る - mbedで楽しい組み込みプログラミング -
Kishi Shundo
?
蚕贰惭鲍で础搁惭64产颈迟ベアメタルプログラミング
蚕贰惭鲍で础搁惭64产颈迟ベアメタルプログラミング蚕贰惭鲍で础搁惭64产颈迟ベアメタルプログラミング
蚕贰惭鲍で础搁惭64产颈迟ベアメタルプログラミング
Yuma Ohgami
?
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
Hirotaka Kawata
?
组込み翱厂を作ってみよう!(オープンソースカンファレンス内セミナー资料)
组込み翱厂を作ってみよう!(オープンソースカンファレンス内セミナー资料)组込み翱厂を作ってみよう!(オープンソースカンファレンス内セミナー资料)
组込み翱厂を作ってみよう!(オープンソースカンファレンス内セミナー资料)
kozossakai
?
【学习メモ#1蝉迟】12ステップで作る组込み翱厂自作入门
【学习メモ#1蝉迟】12ステップで作る组込み翱厂自作入门【学习メモ#1蝉迟】12ステップで作る组込み翱厂自作入门
【学习メモ#1蝉迟】12ステップで作る组込み翱厂自作入门
sandai
?
やってよかった翱厂作り
やってよかった翱厂作りやってよかった翱厂作り
やってよかった翱厂作り
Hidemi Kawai
?
低レイヤー入门
低レイヤー入门低レイヤー入门
低レイヤー入门
demuyan
?
ゼロから始める自作 CPU 入門
ゼロから始める自作 CPU 入門ゼロから始める自作 CPU 入門
ゼロから始める自作 CPU 入門
Hirotaka Kawata
?
【2000行弱!】虫86用自作カーネルの绍介
【2000行弱!】虫86用自作カーネルの绍介【2000行弱!】虫86用自作カーネルの绍介
【2000行弱!】虫86用自作カーネルの绍介
Yuma Ohgami
?
Web系だって低レイヤーがやりたいんだよ! コンパイラことはじめ
Web系だって低レイヤーがやりたいんだよ! コンパイラことはじめWeb系だって低レイヤーがやりたいんだよ! コンパイラことはじめ
Web系だって低レイヤーがやりたいんだよ! コンパイラことはじめ
Nisei Kimura
?
颁++でできる!翱厂自作入门
颁++でできる!翱厂自作入门颁++でできる!翱厂自作入门
颁++でできる!翱厂自作入门
uchan_nos
?
颁迟蹿のための辫测迟丑辞苍入门
颁迟蹿のための辫测迟丑辞苍入门颁迟蹿のための辫测迟丑辞苍入门
颁迟蹿のための辫测迟丑辞苍入门
shiracamus
?
ハッキング実演
ハッキング実演ハッキング実演
ハッキング実演
Ken Ogura
?
CTF超入門 (for 第12回セキュリティさくら)
CTF超入門 (for 第12回セキュリティさくら)CTF超入門 (for 第12回セキュリティさくら)
CTF超入門 (for 第12回セキュリティさくら)
kikuchan98
?

Similar to 【学习メモ#11迟丑】12ステップで作る组込み翱厂自作入门 (20)

小二病でも骋颁やりたい
小二病でも骋颁やりたい小二病でも骋颁やりたい
小二病でも骋颁やりたい
dec9ue
?
[Basic 7] OS の基本 / 割り込み / システム コール / メモリ管理
[Basic 7] OS の基本 / 割り込み / システム コール / メモリ管理[Basic 7] OS の基本 / 割り込み / システム コール / メモリ管理
[Basic 7] OS の基本 / 割り込み / システム コール / メモリ管理
Yuto Takei
?
2011.09.18 v7から始めるunix まとめ
2011.09.18 v7から始めるunix まとめ2011.09.18 v7から始めるunix まとめ
2011.09.18 v7から始めるunix まとめ
Makiko Konoshima
?
Step-Oriented Programming による任意コード実行の可能性
Step-Oriented Programming による任意コード実行の可能性Step-Oriented Programming による任意コード実行の可能性
Step-Oriented Programming による任意コード実行の可能性
kozossakai
?
Step-Oriented Programming による任意コード実行の可能性 by 坂井 弘亮
Step-Oriented Programming による任意コード実行の可能性 by 坂井 弘亮Step-Oriented Programming による任意コード実行の可能性 by 坂井 弘亮
Step-Oriented Programming による任意コード実行の可能性 by 坂井 弘亮
CODE BLUE
?
虫86とコンテキストスイッチ
虫86とコンテキストスイッチ虫86とコンテキストスイッチ
虫86とコンテキストスイッチ
Masami Ichikawa
?
C++ マルチスレット?フ?ロク?ラミンク?
C++ マルチスレット?フ?ロク?ラミンク?C++ マルチスレット?フ?ロク?ラミンク?
C++ マルチスレット?フ?ロク?ラミンク?
Kohsuke Yuasa
?
[Basic 8] フ?ロセスとスレット? / 入出力 / シェル
[Basic 8] フ?ロセスとスレット? / 入出力 / シェル[Basic 8] フ?ロセスとスレット? / 入出力 / シェル
[Basic 8] フ?ロセスとスレット? / 入出力 / シェル
Yuto Takei
?
C21 SQL Server のスレッド管理 by 古賀啓一郎
C21 SQL Server のスレッド管理 by 古賀啓一郎C21 SQL Server のスレッド管理 by 古賀啓一郎
C21 SQL Server のスレッド管理 by 古賀啓一郎
Insight Technology, Inc.
?
Unix architecture
Unix architectureUnix architecture
Unix architecture
raw-hide
?
Code jp2015 cpuの話
Code jp2015 cpuの話Code jp2015 cpuの話
Code jp2015 cpuの話
Shinichiro Niiyama
?
PEZY-SC programming overview
PEZY-SC programming overviewPEZY-SC programming overview
PEZY-SC programming overview
Ryo Sakamoto
?
Dive into RTS - another side
Dive into RTS - another sideDive into RTS - another side
Dive into RTS - another side
Kiwamu Okabe
?
V6 Interpreter (Nagoya Geek Bar 2011-05-02)
V6 Interpreter (Nagoya Geek Bar 2011-05-02)V6 Interpreter (Nagoya Geek Bar 2011-05-02)
V6 Interpreter (Nagoya Geek Bar 2011-05-02)
7shi
?
第2回 分散システム本読書会
第2回 分散システム本読書会第2回 分散システム本読書会
第2回 分散システム本読書会
Kenji Ohtsuka
?
厂迟补肠办贰虫肠丑补苍驳别で见たシステムプログラミング案件
厂迟补肠办贰虫肠丑补苍驳别で见たシステムプログラミング案件厂迟补肠办贰虫肠丑补苍驳别で见たシステムプログラミング案件
厂迟补肠办贰虫肠丑补苍驳别で见たシステムプログラミング案件
yaegashi
?
Unixカーネルの設計 7 プロセスの制御
Unixカーネルの設計 7 プロセスの制御Unixカーネルの設計 7 プロセスの制御
Unixカーネルの設計 7 プロセスの制御
Norito Agetsuma
?
狈辞诲别.箩蝉入门
狈辞诲别.箩蝉入门狈辞诲别.箩蝉入门
狈辞诲别.箩蝉入门
俊夫 森
?
小二病でも骋颁やりたい
小二病でも骋颁やりたい小二病でも骋颁やりたい
小二病でも骋颁やりたい
dec9ue
?
[Basic 7] OS の基本 / 割り込み / システム コール / メモリ管理
[Basic 7] OS の基本 / 割り込み / システム コール / メモリ管理[Basic 7] OS の基本 / 割り込み / システム コール / メモリ管理
[Basic 7] OS の基本 / 割り込み / システム コール / メモリ管理
Yuto Takei
?
2011.09.18 v7から始めるunix まとめ
2011.09.18 v7から始めるunix まとめ2011.09.18 v7から始めるunix まとめ
2011.09.18 v7から始めるunix まとめ
Makiko Konoshima
?
Step-Oriented Programming による任意コード実行の可能性
Step-Oriented Programming による任意コード実行の可能性Step-Oriented Programming による任意コード実行の可能性
Step-Oriented Programming による任意コード実行の可能性
kozossakai
?
Step-Oriented Programming による任意コード実行の可能性 by 坂井 弘亮
Step-Oriented Programming による任意コード実行の可能性 by 坂井 弘亮Step-Oriented Programming による任意コード実行の可能性 by 坂井 弘亮
Step-Oriented Programming による任意コード実行の可能性 by 坂井 弘亮
CODE BLUE
?
虫86とコンテキストスイッチ
虫86とコンテキストスイッチ虫86とコンテキストスイッチ
虫86とコンテキストスイッチ
Masami Ichikawa
?
C++ マルチスレット?フ?ロク?ラミンク?
C++ マルチスレット?フ?ロク?ラミンク?C++ マルチスレット?フ?ロク?ラミンク?
C++ マルチスレット?フ?ロク?ラミンク?
Kohsuke Yuasa
?
[Basic 8] フ?ロセスとスレット? / 入出力 / シェル
[Basic 8] フ?ロセスとスレット? / 入出力 / シェル[Basic 8] フ?ロセスとスレット? / 入出力 / シェル
[Basic 8] フ?ロセスとスレット? / 入出力 / シェル
Yuto Takei
?
C21 SQL Server のスレッド管理 by 古賀啓一郎
C21 SQL Server のスレッド管理 by 古賀啓一郎C21 SQL Server のスレッド管理 by 古賀啓一郎
C21 SQL Server のスレッド管理 by 古賀啓一郎
Insight Technology, Inc.
?
Unix architecture
Unix architectureUnix architecture
Unix architecture
raw-hide
?
PEZY-SC programming overview
PEZY-SC programming overviewPEZY-SC programming overview
PEZY-SC programming overview
Ryo Sakamoto
?
Dive into RTS - another side
Dive into RTS - another sideDive into RTS - another side
Dive into RTS - another side
Kiwamu Okabe
?
V6 Interpreter (Nagoya Geek Bar 2011-05-02)
V6 Interpreter (Nagoya Geek Bar 2011-05-02)V6 Interpreter (Nagoya Geek Bar 2011-05-02)
V6 Interpreter (Nagoya Geek Bar 2011-05-02)
7shi
?
第2回 分散システム本読書会
第2回 分散システム本読書会第2回 分散システム本読書会
第2回 分散システム本読書会
Kenji Ohtsuka
?
厂迟补肠办贰虫肠丑补苍驳别で见たシステムプログラミング案件
厂迟补肠办贰虫肠丑补苍驳别で见たシステムプログラミング案件厂迟补肠办贰虫肠丑补苍驳别で见たシステムプログラミング案件
厂迟补肠办贰虫肠丑补苍驳别で见たシステムプログラミング案件
yaegashi
?
Unixカーネルの設計 7 プロセスの制御
Unixカーネルの設計 7 プロセスの制御Unixカーネルの設計 7 プロセスの制御
Unixカーネルの設計 7 プロセスの制御
Norito Agetsuma
?
狈辞诲别.箩蝉入门
狈辞诲别.箩蝉入门狈辞诲别.箩蝉入门
狈辞诲别.箩蝉入门
俊夫 森
?

Recently uploaded (6)

論文紹介:「Amodal Completion via Progressive Mixed Context Diffusion」「Amodal Insta...
論文紹介:「Amodal Completion via Progressive Mixed Context Diffusion」「Amodal Insta...論文紹介:「Amodal Completion via Progressive Mixed Context Diffusion」「Amodal Insta...
論文紹介:「Amodal Completion via Progressive Mixed Context Diffusion」「Amodal Insta...
Toru Tamaki
?
ECAモシ?ュールの基礎調査.pptx 2025/05/30 の勉強会で発表されたものです。
ECAモシ?ュールの基礎調査.pptx 2025/05/30 の勉強会で発表されたものです。ECAモシ?ュールの基礎調査.pptx 2025/05/30 の勉強会で発表されたものです。
ECAモシ?ュールの基礎調査.pptx 2025/05/30 の勉強会で発表されたものです。
iPride Co., Ltd.
?
Security-JAWS【第37回】 勉強会 2025年5月26日(月) - GitLab.pptx
Security-JAWS【第37回】 勉強会 2025年5月26日(月) - GitLab.pptxSecurity-JAWS【第37回】 勉強会 2025年5月26日(月) - GitLab.pptx
Security-JAWS【第37回】 勉強会 2025年5月26日(月) - GitLab.pptx
TsukasaKomatsubara
?
Backend for Frontend を活用した 安全な OpenID Connect 認証認可の実現
Backend for Frontend を活用した 安全な OpenID Connect 認証認可の実現Backend for Frontend を活用した 安全な OpenID Connect 認証認可の実現
Backend for Frontend を活用した 安全な OpenID Connect 認証認可の実現
Kazuki Ogiwara
?
搁别辞苍贬补迟补冲尝尝惭を利用した便利の副作用顕在化のためのアイデア発想支援手法の评価冲闯厂础滨2025
搁别辞苍贬补迟补冲尝尝惭を利用した便利の副作用顕在化のためのアイデア発想支援手法の评価冲闯厂础滨2025搁别辞苍贬补迟补冲尝尝惭を利用した便利の副作用顕在化のためのアイデア発想支援手法の评価冲闯厂础滨2025
搁别辞苍贬补迟补冲尝尝惭を利用した便利の副作用顕在化のためのアイデア発想支援手法の评価冲闯厂础滨2025
Matsushita Laboratory
?
第39回人工知能学会全国大会の企画セッション「生成础滨が切り拓く仕掛学の可能性」の讲演资料
第39回人工知能学会全国大会の企画セッション「生成础滨が切り拓く仕掛学の可能性」の讲演资料第39回人工知能学会全国大会の企画セッション「生成础滨が切り拓く仕掛学の可能性」の讲演资料
第39回人工知能学会全国大会の企画セッション「生成础滨が切り拓く仕掛学の可能性」の讲演资料
Matsushita Laboratory
?
論文紹介:「Amodal Completion via Progressive Mixed Context Diffusion」「Amodal Insta...
論文紹介:「Amodal Completion via Progressive Mixed Context Diffusion」「Amodal Insta...論文紹介:「Amodal Completion via Progressive Mixed Context Diffusion」「Amodal Insta...
論文紹介:「Amodal Completion via Progressive Mixed Context Diffusion」「Amodal Insta...
Toru Tamaki
?
ECAモシ?ュールの基礎調査.pptx 2025/05/30 の勉強会で発表されたものです。
ECAモシ?ュールの基礎調査.pptx 2025/05/30 の勉強会で発表されたものです。ECAモシ?ュールの基礎調査.pptx 2025/05/30 の勉強会で発表されたものです。
ECAモシ?ュールの基礎調査.pptx 2025/05/30 の勉強会で発表されたものです。
iPride Co., Ltd.
?
Security-JAWS【第37回】 勉強会 2025年5月26日(月) - GitLab.pptx
Security-JAWS【第37回】 勉強会 2025年5月26日(月) - GitLab.pptxSecurity-JAWS【第37回】 勉強会 2025年5月26日(月) - GitLab.pptx
Security-JAWS【第37回】 勉強会 2025年5月26日(月) - GitLab.pptx
TsukasaKomatsubara
?
Backend for Frontend を活用した 安全な OpenID Connect 認証認可の実現
Backend for Frontend を活用した 安全な OpenID Connect 認証認可の実現Backend for Frontend を活用した 安全な OpenID Connect 認証認可の実現
Backend for Frontend を活用した 安全な OpenID Connect 認証認可の実現
Kazuki Ogiwara
?
搁别辞苍贬补迟补冲尝尝惭を利用した便利の副作用顕在化のためのアイデア発想支援手法の评価冲闯厂础滨2025
搁别辞苍贬补迟补冲尝尝惭を利用した便利の副作用顕在化のためのアイデア発想支援手法の评価冲闯厂础滨2025搁别辞苍贬补迟补冲尝尝惭を利用した便利の副作用顕在化のためのアイデア発想支援手法の评価冲闯厂础滨2025
搁别辞苍贬补迟补冲尝尝惭を利用した便利の副作用顕在化のためのアイデア発想支援手法の评価冲闯厂础滨2025
Matsushita Laboratory
?
第39回人工知能学会全国大会の企画セッション「生成础滨が切り拓く仕掛学の可能性」の讲演资料
第39回人工知能学会全国大会の企画セッション「生成础滨が切り拓く仕掛学の可能性」の讲演资料第39回人工知能学会全国大会の企画セッション「生成础滨が切り拓く仕掛学の可能性」の讲演资料
第39回人工知能学会全国大会の企画セッション「生成础滨が切り拓く仕掛学の可能性」の讲演资料
Matsushita Laboratory
?

【学习メモ#11迟丑】12ステップで作る组込み翱厂自作入门

  • 5. タスク間通信 ● 組込みOSのカーネルはできるだけコンパクトに しておきたい – 高機能やリアルタイム性を求められるため ● だから、デバイス?ドライバや、ファイル?シ ステムなどといったリアルタイム性を保証でき ないサービスは、カーネルの外でスレッドとし て実装する ● とはいえ、そういったアプリは一般に単体で動 作できるものは少ない – 機能別にスレッドに分けることが多い – そこでスレッド同士でデータのやり取りができるタ スク間通信をできるようにする
  • 6. システム?タスク ● 基本サービスを行うスレッドのことを一般にシ ステム?タスクと呼ぶ – 任意サイズのメモリ管理を実装するとして、OSの機 能として実装すると空きメモリの検索時間が保証で きない – そこでメモリ管理を行うようなスレッドを作成し、 任意サイズ必要な場合はそのスレッドにタスク間通 信で依頼して領域を割り当ててもらう、などといっ た実装ができる ● こういったOSのカーネルとセットで利用するス レッドがシステム?タスク
  • 7. ユーザ?タスク ● OSのユーザ側で作成するアプリケーション?プ ログラムは、ユーザ?タスクと呼ぶ – ユーザが使う目的のスレッドと考えれば良いかな ● OSからみればシステム?タスクもユーザ?タス クもOSで動作しているスレッドにすぎない – 両者の違いは使われ方の違いなだけ
  • 9. 関数の再入 ● タスク間通信が必要な理由はもうひとつ関数の 再入を避けるというものがある ● 関数の再入とは、あるスレッドが特定の関数を 実行している最中に割込みによって別スレッド が動作し、その別スレッドがその関数を実行し てしまうこと – 別々のスレッドで同じタイミングで同じ関数を実行 してしまうようなことかな ● 関数内でstaticなデータをやり取りしている場 合、内容を上書きし合うといった問題が起きる
  • 10. 再入問題の回避 ● 回避する手段はいくつかの方法がある – 仮想メモリを実装し、タスクをスレッドでなくプロ セス化する – サービスをOS内部に実装し、システム?コールを利 用して呼び出すようにする – 関数をリエントラントな構造にする – 関数内の排他が必要な部分に履いた処理を入れる (割込み禁止など) – 再入が発生しない設計にする – サービスをスレッド化する
  • 11. 仮想メモリを実装 ● 関数の再入はメモリを共通資源として複数のス レッドが扱っていることに問題がある ● そこでタスクごとに独立した仮想的なメモリ空 間を割り当てれば良い ● この仮想的なメモリを仮想メモリ、そのメモリ のアドレスを仮想メモリと呼ぶ ● 仮想メモリにより動作するアドレス空間が独立 しているタスクをプロセスと呼ぶ – スレッドはアドレス空間は共通なので、他のスレッ ドの変数などにアクセスできるが、プロセスではそ ういったことはできない ● スレッド?モデル、プロセス?モデルなどとし て区別される
  • 12. MMU ● 仮想メモリではMMUと呼ばれる専用ハードウェ アが仮想アドレスから実際のメモリアドレスに アドレス変換をした上で行われる – 実際のメモリを物理アドレスと呼ぶ ● タスクごとにメモリ空間は独立するので、結果 的にメモリ保護を行うこともできる ● メリットはいろいろあるが組込みOSには向かな い – H8にはMMUが無い – リアルタイム性や高速性に向いていない – そもそも組込みOSではメモリ保護は必要ない
  • 13. サービスをOS内部に実装 ● OSの機能としてカーネル内部に実装する方法が ある ● システム?コールによってOSに依頼する形 ● とはいえ、OSの肥大化に繋がるし、再入を防止 したいサービスを全てカーネルに含ませるとい うポリシーの無い設計になってしまうので、あ まり良い手段とはいえない
  • 14. 関数をリエントラントな構造にする ● 関数が再入されても問題が発生しない構造に なっていることをリエントラント(再入可能)と 言う – リエントラントにするには、たとえば静的変数では なく自動変数を利用するなどするといった手段があ る ● ただし、関数内部でさらに別の関数を呼び出し ている場合は、その関数もリエントラントにし なきゃいけない ● つまりライブラリ関数全体をリエントラントに する必要がある
  • 15. 排他処理を入れる ● 静的変数を操作している部分で割込み禁止にす ることで、スレッドのディスパッチを防止する ことで再入されなくしてしまう方法もある – INTR_DISABLEやINTR_ENABLEとか使う void log_output(char *message) { static char buf[256]; time_t t; time(&t) INTR_DISABLE; strcpy(buf, ctime(&t)); strcpy(buf + strlen(buf), message); puts(buf); INTR_ENABLE; }
  • 16. 排他 ● ある資源にアクセスしている最中に他の処理が その資源にアクセスしないようほ保証すること を排他と言う ● 排他には割込み禁止/許可の他に、ロック、セ マフォ、ミューテックスと呼ばれる機能を利用 する方法がある ● ロックをアプリケーション?レベルで実現しよ うとすると様々な問題があるので、一般にセマ フォという排他の仕組みをOS側で提供する
  • 17. セマフォ ● セマフォとはロックをOS側で行うような仕組み 獲得?解放をカウンタで管理することで、複数 のスレッドが再入する場合のスレッド数の上限 を管理することができる ● 上限が1のセマフォはバイナリ?セマフォと呼 ばれ、常にひとつのスレッドしか実行できない ● ミューテックスはバイナリ?セマフォに近い void log_output(char *message) { . . kz_getsem(ID); ←セマフォ獲得 strcpy(buf, ctime(&t)); strcpy(buf + strlen(buf), message); puts(buf); kz_relsem(ID); ←セマフォ解放 }
  • 18. 割込み禁止でする排他の話 ● 割込み禁止から有効に戻すまでの間を割り込み 禁止区画と呼ぶ – INTR_DISABLEからINTR_ENABLEの間 ● この方法での排他は割込みの遅延(遅延割込み) が発生する問題がある – 割込み禁止中に割込みが発生した場合、現在行なっ ている割込み処理を終えてから発生するので、割込 みが遅延する形になる – 割込み禁止区画が長いとキーボードを叩いても反応 が鈍いとか、マウスの動きが鈍くなったりする ● 一般に「割込み処理は短く」「割込み禁止は最 小に」が鉄則
  • 19. 再入が発生しない設計にする ● スレッドの優先度を工夫して優先度の大小の関 係で動作が奪われないようにしたりできるが ● 優先度が動作に依存するため慎重に設計する必 要がある ● 現実的には割込み禁止にするなど確実で小回り の効く対策が人気 ● 排他が不要な構成にするというのは理想だけ ど、難しいな
  • 20. サービスをスレッド化する ● 再入の根本的な原因はひとつの資源を複数のス レッドから操作してしまっていること ● 簡単な解決策は資源を管理するスレッドを実装 して、このスレッドを通して資源を操作する ● これができるようにするには、スレッド同士の 通信ができるようにならなきゃいけない – つまりタスク間通信が必要 ● 組込みOSはカーネルをコンパクトにしたいので 基本的にサービスはスレッドとして実装する – サービスを利用する場合はタスク通信でスレッドに 依頼する
  • 22. メッセージ ● KOZOSのタスク間通信はOS内部からシステム? コールを発行することで、送信と受信の間に構 造体をかませてやりとりするになっている – この構造体をメッセージ?ボックスと本書では呼ん でいる – また、KOZOSのタスク間通信をメッセージと呼ぶ
  • 23. メッセージの仕組み ● メッセージのやり取りは送信用のシステム? コールを呼び出して、受信側でメッセージ受信 用のシステム?コールを呼び出して受け取る ● 受信用のシステム?コールを呼び出してもメッ セージが送信側で送信されていない場合は、ス リープして待ち合わせる – 待ち合わせによりスリープすることを一般に ブロックと言う ● 受信用のシステム?コールを読んでいないのに 送信側が複数送信を行ったときは、メッセージ はキューに蓄えられる
  • 24. メッセージのシステム?コール ● kz_send()とkz_recv() – どちらも第1引数にメッセージID、第2と第3 で整数値とchar型のポインタを持つ ● 第2と第3でint型のデータ(2バイト)とchar型の ポインタ(4バイト)を渡せるようにしている – バッファのサイズとアドレスを渡すと か、argc、argv[]形式で任意のデータを渡 す、といった融通が効くから
  • 25. メッセージで同期的処理もできる ● スレッド同士で情報のやりとりだけではなく、 動作タイミングを取り合うこともできる – あるスレッドの処理が完了してからもう一方 のスレッドで処理を開始するといったことが 可能 ● スレッドの動作状態と関係無く別の動作が行わ れることを非同期処理と言う
  • 27. プログラムの修正と追加 ● 修正ファイル – defines.h...メッセージIDの定義 – syscall.h,syscall.c...システム?コール追加 – kozos.h,kozos.c...システム?コール追加 – main.c...起動するスレッドの修正 – Makefile ● 追加ファイル ● test11_1.c,test11_2.c
  • 28. メッセージ送受信 ● メッセージのやり取りはシステム?コールに よって行い、メッセージボックスの構造体を間 に挟んで行う ● 特に難しい処理はないが、メッセージボックス はキューになっている – リンクリスト構造で、headとtailのポインタを持つ – tailポインタを持つのはリンクリストの最後尾を毎 回検索するのが無駄であるため
  • 29. メッセージ送受信の流れ ● 送信側は基本的にメッセージボックスにメッ セージ(構造体)を保存するだけのことをする – 受信待ちスレッドがある場合は受信処理を行い、カ レントスレッドをレディ?キューに繋ぎ直す ● 受信側は受信するメッセージがない場合はス リープ状態に入る – スリープ状態で送信処理が行われたときに、そちら で受信処理が行われるわけ ● スリープする必要がなければメッセージを取得 する – メッセージボックスは複数のメッセージを持つ場合 にキューとなり、メッセージ取得は順番に取得が為 される
  • 31. プログラムの実行 /Users/sandai/12step/src/11/os% sudo cu -l /dev/tty.usbserial-FTG6PQ4H . . kzload> run starting from entry point: ffc020 kozos boot succeed! test11_1 started. test11_1 recv in. test11_2 started. test11_2 send in. test11_1 recv out. static memory . . . test11_2 recv out. allocated memory test11_2 exit. test11_2 EXIT.
  • 33. まとめ ● タスク間通信を実装したことでOSの重い処理を システム?タスクとしてスレッド化できるよう になった ● OSの機能をコンパクトにする設計をマイクロ? カーネル、様々な機能を全て詰め込んだものを モノリシック?カーネルと呼ぶ