動機 もう6学期だし真面目に勉強しようと思った 真面目に授業聞いてみたけどよくわからなかった Amazonみてたら OS自作 という文字列を発見 話し聞いてもよくわからないしもはや自分で作っちゃえばいいんじゃない 駒場祭付近暇だしそこで 一気に作っちゃおう

Similar documents
PowerPoint プレゼンテーション

部内向けスキルアップ研修 「組込みOS自作入門」

Slide

TFTP serverの実装

MMUなしプロセッサ用Linuxの共有ライブラリ機構

ブート領域、フラッシュ領域の分割方法 RL78ファミリ用Cコンパイラ CC-RL

プログラミング実習I

Microsoft PowerPoint - Kozos12step_

OS

CoIDE 用 F4D_VCP の説明 V /07/05 USB の VCP( 仮想 COM ポート ) による非同期シリアル通信を行うプログラムです Free の開発ツール CoIDE で作成した STM32F4 Discovery 用のプロジェクトです プログラムの開始番地は 0x

書式に示すように表示したい文字列をダブルクォーテーション (") の間に書けば良い ダブルクォーテーションで囲まれた文字列は 文字列リテラル と呼ばれる プログラム中では以下のように用いる プログラム例 1 printf(" 情報処理基礎 "); printf("c 言語の練習 "); printf

1 Atollic TrueSTUDIO( GR-PEACH TOPPERS/ASP ASP GR-PEACH mbed ( git

スライド 1

今週の進捗

02: 変数と標準入出力

Microsoft PowerPoint - kougi7.ppt

CommCheckerManual_Ver.1.0_.doc

04-process_thread_2.ppt

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

Prog1_10th

1. USB の VCP( 仮想 COM ポート ) について USB の VCP( 仮想 COM ポート ) は USB を非同期シリアル通信として使用するための USB のドライバです PC には VCP ドライバをインストールする必要があります USB の VCP( 仮想 COM ポート )

Microsoft PowerPoint - prog03.ppt

RL78開発環境移行ガイド R8C/M16C, H8S/H8SXからRL78への移行(統合開発環境編)(High-performance Embedded Workshop→CS+)

1. UART について UART は Universal Asynchronous Receiver Transmitter の頭文字をとったもので 非同期シリアル通信と呼ばれます シリアル通信とは 一本の信号線でデータをやりとりするために 1bit ずつデータを送出することをいいます データを受

arduino プログラミング課題集 ( Ver /06/01 ) arduino と各種ボードを組み合わせ 制御するためのプログラミングを学 ぼう! 1 入出力ポートの設定と利用方法 (1) 制御( コントロール ) する とは 外部装置( ペリフェラル ) が必要とする信号をマイ

(Microsoft PowerPoint - \221g\202\335\215\236\202\335\203\\\203t\203g\203E\203F\203A\215H\212w No02\201i\224z\225z\227p\201j.pptx)

PowerPoint Presentation

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

Taro-82ADAカ.jtd

PowerPoint プレゼンテーション

Microsoft PowerPoint - prog03.ppt

02: 変数と標準入出力

今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順 ) になるよう 並び替えること

Microsoft PowerPoint - 5Chap15.ppt

プログラミング基礎

Microsoft PowerPoint ppt

UIOUSBCOM.DLLコマンドリファレンス

Microsoft PowerPoint ppt

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

論文番号 分 2-2 平成 24 年度全国情報技術教育研究会第 41 回全国大会 ( 新潟大会 ) Xbee を活用した無線通信の研究 期日平成 24 年 8 月 9 日 ( 木 )~10 日 ( 金 ) 場所長岡市シティホールプラザ アオーレ長岡 香川県立三豊工業高等学校 電子科 本行

1013  動的解析によるBOTコマンドの自動抽出

出 アーキテクチャ 誰が 出 装置を制御するのか 1

実験 5 CGI プログラミング 1 目的 動的にWebページを作成する手法の一つであるCGIについてプログラミングを通じて基本的な仕組みを学ぶ 2 実験 実験 1 Webサーバの設定確認と起動 (1)/etc/httpd/conf にある httpd.conf ファイルの cgi-bin に関する

組込み Linux の起動高速化 株式会社富士通コンピュータテクノロジーズ 亀山英司 1218ka01 Copyright 2013 FUJITSU COMPUTER TECHNOLOGIES LIMITED

デジタル表現論・第6回

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

1. A/D 入力について分解能 12bit の A/D コンバータ入力です A/D 入力電圧とディジタル値との対応は理論上 入力電圧 0V : 0 入力電圧 +3V : 4095 です 実際はオフセットと傾きがあり ぴったりこの数値にはなりません 2. A/D 入力に使用する信号 STM32L_A

また 初期化について 以下のサンプルコードのように指定すれば 定義時に値を代入できます * オマケ配列は同名で複数個の箱を用意出来ます 同名ではありますが それぞれは別々の個体であるわけです また この複数個の変数は メモリ上に連続で確保されます 2. 文字と文字列 C 言語では文字と文字列は異なる

Microsoft PowerPoint - Kozos12step_07_

<4C696E A B835E A CC8A D20838A B835E B838982CC8EC08CB

第122号.indd

Microsoft Word - matlab-coder-code-generation-quick-start-guide-japanese-r2016a

SLCONFIG の操作 JF1PYE Ⅰ. PC と slconfig の通信設定 Ⅱ. Slconfig の操作 Ⅲ. 端末ソフトによる Command 機能 Ⅳ. slconfig 実行形式プログラムの作成 Ⅴ. 端末ソフト Tera Term のダウンロード インストー

02: 変数と標準入出力

Microsoft PowerPoint pptx

02: 変数と標準入出力

1. 入力した文字列を得る 1.1. 関数 scanf() を使う まずは関数 scanf() を使ったプログラムを作ってみましょう 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: #include<stdio.h> #define SIZE 128 main(

Java Scriptプログラミング入門 3.6~ 茨城大学工学部情報工学科 08T4018Y 小幡智裕

Microsoft Word - CygwinでPython.docx

bitvisor_summit.pptx

PowerPoint プレゼンテーション

RH850の割り込み/例外実現方法 CC-RHアプリケーションガイド

05-scheduling.ppt

Microsoft Word - no11.docx

また RLF 命令は 図 2 示す様に RRF 命令とは逆に 各ビットを一つずつ 左方向に回転 ( ローテイト ) する命令である 8 ビット変数のアドレスを A とし C フラグに 0 を代入してから RLF A,1 を実行すると 変数の内容が 左に 1 ビットシフトし 最下位ビット (LSB)

Si 知識情報処理

ex04_2012.ppt

型名 RF007 ラジオコミュニケーションテスタ Radio Communication Tester ソフトウェア開発キット マニュアル アールエフネットワーク株式会社 RFnetworks Corporation RF007SDK-M001 RF007SDK-M001 参考資料 1

CoIDE 用 STM32F4_UART2 の説明 V /03/30 STM32F4 Discovery の非同期シリアル通信ポート UART2 の送受信を行うプログラムです Free の開発ツール CoIDE で作成したプロジェクトサンプルです プログラムの開始番地は 0x08000

Microsoft PowerPoint - CproNt11.ppt [互換モード]

CS-3000/5000 用 LabView ドライバ 取扱説明書 第 1 版 2014/7/28 岩通計測株式会社 1. 使用条件 a. 装置 : 岩通計測製 CS-3000/CS-5000 シリーズ b. 動作確認 PC/OS:IBM PC/AT 互換機 マイクロソフト Windows7 c.p

C に必要なコンピュータ知識 C はコンピュータの力を引き出せるように設計 コンピュータの知識が必要

研究成果報告書

PowerPoint プレゼンテーション

改訂履歴

スライド 1

Microsoft PowerPoint - prog04.ppt

MS916 バッチ操作ガイド FW バージョン 0.52 向け バッチ操作の基本 MS916 のバッチ操作について バッチ操作では 読取ったバーコードデータはすべて 不揮発性のメモリ (1MB ROM JAN-13 約 50,000 件 ) に保存されます メモリに保存されたデータは任意のタイミング

C プログラミング 1( 再 ) 第 5 回 講義では C プログラミングの基本を学び演習では やや実践的なプログラミングを通して学ぶ

ToDo: 今回のタイトル

OS

PowerPoint プレゼンテーション

命令セットの構成例 a) 算術 演算命令 例 )ADD dest, source : dest dest + source SUB dest, source : dest dest - source AND dest, source : dest dest AND source SHR reg, c

