SlideShare a Scribd company logo
1 of 36
Download to read offline
12ステップで作る組込みOS自作入門
      4thステップ




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

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

【税込価格】
4,410円

【サポートページ】
http://kozos.jp/books/makeos/
もくじ
1.ブートローダ
2.XMODEMの実装とプログラム実行
3.まとめ
4.アセンブリ言語
1.ブートローダ
フラッシュROMの書き込み回数
●   フラッシュROMの書き込み回数には制限がある
    –   H8/3069Fでは最悪100回(通常の利用の範囲なら1000
        回)
●   これから開発を進めていく上で上限に達してし
    まうので、フラッシュROMに直接書き込む代わ
    りにOSをシリアル経由でダウンロードして、そ
    れをRAMに展開して起動するプログラムをフ
    ラッシュROMに書き込む方法を取る
●   このプログラムをブートローダと呼ぶ
    – IPLもブートローダと同じ意味合いかな
ブートローダ
●   電源ONでまずブートローダを起動させ、それか
    らOSをダウンロードし、OSを起動させる
●   こうして段階を踏んでOSを起動する手順を一般
    的にブートストラップと呼ぶ
●   これでOSを修正する度にフラッシュROMに書き
    込まずにすむ
    –   これは開発段階の話で、実際なら製品化のときにフ
        ラッシュROMに直接書き込んで普通にROMから起動さ
        せることが多い(ROM化と言う)
        ● ROM化の方法が紹介されているが今回はROM化し

          ないので省略
シリアル経由でファイル転送
●   今回作成するブートローダは次の3つの機能が
    必要となる
    –   シリアル経由でOSをダウンロードし、RAM上にいっ
        たん保存する
    –   保存したOSを適切にRAM上に展開
    –   RAM上に展開したOSを実行
シリアル経由でのダウンロード
●   今まではkzloadというファイルをフラッシュ
    ROMに直接書き込んでいたけど、これがシリア
    ル経由でマイコンに転送する方法に変わる
●   そこで利用するプロトコルがXMODEMというプロ
    トコル
    –   昔からあるシリアル経由でのファイル転送のプロト
        コルで、仕様が簡単なので実装の手間もかからない
    –   ただし、転送効率は悪いし、信頼性も低い
    –   今回はそういったことはシビアに考える必要はない
        ので、問題はないとのこと
XMODEMの仕様(送信側)
●   ①受信側から定期的に送信されるNAK(ox15)を受けた
    ら送信を開始
●   ②データはブロック単位に分けて送信する。ブロック
    は固定長なので、ファイルの終端なおでデータ量が足
    りない場合にはEOF(x01a)で埋める
●   ③1ブロック送信したらACK(0x06)かNAKが返ってくる
    のを待つ。ACKの場合には、引き続き次のブロックを
    送信。NAKの場合には同じブロックを転送
●   ④データの終わりはEOT(0x04)を送信し、ACKが返って
    きたら終了
●   ⑤中断したい場合はCAN(0x18)を送信する。CANを受け
    たら中断
XMODEMの仕様(受信側)
●   ①受信準備ができたら合図として定期的にNAKを送
    信。シリアルから文字を受信したらデータ受信開始
●   ②SOH(0x01)を受けたら連続するデータをブロックと
    して受信。受信に成功したらACKを返す。失敗したら
    (チェックサムエラーなど)NAKを返す
●   ③EOTを受けたらACKをかえして終了
●   ④中断したい場合はCANを送信。CANを受けたら中断
ブロックのフォーマット
●   送信するブロックのフォーマットは以下の通り

    a       b    c                d                e
127頁 図4.1 XMODEMのブロック・フォーマット より


フィールド サイズ              意味

        a       1バイト   SOH

        b       1バイト   ブロック番号。1からの通番で、255の次は0になる

        c       1バイト   ブロック番号をビット反転したもの(チェック用)

        d       128バイト データ。データが128バイトに満たない場合はEOFで埋める

        e       1バイト   データ部のチェックサム

128頁 表4.1 各フィールドの意味 より
ACKとNAK
●   ACK(ACKnowledge)
    –   受信成功時の応答として送信されるコード
●   NAK(NegativeAcKnowledge)
    –   エラー時の応答として送信されるコード
