Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

2,559 views

Published on

12ステップで作る組込みOS自作入門
http://www.amazon.co.jp/dp/4877832394/
坂井 弘亮(著)
カットシステム

Published in: Technology

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

  1. 1. 12ステップで作る組込みOS自作入門 4thステップ @sandai
  2. 2. 【参考書籍】12ステップで作る組込みOS自作入門【内容】1ステップずつ、実際に動かしながらプログラムを発展させていく方式で無理なく学べる。OSやハードウェアに詳しくない方にも理解できるように十分な説明を提供坂井 弘亮(著)カットシステム(2010/5)【税込価格】4,410円【サポートページ】http://kozos.jp/books/makeos/
  3. 3. もくじ1.ブートローダ2.XMODEMの実装とプログラム実行3.まとめ4.アセンブリ言語
  4. 4. 1.ブートローダ
  5. 5. フラッシュROMの書き込み回数● フラッシュROMの書き込み回数には制限がある – H8/3069Fでは最悪100回(通常の利用の範囲なら1000 回)● これから開発を進めていく上で上限に達してし まうので、フラッシュROMに直接書き込む代わ りにOSをシリアル経由でダウンロードして、そ れをRAMに展開して起動するプログラムをフ ラッシュROMに書き込む方法を取る● このプログラムをブートローダと呼ぶ – IPLもブートローダと同じ意味合いかな
  6. 6. ブートローダ● 電源ONでまずブートローダを起動させ、それか らOSをダウンロードし、OSを起動させる● こうして段階を踏んでOSを起動する手順を一般 的にブートストラップと呼ぶ● これでOSを修正する度にフラッシュROMに書き 込まずにすむ – これは開発段階の話で、実際なら製品化のときにフ ラッシュROMに直接書き込んで普通にROMから起動さ せることが多い(ROM化と言う) ● ROM化の方法が紹介されているが今回はROM化し ないので省略
  7. 7. シリアル経由でファイル転送● 今回作成するブートローダは次の3つの機能が 必要となる – シリアル経由でOSをダウンロードし、RAM上にいっ たん保存する – 保存したOSを適切にRAM上に展開 – RAM上に展開したOSを実行
  8. 8. シリアル経由でのダウンロード● 今まではkzloadというファイルをフラッシュ ROMに直接書き込んでいたけど、これがシリア ル経由でマイコンに転送する方法に変わる● そこで利用するプロトコルがXMODEMというプロ トコル – 昔からあるシリアル経由でのファイル転送のプロト コルで、仕様が簡単なので実装の手間もかからない – ただし、転送効率は悪いし、信頼性も低い – 今回はそういったことはシビアに考える必要はない ので、問題はないとのこと
  9. 9. XMODEMの仕様(送信側)● ①受信側から定期的に送信されるNAK(ox15)を受けた ら送信を開始● ②データはブロック単位に分けて送信する。ブロック は固定長なので、ファイルの終端なおでデータ量が足 りない場合にはEOF(x01a)で埋める● ③1ブロック送信したらACK(0x06)かNAKが返ってくる のを待つ。ACKの場合には、引き続き次のブロックを 送信。NAKの場合には同じブロックを転送● ④データの終わりはEOT(0x04)を送信し、ACKが返って きたら終了● ⑤中断したい場合はCAN(0x18)を送信する。CANを受け たら中断
  10. 10. XMODEMの仕様(受信側)● ①受信準備ができたら合図として定期的にNAKを送 信。シリアルから文字を受信したらデータ受信開始● ②SOH(0x01)を受けたら連続するデータをブロックと して受信。受信に成功したらACKを返す。失敗したら (チェックサムエラーなど)NAKを返す● ③EOTを受けたらACKをかえして終了● ④中断したい場合はCANを送信。CANを受けたら中断
  11. 11. ブロックのフォーマット● 送信するブロックのフォーマットは以下の通り a b c d e127頁 図4.1 XMODEMのブロック・フォーマット よりフィールド サイズ 意味 a 1バイト SOH b 1バイト ブロック番号。1からの通番で、255の次は0になる c 1バイト ブロック番号をビット反転したもの(チェック用) d 128バイト データ。データが128バイトに満たない場合はEOFで埋める e 1バイト データ部のチェックサム128頁 表4.1 各フィールドの意味 より
  12. 12. ACKとNAK● ACK(ACKnowledge) – 受信成功時の応答として送信されるコード● NAK(NegativeAcKnowledge) – エラー時の応答として送信されるコード
  13. 13. 2.XMODEMの実装とプログラム実行
  14. 14. プログラムの修正とファイル追加● 追加ファイル – xmodem.h、xmodem.c...XMODEMプロトコル実装● 修正ファイル – main.c...コマンド動作を実装 – id.scr...bufferセクションを追加 – serial.h、serial.c...文字の受信を実装 – lib.h、lib.c...文字列受信用のライブラリ関数追加 – Makefile
  15. 15. XMODEM実装● xmodem.cは受信用の処理を行なっている – 送信はlrzszのlsxというアプリを使うみたい(cuコ マンドだと)● 仕様についてはスライド9pを参照
  16. 16. ld.scr● ダウンロードしたファイルを配置する場所を定 義している – これは#defineでヘッダファイルに書くことが多い が、今回はリンカ・スクリプトをメモリマップとし て扱うためリンカ・スクリプトに書くbuffer(rwx) : o = 0xffdf20, l = 0x001d00~~~~~~~~~~~.rodata {} > rom.buffer : { _buffer_start = . ;} > buffer
  17. 17. その他修正コード● serial.cは受信用の関数を追加● lib.cも受信用のライブラリ関数を追加● Mekefileはxmodem.oをコンパイル対象にしただ け
  18. 18. lrzszインストール● MacでXMODEMプロトコルによる転送を行う場 合、lrzszをインストールする必要がある● 最も簡単な方法はhomebrewからインストールす ること● homebrewが何か分からない場合は検索して● インストール方法はターミナルから下記のよう に入力するだけ$ brew install lrzsz
  19. 19. lsxの使い方● lrzszのうち、lsxというXMODEMプロトコルの転 送アプリを使って転送を行う● 書籍では~CLocal command? lsx defines.hみた いに入力しろとあるが、Macではうまくいかな い● ~+lsx defines.hとするように注意すること – なるべく早く~+と打つ
  20. 20. プログラム実行(load)/Users/sandai/12step/src/04/bootload% sudo cu -l/dev/tty.usbserial-FTG6PQ4HPassword:Connected.kzload (kozos boot loader) started.kzload> load~+lsx defines.hSending defines.h, 1 blocks: Give your local XMODEM receivecommand now.Bytes Sent: 256 BPS:65Transfer completeXMODEM receive succeeded!
  21. 21. プログラム実行(dump)/Users/sandai/12step/src/04/bootload% sudo cu -l/dev/tty.usbserial-FTG6PQ4H...Transfer completeXMODEM receive succeeded!kzload> dumpsize: 10023 69 66 6e 64 65 66 20 5f 44 45 46 49 4e 45 535f 48 5f 49 4e 43 4c 55 44 45 44 5f 0a 23 64 6566 69 6e 65 20 5f 44 45 46 49 4e 45 53 5f 48 5f49 4e 43 4c 55 44 45 44 5f 0a 0a 23 64 65 66 696e 65 20 4e 55 4c 4c 20 28 28 76 6f 69 64 20 2a..
  22. 22. dumpの確認● dumpコマンドを使うと前のページのように転送 したファイルが16進数で表示される● 実際にうまく転送できているかどうか、オリジ ナルのdefines.hと比較してみるには、ターミ ナルで下記のようにコマンド/Users/sandai/12step/src/04/bootload% hexdump -C defines.h00000000 23 69 66 6e 64 65 66 20 5f 44 45 46 49 4e 45 53 |#ifndef _DEFINES|00000010 5f 48 5f 49 4e 43 4c 55 44 45 44 5f 0a 23 64 65 |_H_INCLUDED_.#de|00000020 66 69 6e 65 20 5f 44 45 46 49 4e 45 53 5f 48 5f |fine _DEFINES_H_|00000030 49 4e 43 4c 55 44 45 44 5f 0a 0a 23 64 65 66 69 |INCLUDED_..#defi|00000040 6e 65 20 4e 55 4c 4c 20 28 28 76 6f 69 64 20 2a |ne NULL ((void *|...
  23. 23. 3.まとめ
  24. 24. まとめ● XMODEMプロトコルを実装してファイル転送を 行った● 特に複雑な概念や用語は出て来なかったので、 気楽にできる – ただまあXMODEMの実装がちょっとあれ。送信側の コードがないからはっきりイメージはできない。と はいえ、単純なプロトコルで分かりやすいといえば 分かりやすい● ~+lsxの部分は、Macであれば書籍の通りではう まくいかないので気をつける
  25. 25. 4.アセンブリ言語
  26. 26. アセンブラ・プログラミング● OSを自作する場合アセンブラの知識が必須● アセンブラでないと記述できない部分があるか ら(アセンブラで書くべき部分) – スタートアップ – 割込みの入力と出口 – スレッドのディスパッチ● 全部の命令を覚える必要はない● やりたいことだけできるようになれば十分
  27. 27. スタック● たとえばforで使うカウンタ変数をずっとメモ リ上に置いとくのは邪魔で無駄● そこで自動変数みたいなのがある – 関数に入ったときに獲得され、関数から出たら捨て られるやつ● でまあこういった扱いをするためにスタックを 使う – スタックを管理するために利用されるポインタをス タック・ポインタ – 関数単位でスタック上に確保される領域をスタッ ク・フレーム
  28. 28. 自動変数のスタックは意識しない● スタック・ポインタやスタック・フレームの詳 細は検索で適当に調べると良い● C言語でプログラムを書く場合は、普通はこん なことは意識しない● C言語側でいろいろ調節してくれる – というかコンパイラだろうね
  29. 29. アセンブリ言語について● CPUはメモリ上にある機械語命令を逐次実行し ていく● しかしメモリ上には数値しか保存できない● だから、アセンブリ言語の命令ってのは数値の こと – ただし数値だと人間は扱いにくいので、ニーモニッ クでコードを書く ● ニーモニックは普通に文字打ってプログラミン グできるようにしたもの ● とはいえ、命令はアセンブラで数値に変換され る。数値というか実行形式ね
  30. 30. CPUのレジスタ● CPU内部にある記憶領域 – 汎用OSに慣れている者からすれば、周辺機器の持つ レジスタよりこっちの方が一般的● CPUは加算や減算などの数値計算を行うための 回路を持っているが、これらの回路の入力や出 力はレジスタに接続されている – つまりレジスタを経由して行われるってことね – だからメモリ上のデータはこのレジスタに読み込ん でから処理が行われる
  31. 31. ロードとストア● メモリ上の値をレジスタに読み込むことをロー ドと呼ぶ● レジスタの値をメモリ上に書き込むことをスト アと呼ぶ● メモリ上のデータのロードやストア、演算など 汎用的に利用されるレジスタを汎用レジスタと 呼ぶ – どのレジスタをどう使うかってのがよくわからんが なあ
  32. 32. プログラム・カウンタ(PC)● 汎用レジスタとは別の重要なレジスタでプログ ラム・カウンタがある – CPUが現在実行中の命令のアドレスを指す ● 実行中というか次のアドレス● CPUはPCを加算しつつPCの指すメモリ先の命令 を逐次実行しながら処理を進めていくわけ – PCは次の命令を指す位置まで自動で加算される● PCの役割ってのはいわゆるジャンプ命令 – C言語でいうところのgoto – ジャンプ命令はPCへの値の代入にすぎない
  33. 33. オペコードとオペランド● アセンブリの命令を表す部分をオペコードと呼 ぶ。命令に対する引数に相当する部分をオペラ ンドと呼ぶ● こういったものを人間がわかりやすいようにし たのがニーモニックオペコード↓ オペランド↓ ↓ld r1, 0x8000 ← 実際ldってのは0x01みたいな数値ld r2, 0x8004 ← だけどそれじゃあわかりにくいadd r3, r1, r2 ← そこでldとかaddとか文字を使うst r3, 0x8010 ← こういう表現をニーモニックと呼ぶ
  34. 34. インストラクション● 機械語の命令はインストラクションとも呼ばれ る – どの数値がどの命令として動作するかという 気もありを、命令セットとかインストラク ション・セットという● 命令セットはCPUごとに違う – H8とx86じゃやっぱり違うらしい – 見た限りでは結構似ている – 命令じゃないけどレジスタ名は違うな
  35. 35. アセンブル、アセンブラ● アセンブリ言語で書いたコードを機械語コード のバイト列に変換する作業をアセンブルと言う – 昔は手でやってたからハンド・アセンブルなんて言 葉も残ってる● アセンブルを行うプログラムをアセンブラと呼 ぶ – コンパイラみたいな位置づけで考えればイメージし やすい● 機械語コードをアセンブラに逆変換することを 逆アセンブルと呼ぶ
  36. 36. おわり● このあと実行形式ファイルを逆アセンブルして いろいろ解説されているが、かなり長くなるの でここで終わる● 汎用OSであればアセンブリ周りはGASやNASMで やればいいと思うのでこのあたりは流してもい いんじゃないかな● でも勉強になるっちゃなる

×