Microsoft PowerPoint - OS03.pptx

目次 1 I2Cとは 13 結線写真 2 センサの多くがI2Cに対応 14 WHO_AM_I 3 マイコンでのI2C通信例 15 I2C読込みプログラム 4 とは 16 I2C読込みスクリプト概要① 5 タイミングパラメータ 17 I2C読込みスクリプト概要② 6 書込み 18 センサ読込みプログラ

Microsoft PowerPoint - C++_第1回.pptx

Microsoft PowerPoint - prog09.ppt

Microsoft PowerPoint - prog09.ppt

4 月 東京都立蔵前工業高等学校平成 30 年度教科 ( 工業 ) 科目 ( プログラミング技術 ) 年間授業計画 教科 :( 工業 ) 科目 :( プログラミング技術 ) 単位数 : 2 単位 対象学年組 :( 第 3 学年電気科 ) 教科担当者 :( 高橋寛 三枝明夫 ) 使用教科書 :( プロ

PHP 分科会 '12/01 OpenSource 協議会 System i 2012/01/26

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

PowerPoint プレゼンテーション

無線LAN JRL-710/720シリーズ ファームウェアバージョンアップマニュアル 第2.1版

メソッドのまとめ

ユーティリティ 管理番号 内容 対象バージョン 157 管理情報バッチ登録コマンド (utliupdt) のメッセージ出力に対し リダイレクトまたはパイプを使用すると メッセージが途中までしか出 力されないことがある 267 転送集計コマンド (utllogcnt) でファイル ID とホスト名の組

目次 はじめに 4 概要 4 背景 4 対象 5 スケジュール 5 目標点 6 使用機材 6 第 1 章 C# 言語 7 C# 言語の歴史 7 基本構文 8 C 言語との違い 9 Java 言語との違い 10.Netフレームワーク 10 開発資料 10 第 2 章 Mono 11 Monoの歴史 1

PowerPoint プレゼンテーション

Arduino をドリトルから 制御する教材の試行 鈴木裕貴 1

今までの復習 プログラムで最低限必要なもの 入力 ( キーボードから ファイルから ) 出力 ( 画面へ ファイルへ ) 条件分岐 : 条件の成立 不成立により 異なる動作をする 繰り返し : 一定の回数の繰返し 条件成立の間の繰返し 関数の定義 関数の呼び出し C ではそれ以外に ポインタ データ

プログラミング実習I

Transcription:

OSがあまりにわからなかったからとり あえず自分でOSつくっちゃった話 03-150508 野上和加奈

動機 もう6学期だし真面目に勉強しようと思った 真面目に授業聞いてみたけどよくわからなかった Amazonみてたら OS自作 という文字列を発見 話し聞いてもよくわからないしもはや自分で作っちゃえばいいんじゃない 駒場祭付近暇だしそこで 一気に作っちゃおう

0 step 本選び OS自作についての本はいくつかあった リアルタイム性など 何かに特化したものを除くと有名なものは以下の2つ 候補1 30日でできる OS自作入門 小林秀実著 候補2 12ステップで作る組み込みOS自作入門 坂井弘亮著

0 step 本選び 候補1 30日でできる OS自作入門 小林秀実著 プログラミングの基礎からはじめて 30日後にはウィンドウシス テムを有する32bitマルチタスクOSをフルスクラッチで作り上げ るという入門書 ビギナーでも無理なく作成できるようPCの仕組 み アセンブラ Cの解説から始まり 試行錯誤を繰り返しながら アルゴリズムを学びつつ たのしく自由な雰囲気でOSをゼロか ら構築していくという 他に類を見ない手法による 趣味と実用 と学習を兼ね備えたOS作成の入門書

0 step 本選び 候補2 12ステップで作る組み込みOS自作入門 坂井弘亮 著 手軽に購入できるマイコンボード上で動作する独自の組込 みOSをフルスクラッチで自作する ブートローダーも自作し ますので 電源ONの一番最初の動作からの理解 学習 が可能です また内容は12ステップに分かれているため 講義や輪講 実習などでの教材利用にも向いている

0 step 本選び 授業でやる内容に関して理解が深まるか 駒場祭による休講 祝日 実質4日 で実装できるか 難しすぎないか などを基準に選定 12ステップで作る組み込みOS自作入門 に決定

はじめに 組込みOSとは ある特定の機器に搭載して制御するためのOS ここではマイコンボード上で動くOSを実装 このOSでなにができるか I/Oはシリアル通信だけ PCからの文字入力に応答したり 文字を出力したりする

はじめに それだけの機能でOSといえるか OSの基本機能は資源管理 スレッドによるCPU時間の管理の実装 固定サイズのメモリ管理の実装 シリアル通信でI/Oの管理の実装 よってOSと言っても良いのではないか

はじめに このOSには実用性がないのではないか 使う ではなく 作る ことが目的 実用性は問題ではない

はじめに マイコンボードH8/3069Fの組み込みOSを実装 PCとシリアルケーブルでつなぐ 端末エミュレータでPCからマイコンを操作 PC側でマイコンの動作の様子を見る

開発の流れ 第1部 ブート ローダーの作成 第2部 OSの作成 1st step 開発環境の作成 7th step 割込み処理を実装する 2nd step シリアル通信 8th step スレッドを実装する 3rd step 静的変数の読み書き 9th step 優先度スケジューリング 4th step シリアル経由でファイルを転送する 10th step OSのメモリ管理 5th step ELFフォーマットの展開 11th step タスク間通信を実装する 6th step もう一度 Hello World 12th step 外部割込みを実装する

1st step 開発環境の構築 H8 3069Fネット対応マイコンLANボード 完成品 通販コード K-01271 発売日 2006/01/23 1台 3,750 税込 秋月電子通商で購入可

1st step 開発環境の構築 やること 開発のための環境構築 Hello World を出力するプログラムを動作させる

1st step 開発環境の構築 割込みベクタによって実行開始するアドレスを定義 スタートアップのstartという関数から始まるように定義 スタートアップをアセンブラで実装 startという関数はスタックポインタの設定を行ったあとmain()を呼び出す メイン関数ではputs()という関数で Hello World! という文字列を出力 ライブラリ関数として1文字送信関数putc()とそれを複数回用いた文字列送信関数puts() を実装

1st step 開発環境の構築 その他 ライブラリ関数のヘッダファイル シリアル デバイス ドライバ メモリをあつかうリンカスクリプト なども実装した

1st step 開発環境の構築 実行結果

2nd step シリアル通信 やること 必要なC言語の標準ライブラリの関数の実装 数字を表示する関数の実装

2nd step シリアル通信 memset() : メモリを特定の倍てデータで埋める memcpy() : メモリのコピー memcmp() : メモリの比較 strlen() : 文字列の長さ strcpy() : 文字列のコピー strcmp() : 文字列の比較 strncpy() : 長さ指定での文字列の比較 などのおなじみのライブラリ関数を実装

2nd step シリアル通信 putxval() : 整数値を16進数で出力するライブラリ関数を実装 当然 それに伴って ヘッダファイルの変更なども行った

2nd step シリアル通信 実行結果

3rd step 静的変数の読み書き やること 静的関数の書き換えができるようにする

3rd step 静的変数の読み書き メモリをあつかうリンカスクリプトを修正 いままでROMだけを扱っていたがRAMも扱えるようにメモリ領域を定義 各セクションをどこに配置するか定義 静的関数が配置されるdataセクション bssセクションはramとromの両方に配置さ れるように定義 スタックの定義の追加

3rd step 静的変数の読み書き 実行結果

4th step シリアル経由でファイルを転送する やること XMODEMの実装

4th step シリアル経由でファイルを転送する XMODEMとは シリアル通信でファイルを送るためのプロトコル

4th step シリアル経由でファイルを転送する XMODEMのプロトコルに従ってXMODEMを実装 ファイルの受信処理の開始などをコマンドで操作できるようにmain関数がコマンド入力を 受け付けるように変更 load で受信処理開始 dump でメモリを16進で出力 それ以外の入力には unknown とかえす

4th step シリアル経由でファイルを転送する リンカスクリプトで受信バッファのための領域を定義 デバイスドライバにデータ受信のための関数を追加 コンソールでの1文字受信関数getc(),文字列受信関数gets()をライブラリに追加 マイコンボードの動作が確認できるようにエコーバックも実装している

4th step シリアル経由でファイルを転送する 実行結果

5th step ELFフォーマットの展開 やること OSを起動させるための 実行形式ファイル を転送する それを解析して メモリ上に展開できるようにする ここではセグメント情報を表示させるとこまで

5th step ELFフォーマットの展開 実行結果①

5th step ELFフォーマットの展開 実行結果②

6th step もう一度 Hello World やること 実際に実行形式ファイルを展開して Hello World を作成する

6th step もう一度 Hello World ブートローダー側 5th step で表示できるようにした部分をmemcpy()によって実際に動作させるメモリ上に コピー main関数をロードしたプログラムに処理を渡すように変更

6th step もう一度 Hello World OS側 基本的にはここまで書いてきたコードが使える コンソールからの入力を受付け echo,exitコマンドに対して処理を行うようなmain関数を 実装 OSようにリンカスクリプトのメモリ定義を書き直す

6th step もう一度 Hello World 実行結果

7th step 割込み処理を実装する やること 割込み処理ができるようにする

7th step 割込み処理を実装する ブートローダー側 割込み処理の前と後におこなう処理 メモリの退避 復帰など をアセンブラで実装 割込みベクタを変更し割込みが起こった時に実行すべきアドレスを指定 その他 割込みベクタ関連の定義や初期化などを実装

7th step 割込み処理を実装する OS側 シリアル受信割込みを受け付けるように シリアルデバイスドライバに割込み機能を追加 main関数を割込みによって動作するように変更

7th step 割込み処理を実装する 実行結果

8th step スレッドを実装する やること スレッド動作を実装する OSの持つサービスを利用するための システム コール を実装する

8th step スレッドを実装する ブートローダー側 リンカスクリプトの書き換え スタックを用途別に明示的に分離 それに伴い 割込み処理やスタートアップで用途にあったスタックを使うように変更 ブートローダー側はこれで完成

8th step スレッドを実装する OS側 リンカスクリプトの書き換え 同様 スレッドのディスパッチ処理を追加 スレッドの生成 終了 システムコールの呼び出しを行う関数などを実装 リンクリスト構造でスレッドを管理

8th step スレッドを実装する 実行結果

9th step 優先度スケジューリング やること スレッドに優先度を導入する システム コールを追加する スレッドの スリープ 状態を実装する

9th step 優先度スケジューリング 優先度を追加 レディ キューの配列を優先順位の高い順に検索し 動作可能なスレッドを探す 優先順位の高い方から実行 スレッドの切り替えを行う関数や スレッドをスリープ状態にする/起こす関数 優先度を変 更する関数 スレッドIDを取得する関数を実装

9th step 優先度スケジューリング 実行結果

10th step OSのメモリ管理 やること メモリ管理ができるようにするために malloc free などを実装する

10th step OSのメモリ管理 あらかじめ16バイト 8個 32バイト 8個 64バイト 4個の領域を用意する それらをリンクリストでつなぐ メモリが要求されたら収まる最小サイズの領域をリンクリストから切り離して与える 開放されたらまたリンクリストに繋ぎ直す

10th step OSのメモリ管理 実験結果

11th step タスク間通信を実装する やること スレッド間で情報をやりとりするためのタスク間通信の機能を実装する

11th step タスク間通信を実装する メッセージをいくつかのボックスにわけレディーキューでつないで送信する

11th step タスク間通信を実装する 実行結果

12th step 外部割込みを実装する やること 1文字受信割込みを受け付ける 割込み処理 を実装する コマンド応答スレッドを作成する

12th step 外部割込みを実装する やること 割込みハンドラからシステムコールを呼び出せるようにトラップ命令を発行せずにシステ ムコールの処理を関数呼び出しするサービス関数を実装

12th step 外部割込みを実装する 実行結果