2.XMODEMの実装とプログラム実行
プログラムの修正とファイル追加
●   追加ファイル
    – xmodem.h、xmodem.c...XMODEMプロトコル実装
●   修正ファイル
    – main.c...コマンド動作を実装
    – id.scr...bufferセクションを追加
    – serial.h、serial.c...文字の受信を実装
    – lib.h、lib.c...文字列受信用のライブラリ関数追加
    – Makefile
XMODEM実装
●   xmodem.cは受信用の処理を行なっている
    –   送信はlrzszのlsxというアプリを使うみたい(cuコ
        マンドだと)
●   仕様についてはスライド9pを参照
ld.scr
●   ダウンロードしたファイルを配置する場所を定
    義している
    –   これは#defineでヘッダファイルに書くことが多い
        が、今回はリンカ・スクリプトをメモリマップとし
        て扱うためリンカ・スクリプトに書く
buffer(rwx) : o = 0xffdf20, l = 0x001d00

~~~~~~~~~~~

.rodata {
} > rom

.buffer : {
        _buffer_start = . ;
} > buffer
その他修正コード
●   serial.cは受信用の関数を追加
●   lib.cも受信用のライブラリ関数を追加
●   Mekefileはxmodem.oをコンパイル対象にしただ
    け
lrzszインストール
●   MacでXMODEMプロトコルによる転送を行う場
    合、lrzszをインストールする必要がある
●   最も簡単な方法はhomebrewからインストールす
    ること
●   homebrewが何か分からない場合は検索して
●   インストール方法はターミナルから下記のよう
    に入力するだけ
$ brew install lrzsz
lsxの使い方
●   lrzszのうち、lsxというXMODEMプロトコルの転
    送アプリを使って転送を行う
●   書籍では~CLocal command? lsx defines.hみた
    いに入力しろとあるが、Macではうまくいかな
    い
●   ~+lsx defines.hとするように注意すること
     – なるべく早く~+と打つ
プログラム実行(load)
/Users/sandai/12step/src/04/bootload% sudo cu -l
/dev/tty.usbserial-FTG6PQ4H
Password:
Connected.
kzload (kozos boot loader) started.
kzload> load
~+lsx defines.h
Sending defines.h, 1 blocks: Give your local XMODEM receive
command now.
Bytes Sent:     256  BPS:65

Transfer complete

XMODEM receive succeeded!
プログラム実行(dump)
/Users/sandai/12step/src/04/bootload% sudo cu -l
/dev/tty.usbserial-FTG6PQ4H
.
.
.
Transfer complete

XMODEM receive   succeeded!
kzload> dump
size: 100
23 69 66 6e 64   65   66   20   5f   44   45   46   49   4e   45   53
5f 48 5f 49 4e   43   4c   55   44   45   44   5f   0a   23   64   65
66 69 6e 65 20   5f   44   45   46   49   4e   45   53   5f   48   5f
49 4e 43 4c 55   44   45   44   5f   0a   0a   23   64   65   66   69
6e 65 20 4e 55   4c   4c   20   28   28   76   6f   69   64   20   2a
.
.
dumpの確認
●   dumpコマンドを使うと前のページのように転送
    したファイルが16進数で表示される
●   実際にうまく転送できているかどうか、オリジ
    ナルのdefines.hと比較してみるには、ターミ
    ナルで下記のようにコマンド
/Users/sandai/12step/src/04/bootload%   hexdump -C defines.h
00000000 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 *|
.
.
.
3.まとめ
まとめ
●   XMODEMプロトコルを実装してファイル転送を
    行った
●   特に複雑な概念や用語は出て来なかったので、
    気楽にできる
    –   ただまあXMODEMの実装がちょっとあれ。送信側の
        コードがないからはっきりイメージはできない。と
        はいえ、単純なプロトコルで分かりやすいといえば
        分かりやすい
●   ~+lsxの部分は、Macであれば書籍の通りではう
    まくいかないので気をつける
4.アセンブリ言語
アセンブラ・プログラミング
●   OSを自作する場合アセンブラの知識が必須
●   アセンブラでないと記述できない部分があるか
    ら(アセンブラで書くべき部分)
    –   スタートアップ
    –   割込みの入力と出口
    –   スレッドのディスパッチ
●   全部の命令を覚える必要はない
●   やりたいことだけできるようになれば十分
スタック
●   たとえばforで使うカウンタ変数をずっとメモ
    リ上に置いとくのは邪魔で無駄
●   そこで自動変数みたいなのがある
    –   関数に入ったときに獲得され、関数から出たら捨て
        られるやつ
●   でまあこういった扱いをするためにスタックを
    使う
    –   スタックを管理するために利用されるポインタをス
        タック・ポインタ
    –   関数単位でスタック上に確保される領域をスタッ
        ク・フレーム
自動変数のスタックは意識しない
●   スタック・ポインタやスタック・フレームの詳
    細は検索で適当に調べると良い
●   C言語でプログラムを書く場合は、普通はこん
    なことは意識しない
●   C言語側でいろいろ調節してくれる
    –   というかコンパイラだろうね
アセンブリ言語について
●   CPUはメモリ上にある機械語命令を逐次実行し
    ていく
●   しかしメモリ上には数値しか保存できない
●   だから、アセンブリ言語の命令ってのは数値の
    こと
    –   ただし数値だと人間は扱いにくいので、ニーモニッ
        クでコードを書く
        ● ニーモニックは普通に文字打ってプログラミン

          グできるようにしたもの
        ● とはいえ、命令はアセンブラで数値に変換され

          る。数値というか実行形式ね
CPUのレジスタ
●   CPU内部にある記憶領域
    –   汎用OSに慣れている者からすれば、周辺機器の持つ
        レジスタよりこっちの方が一般的
●   CPUは加算や減算などの数値計算を行うための
    回路を持っているが、これらの回路の入力や出
    力はレジスタに接続されている
    –   つまりレジスタを経由して行われるってことね
    –   だからメモリ上のデータはこのレジスタに読み込ん
        でから処理が行われる
ロードとストア
●   メモリ上の値をレジスタに読み込むことをロー
    ドと呼ぶ
●   レジスタの値をメモリ上に書き込むことをスト
    アと呼ぶ
●   メモリ上のデータのロードやストア、演算など
    汎用的に利用されるレジスタを汎用レジスタと
    呼ぶ
    –   どのレジスタをどう使うかってのがよくわからんが
        なあ
プログラム・カウンタ(PC)
●   汎用レジスタとは別の重要なレジスタでプログ
    ラム・カウンタがある
    –   CPUが現在実行中の命令のアドレスを指す
         ● 実行中というか次のアドレス


●   CPUはPCを加算しつつPCの指すメモリ先の命令
    を逐次実行しながら処理を進めていくわけ
    –   PCは次の命令を指す位置まで自動で加算される
●   PCの役割ってのはいわゆるジャンプ命令
    –   C言語でいうところのgoto
    –   ジャンプ命令はPCへの値の代入にすぎない
オペコードとオペランド
●   アセンブリの命令を表す部分をオペコードと呼
    ぶ。命令に対する引数に相当する部分をオペラ
    ンドと呼ぶ
●   こういったものを人間がわかりやすいようにし
    たのがニーモニック
オペコード
↓ オペランド
↓      ↓
ld r1, 0x8000    ←   実際ldってのは0x01みたいな数値
ld r2, 0x8004    ←   だけどそれじゃあわかりにくい
add r3, r1, r2   ←   そこでldとかaddとか文字を使う
st r3, 0x8010    ←   こういう表現をニーモニックと呼ぶ
インストラクション
●   機械語の命令はインストラクションとも呼ばれ
    る
    – どの数値がどの命令として動作するかという
      気もありを、命令セットとかインストラク
      ション・セットという
●   命令セットはCPUごとに違う
    – H8とx86じゃやっぱり違うらしい
    – 見た限りでは結構似ている
    – 命令じゃないけどレジスタ名は違うな
アセンブル、アセンブラ
●   アセンブリ言語で書いたコードを機械語コード
    のバイト列に変換する作業をアセンブルと言う
    –   昔は手でやってたからハンド・アセンブルなんて言
        葉も残ってる
●   アセンブルを行うプログラムをアセンブラと呼
    ぶ
    –   コンパイラみたいな位置づけで考えればイメージし
        やすい
●   機械語コードをアセンブラに逆変換することを
    逆アセンブルと呼ぶ
おわり
●   このあと実行形式ファイルを逆アセンブルして
    いろいろ解説されているが、かなり長くなるの
    でここで終わる
●   汎用OSであればアセンブリ周りはGASやNASMで
    やればいいと思うのでこのあたりは流してもい
    いんじゃないかな
●   でも勉強になるっちゃなる

More Related Content

What's hot

Slab Allocator in Linux Kernel
Slab Allocator in Linux KernelSlab Allocator in Linux Kernel
Slab Allocator in Linux KernelAdrian Huang
 
Luca Ceresoli - Buildroot vs Yocto: Differences for Your Daily Job
Luca Ceresoli - Buildroot vs Yocto: Differences for Your Daily JobLuca Ceresoli - Buildroot vs Yocto: Differences for Your Daily Job
Luca Ceresoli - Buildroot vs Yocto: Differences for Your Daily Joblinuxlab_conf
 
Launch the First Process in Linux System
Launch the First Process in Linux SystemLaunch the First Process in Linux System
Launch the First Process in Linux SystemJian-Hong Pan
 
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화게임서버프로그래밍 #7 - 패킷핸들링 및 암호화
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화Seungmo Koo
 
高度に最適化された移植可能なメモリマネージャ
高度に最適化された移植可能なメモリマネージャ高度に最適化された移植可能なメモリマネージャ
高度に最適化された移植可能なメモリマネージャDADA246
 
Vimから見たemacs
Vimから見たemacsVimから見たemacs
Vimから見たemacsShougo
 
ASP.NET과 C#으로 개발하는 대규모 소셜 게임
ASP.NET과 C#으로 개발하는 대규모 소셜 게임ASP.NET과 C#으로 개발하는 대규모 소셜 게임
ASP.NET과 C#으로 개발하는 대규모 소셜 게임흥배 최
 
Reverse Mapping (rmap) in Linux Kernel
Reverse Mapping (rmap) in Linux KernelReverse Mapping (rmap) in Linux Kernel
Reverse Mapping (rmap) in Linux KernelAdrian Huang
 
大規模DCのネットワークデザイン
大規模DCのネットワークデザイン大規模DCのネットワークデザイン
大規模DCのネットワークデザインMasayuki Kobayashi
 
binary log と 2PC と Group Commit
binary log と 2PC と Group Commitbinary log と 2PC と Group Commit
binary log と 2PC と Group CommitTakanori Sejima
 
Effective Modern C++勉強会#4 Item 17, 18資料
Effective Modern C++勉強会#4 Item 17, 18資料Effective Modern C++勉強会#4 Item 17, 18資料
Effective Modern C++勉強会#4 Item 17, 18資料Ryo Igarashi
 
Linux booting procedure
Linux booting procedureLinux booting procedure
Linux booting procedureDhaval Kaneria
 
Play with FILE Structure - Yet Another Binary Exploit Technique
Play with FILE Structure - Yet Another Binary Exploit TechniquePlay with FILE Structure - Yet Another Binary Exploit Technique
Play with FILE Structure - Yet Another Binary Exploit TechniqueAngel Boy
 
Overlapped IO와 IOCP 조사 발표
Overlapped IO와 IOCP 조사 발표Overlapped IO와 IOCP 조사 발표
Overlapped IO와 IOCP 조사 발표Kwen Won Lee
 
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버Heungsub Lee
 
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기Jaeseung Ha
 
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)내훈 정
 
我が evil-mode を嫌いな理由 〜evil-mode の闇〜
我が evil-mode を嫌いな理由 〜evil-mode の闇〜我が evil-mode を嫌いな理由 〜evil-mode の闇〜
我が evil-mode を嫌いな理由 〜evil-mode の闇〜Shougo
 

What's hot (20)

Slab Allocator in Linux Kernel
Slab Allocator in Linux KernelSlab Allocator in Linux Kernel
Slab Allocator in Linux Kernel
 
Glibc malloc internal
Glibc malloc internalGlibc malloc internal
Glibc malloc internal
 
Luca Ceresoli - Buildroot vs Yocto: Differences for Your Daily Job
Luca Ceresoli - Buildroot vs Yocto: Differences for Your Daily JobLuca Ceresoli - Buildroot vs Yocto: Differences for Your Daily Job
Luca Ceresoli - Buildroot vs Yocto: Differences for Your Daily Job
 
Launch the First Process in Linux System
Launch the First Process in Linux SystemLaunch the First Process in Linux System
Launch the First Process in Linux System
 
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화게임서버프로그래밍 #7 - 패킷핸들링 및 암호화
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화
 
高度に最適化された移植可能なメモリマネージャ
高度に最適化された移植可能なメモリマネージャ高度に最適化された移植可能なメモリマネージャ
高度に最適化された移植可能なメモリマネージャ
 
Vimから見たemacs
Vimから見たemacsVimから見たemacs
Vimから見たemacs
 
ASP.NET과 C#으로 개발하는 대규모 소셜 게임
ASP.NET과 C#으로 개발하는 대규모 소셜 게임ASP.NET과 C#으로 개발하는 대규모 소셜 게임
ASP.NET과 C#으로 개발하는 대규모 소셜 게임
 
Reverse Mapping (rmap) in Linux Kernel
Reverse Mapping (rmap) in Linux KernelReverse Mapping (rmap) in Linux Kernel
Reverse Mapping (rmap) in Linux Kernel
 
大規模DCのネットワークデザイン
大規模DCのネットワークデザイン大規模DCのネットワークデザイン
大規模DCのネットワークデザイン
 
binary log と 2PC と Group Commit
binary log と 2PC と Group Commitbinary log と 2PC と Group Commit
binary log と 2PC と Group Commit
 
Effective Modern C++勉強会#4 Item 17, 18資料
Effective Modern C++勉強会#4 Item 17, 18資料Effective Modern C++勉強会#4 Item 17, 18資料
Effective Modern C++勉強会#4 Item 17, 18資料
 
Linux booting procedure
Linux booting procedureLinux booting procedure
Linux booting procedure
 
Play with FILE Structure - Yet Another Binary Exploit Technique
Play with FILE Structure - Yet Another Binary Exploit TechniquePlay with FILE Structure - Yet Another Binary Exploit Technique
Play with FILE Structure - Yet Another Binary Exploit Technique
 
Overlapped IO와 IOCP 조사 발표
Overlapped IO와 IOCP 조사 발표Overlapped IO와 IOCP 조사 발표
Overlapped IO와 IOCP 조사 발표
 
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
 
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
 
Pietのエディタを作った話
Pietのエディタを作った話Pietのエディタを作った話
Pietのエディタを作った話
 
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
 
我が evil-mode を嫌いな理由 〜evil-mode の闇〜
我が evil-mode を嫌いな理由 〜evil-mode の闇〜我が evil-mode を嫌いな理由 〜evil-mode の闇〜
我が evil-mode を嫌いな理由 〜evil-mode の闇〜
 

Viewers also liked

【学習メモ#5th】12ステップで作る組込みOS自作入門
【学習メモ#5th】12ステップで作る組込みOS自作入門【学習メモ#5th】12ステップで作る組込みOS自作入門
【学習メモ#5th】12ステップで作る組込みOS自作入門sandai
 
【学習メモ#11th】12ステップで作る組込みOS自作入門
【学習メモ#11th】12ステップで作る組込みOS自作入門 【学習メモ#11th】12ステップで作る組込みOS自作入門
【学習メモ#11th】12ステップで作る組込みOS自作入門 sandai
 
【学習メモ#9th】12ステップで作る組込みOS自作入門
【学習メモ#9th】12ステップで作る組込みOS自作入門 【学習メモ#9th】12ステップで作る組込みOS自作入門
【学習メモ#9th】12ステップで作る組込みOS自作入門 sandai
 
【学習メモ#6th】12ステップで作る組込みOS自作入門
【学習メモ#6th】12ステップで作る組込みOS自作入門 【学習メモ#6th】12ステップで作る組込みOS自作入門
【学習メモ#6th】12ステップで作る組込みOS自作入門 sandai
 
組み込み向けC++のやり方を探る - mbedで楽しい組み込みプログラミング -
組み込み向けC++のやり方を探る - mbedで楽しい組み込みプログラミング -組み込み向けC++のやり方を探る - mbedで楽しい組み込みプログラミング -
組み込み向けC++のやり方を探る - mbedで楽しい組み込みプログラミング -Kishi Shundo
 
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくばHirotaka Kawata
 
QEMUでARM64bitベアメタルプログラミング
QEMUでARM64bitベアメタルプログラミングQEMUでARM64bitベアメタルプログラミング
QEMUでARM64bitベアメタルプログラミングYuma Ohgami
 
組込みOSを作ってみよう!(オープンソースカンファレンス内セミナー資料)
組込みOSを作ってみよう!(オープンソースカンファレンス内セミナー資料)組込みOSを作ってみよう!(オープンソースカンファレンス内セミナー資料)
組込みOSを作ってみよう!(オープンソースカンファレンス内セミナー資料)kozossakai
 
やってよかったOS作り
やってよかったOS作りやってよかったOS作り
やってよかったOS作りHidemi Kawai
 
低レイヤー入門
低レイヤー入門低レイヤー入門
低レイヤー入門demuyan
 
ゼロから始める自作 CPU 入門
ゼロから始める自作 CPU 入門ゼロから始める自作 CPU 入門
ゼロから始める自作 CPU 入門Hirotaka Kawata
 
【2000行弱!】x86用自作カーネルの紹介
【2000行弱!】x86用自作カーネルの紹介【2000行弱!】x86用自作カーネルの紹介
【2000行弱!】x86用自作カーネルの紹介Yuma Ohgami
 
Web系だって低レイヤーがやりたいんだよ! コンパイラことはじめ
Web系だって低レイヤーがやりたいんだよ! コンパイラことはじめWeb系だって低レイヤーがやりたいんだよ! コンパイラことはじめ
Web系だって低レイヤーがやりたいんだよ! コンパイラことはじめNisei Kimura
 
C++でできる!OS自作入門
C++でできる!OS自作入門C++でできる!OS自作入門
C++でできる!OS自作入門uchan_nos
 
Ctfのためのpython入門
Ctfのためのpython入門Ctfのためのpython入門
Ctfのためのpython入門shiracamus
 
ハッキング実演
ハッキング実演ハッキング実演
ハッキング実演Ken Ogura
 
CTF超入門 (for 第12回セキュリティさくら)
CTF超入門 (for 第12回セキュリティさくら)CTF超入門 (for 第12回セキュリティさくら)
CTF超入門 (for 第12回セキュリティさくら)kikuchan98
 

Viewers also liked (19)

【学習メモ#5th】12ステップで作る組込みOS自作入門
【学習メモ#5th】12ステップで作る組込みOS自作入門【学習メモ#5th】12ステップで作る組込みOS自作入門
【学習メモ#5th】12ステップで作る組込みOS自作入門
 
RoadAR v.2.3 english
RoadAR v.2.3 englishRoadAR v.2.3 english
RoadAR v.2.3 english
 
【学習メモ#11th】12ステップで作る組込みOS自作入門
【学習メモ#11th】12ステップで作る組込みOS自作入門 【学習メモ#11th】12ステップで作る組込みOS自作入門
【学習メモ#11th】12ステップで作る組込みOS自作入門
 
【学習メモ#9th】12ステップで作る組込みOS自作入門
【学習メモ#9th】12ステップで作る組込みOS自作入門 【学習メモ#9th】12ステップで作る組込みOS自作入門
【学習メモ#9th】12ステップで作る組込みOS自作入門
 
【学習メモ#6th】12ステップで作る組込みOS自作入門
【学習メモ#6th】12ステップで作る組込みOS自作入門 【学習メモ#6th】12ステップで作る組込みOS自作入門
【学習メモ#6th】12ステップで作る組込みOS自作入門
 
組み込み向け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回セキュリティさくら)
 

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

ネットワークコマンド入力に対応したツール事例
ネットワークコマンド入力に対応したツール事例ネットワークコマンド入力に対応したツール事例
ネットワークコマンド入力に対応したツール事例fumoto kazuhiro
 
もしも… Javaでヘテロジニアスコアが使えたら…
もしも… Javaでヘテロジニアスコアが使えたら…もしも… Javaでヘテロジニアスコアが使えたら…
もしも… Javaでヘテロジニアスコアが使えたら…Yasumasa Suenaga
 
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~infinite_loop
 
Tremaで試すFirewall
Tremaで試すFirewallTremaで試すFirewall
Tremaで試すFirewallM Hagiwara
 
第1回勉強会スライド
第1回勉強会スライド第1回勉強会スライド
第1回勉強会スライドkoturn 0;
 
RTミドルウェアによるロボットプログラミング技術 2.プログラミングの基礎
RTミドルウェアによるロボットプログラミング技術 2.プログラミングの基礎RTミドルウェアによるロボットプログラミング技術 2.プログラミングの基礎
RTミドルウェアによるロボットプログラミング技術 2.プログラミングの基礎Noriaki Ando
 
PEZY-SC programming overview
PEZY-SC programming overviewPEZY-SC programming overview
PEZY-SC programming overviewRyo Sakamoto
 
OpenSolaris Printing Environment
OpenSolaris Printing EnvironmentOpenSolaris Printing Environment
OpenSolaris Printing EnvironmentNaruhiko Ogasawara
 
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成Izumi Tsutsui
 
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
 
Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Ransui Iso
 
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010Tsukasa Oi
 
LPICレベル1技術解説セミナー(2012/11/11)
LPICレベル1技術解説セミナー(2012/11/11)LPICレベル1技術解説セミナー(2012/11/11)
LPICレベル1技術解説セミナー(2012/11/11)Kazuko Itoda
 

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

Tmux
TmuxTmux
Tmux
 
Tmux
TmuxTmux
Tmux
 
良いコードとは
良いコードとは良いコードとは
良いコードとは
 
ネットワークコマンド入力に対応したツール事例
ネットワークコマンド入力に対応したツール事例ネットワークコマンド入力に対応したツール事例
ネットワークコマンド入力に対応したツール事例
 
もしも… Javaでヘテロジニアスコアが使えたら…
もしも… Javaでヘテロジニアスコアが使えたら…もしも… Javaでヘテロジニアスコアが使えたら…
もしも… Javaでヘテロジニアスコアが使えたら…
 
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
 
Tremaで試すFirewall
Tremaで試すFirewallTremaで試すFirewall
Tremaで試すFirewall
 
第1回勉強会スライド
第1回勉強会スライド第1回勉強会スライド
第1回勉強会スライド
 
RTミドルウェアによるロボットプログラミング技術 2.プログラミングの基礎
RTミドルウェアによるロボットプログラミング技術 2.プログラミングの基礎RTミドルウェアによるロボットプログラミング技術 2.プログラミングの基礎
RTミドルウェアによるロボットプログラミング技術 2.プログラミングの基礎
 
PEZY-SC programming overview
PEZY-SC programming overviewPEZY-SC programming overview
PEZY-SC programming overview
 
Bsd suki
Bsd sukiBsd suki
Bsd suki
 
OpenSolaris Printing Environment
OpenSolaris Printing EnvironmentOpenSolaris Printing Environment
OpenSolaris Printing Environment
 
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
 
Step-Oriented Programming による任意コード実行の可能性
Step-Oriented Programming による任意コード実行の可能性Step-Oriented Programming による任意コード実行の可能性
Step-Oriented Programming による任意コード実行の可能性
 
Step-Oriented Programming による任意コード実行の可能性 by 坂井 弘亮
Step-Oriented Programming による任意コード実行の可能性 by 坂井 弘亮Step-Oriented Programming による任意コード実行の可能性 by 坂井 弘亮
Step-Oriented Programming による任意コード実行の可能性 by 坂井 弘亮
 
Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6
 
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
 
KOGEI & KAIT Funnel WS
KOGEI & KAIT Funnel WSKOGEI & KAIT Funnel WS
KOGEI & KAIT Funnel WS
 
LPICレベル1技術解説セミナー(2012/11/11)
LPICレベル1技術解説セミナー(2012/11/11)LPICレベル1技術解説セミナー(2012/11/11)
LPICレベル1技術解説セミナー(2012/11/11)
 
C language Sem 01
C language Sem 01C language Sem 01
C language Sem 01
 

Recently uploaded

TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 

Recently uploaded (8)

TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 

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

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