Category Archives: 読書メモ カテゴリ "読書メモ"のRSS  

12ステップで作る組込みOS自作入門: 1stステップの作成結果

2012年9月12日 (カテゴリ: C, H8, 読書メモ:)

読み始めた「12ステップで作る組込みOS自作入門」の本ですが、gccだと書籍の内容そのままで楽しくないので、H8の製造元であるルネサスが出しているIDEのHEWを使用して同じものを作ってみる事にします。 ターゲットのマイコンも,書籍ではH8/3069Fで説明していますが、H8/3694Fをターゲットに作成します。 このチップを使用する理由は、”たまたま手元にあったから”というだけです。 3069FはフラッシュROMが512Kbteなのに対して、3694Fのほうは32kByteしかないので途中で容量不足になりそうな気もしますが、出来るところまで作ってみて足りなくなったらそ…


続きを読む

[読書メモ]12ステップで作る組込みOS自作入門: 1stステップ 開発環境の作成(と序章)

2012年9月5日 (カテゴリ: 読書メモ:)

この本は、H8マイコンで動く独自OSを作成する。 ソースコードは2000行弱しかないので、シンプルだが全貌が分かりやすい。 作成するのは、ブートストラップ、ドライバ、スレッド、スケジューラ、メモリ管理、タスク間通信あたりで、逆にサポートしていないのは、ファイルシステム、タイマーサービス、LAN機能、リアルタイム性etcとなっている。 OSには汎用OSと組み込みOSがある。 汎用OSは、悪意のある人も含めいろんな人が書いたプログラムが動くので、基本的に性悪説になる。 組み込みは、たとえば家電製品だと追加でアプリの登録はNGなので、性善説で作られることが多い。 また組み込み向けはタイミングが大事だ…


続きを読む

「12ステップで作る組込みOS自作入門」を読んで、OSを作ってみたい

2012年9月5日 (カテゴリ: 読書メモ:)

パタヘネ本、CPUの作り方を呼んで、CPU周りの仕組みはイメージがつかめてきたので、次はOSのレイヤに挑戦することにします。 Linuxはソースがあるのが良いけど、コードサイズが大きいので出来れば避けたい。 どうしようかと思いつつ入門者向けのOS作成はないかなと調べてたら、以下の本あたりが良さげらしい。 MONA―2ちゃんねる発祥の手作りOS 30日でできる! OS自作入門 作りながら学ぶOSカーネル―保護モードプログラミングの基本と実践 12ステップで作る組込みOS自作入門 Intel CPU向けの書籍だとVMWareで実行ができるから楽チンなんだけど、x86はアセンブラの命令が酷いのと、ブ…


続きを読む

[パタヘネ:読書メモ]付録B アセンブラ,リンカ,SPIMシミュレータ その2

2012年8月22日 (カテゴリ: 読書メモ:)

B.6 手続き呼出し規約 分割コンパイルする場合は、各コンパイル単位で関数の引数・戻り値をどうやって(=どのレジスタに)セットするかのルールが必要でそのルール手続き呼び出し規約(calling convention)と呼ぶ。 例えばIntel CPUの場合だけでも、以下のようなものがある。 cdecl fastcall stdcall safecall thiscall Pascal   Intel ABI x86-64 呼び出し規約が異なるobjやlibファイルを、リンカは通常リンクする事ができない。 例えばBorlandのコンパイラにはcoff2omf.exeというツールが添付さ…


続きを読む

[パタヘネ:読書メモ]付録B アセンブラ,リンカ,SPIMシミュレータ

2012年8月21日 (カテゴリ: 読書メモ:)

B.1 はじめに コンピュータが理解できるのは0/1の羅列である機械語のみだけど、機械語だと人が読みづらいので、アセンブリ言語を用意した。アセンブリ言語は、機械語と1:1に対応する名前を付けることで、人が読みやすくなる。この名前(命令)をニーモニックと呼ぶ。 アセンブリ言語を機械語に置き換えるために、アセンブラというプログラムを使用する。 素のアセンブリ言語だけだと、表現できる幅が狭いので、マクロ機能を設ける事が多い。 アセンブリのプログラム(.asm)は、アセンブリ->リンクという経緯を経て実行ファイルが作成される。 また、.asmファイルはニーモニック以外にも情報を記述できる場合が多い。あ…


続きを読む

[パタヘネ:読書メモ]第7章 マルチコアとマルチプロセッサとクラスタ

2012年8月12日 (カテゴリ: 読書メモ:)

7.1 はじめに 単一のCPUの能力を向上させるには、密度、発熱量的に限界があるので、可能であれば複数のプロセッサ(マルチプロセッサ)を使用してプログラミングを行いたい。”能力を向上…”の能力には色々な意味があるけど、ここでは単位時間当たりの処理量であるスループットを対象とする。マルチプロセッサで、スループットをあげるには全てのプロセッサに別の仕事(ジョブ)を割り当てればよい。 独立したジョブが沢山ある場合の特性を、ジョブレベル並列性(あるいはプロセスレベル並列性)と呼ぶ。 一方、単一のプログラムのコード片を複数のプロセッサで分散処理する場合は、並列処理プロ…


続きを読む

[パタヘネ:読書メモ]第6章 ストレージおよびその他の入出力の話題 その2

2012年8月7日 (カテゴリ: 読書メモ:)

6.7 入出力性能の測定法:ディスクおよびファイル・システムを例にして 省略 6.8 入出力システムの設計 入出力システムを設計する上で、要求される指標値には、バスのバンド幅と応答の遅延(レイテンシ)がある。 無負荷時のレイテンシ試算は簡単だけど、負荷がある場合は設計が難しい。 そのあたりの設計は、待ち行列理論などでシミュレーションさせたりする必要がある。 6.9 並列処理と入出力:RAID 基本的なRAIDの仕組みは常識レベルの話なので省略。 RAID構成の問題点として1台のディスクに故障が出ると、リビルド時に既存ディスクに負荷が高くなる問題がある。既存ディスクも同じ環境に晒されているため、…


続きを読む

[パタヘネ:読書メモ]第6章 ストレージおよびその他の入出力の話題

2012年8月6日 (カテゴリ: 読書メモ:)

6.1 はじめに 6.2 信頼性と信頼度とアベイラビリティ 6.3 ディスク・ストレージ 6.4 フラッシュ・ストレージ 6.1~6.4の内容は基本的な事項なので省略 (応用情報処理の試験とかのレベル) 6.5 プロセッサ、メモリ、入出力装置間の接続 プロセッサ、メモリ、入出力装置間はバスで接続されている。 バスのメリットは、汎用的で低コストということ。 バスは大きく3つに分かれる。 プロセッサ-主記憶間バス 最も距離が短く、最も速くする必要がある。   入出力バス 距離が長く、複数のデバイスが接続される。 I/Oが直接メモリに接続されるわけではなく、他のバスを経由して接続される。 …


続きを読む

[パタヘネ:読書メモ]第5章 容量と速度の両立:記憶階層の利用 その5

2012年7月31日 (カテゴリ: 読書メモ:)

5.6 仮想マシン VMという言葉からイメージする仮想化は、CPUバイナリ互換性からJavaVM等まで色々なものがある。 だけど、ここで議論するものは、命令セットアーキテクチャ(ISA:interaction set architecture)の互換性についてのみとする。 このようなものを、システム仮想マシン(system virtual machine)と呼び、どんな物なのかはVMwareなどをイメージすると分かりやすい。VMの下のレイヤーにある仕組みをVMM:仮想マシンモニタ(あるいはハイパーバイザ)と呼び、プラットホーム側をホスト、仮想環境をゲストVMと呼ぶ。 この仮想マシンモニタは、非…


続きを読む

[パタヘネ:読書メモ]第5章 容量と速度の両立:記憶階層の利用 その4

2012年7月30日 (カテゴリ: 読書メモ:)

5.5 記憶階層間に共通する概念 CPUのL1,L2キャッシュや、仮想記憶など複数の記憶階層間でキャッシュが行われるが、各階層間で似たような技術が使われている。 一方、各記憶階層ではそれぞれ要件(記憶量・速度・キャッシュ場所を求めるのに許容される時間etc)が異なる為、使われる戦略は微妙に異なる。 キャッシュの連想度を上げると、必要なキャッシュが追い出される確率が下がるので、ミス率は低下する傾向にある。但し、キャッシュサイズが大きい時はそもそもキャッシュエントリが競合する確率が低いので、連想度向上の価値が”相対的に”下がる。 キャッシュ方式の戦略 キャッシュ方式には、ダ…


続きを読む

[パタヘネ:読書メモ]第5章 容量と速度の両立:記憶階層の利用 その3

2012年7月9日 (カテゴリ: 読書メモ:)

5.4 仮想記憶 仮想記憶を使う目的は主に2つある 複数プログラム間でメモリを効率よく使用する 主記憶以上のメモリ空間を(仮想的に)プログラムが使用できるようにする 後者は、仮想アドレスと物理アドレスの変換機能と、他プロセスから自プロセスのメモリ空間をアクセスされないための保護機能がある。 基本的に仮想記憶とキャッシュは同じ考え方だけど、歴史的な経緯により用語がそれぞれで異なっている。 キャッシュミスのことは、仮想記憶の世界ではページフォールトと呼ばれる。 ページフォールが起きるとペナルティが非常に大きい(メモリに対してディスクは10万倍くらい遅いから)なので、以下にページフォルトを抑えるかは…


続きを読む

[パタヘネ:読書メモ]第5章 容量と速度の両立:記憶階層の利用 その2

2012年7月6日 (カテゴリ: 読書メモ:)

5.3 キャッシュの性能の測定と改善 キャッシュの性能の測定を行うためには、CPUの使用時間の式を再定義する必要がある。 メモリアクセスを考慮したCPU使用時間は、以下の式で表すことができる。 CPU時間 = (CPU実行クロック数 + メモリストールクロック数 ) * クロックサイクル数   メモリストールクロック数 = 読出メモリストールクロック数 + 書込メモリストールクロック数   読出メモリストールクロック数 = 読出件数 * 読出ミス率 * 読出ミスペナルティ   書込メモリストールクロック数 = 書込件数 * 書込ミス率 * 書込ミスペナルティ + …


続きを読む

[パタヘネ:読書メモ]第5章 容量と速度の両立:記憶階層の利用

2012年7月5日 (カテゴリ: 読書メモ:)

まず基本原則として、コスト的な制約により記憶域には”少量の高速な記憶域”か”大量の低速な記憶域”のどちらかしかない。これは、たとえ十分な資金を用意できたとしても、”より大量”の情報をアーカイブしておく保存領域が欲しくなるので、結局上記の状況になる。 一方、プログラム側としては、大量の記憶域へ高速へアクセスしたいという要望が出てくる。 その結果として、データのキャッシュを行う必要があるけど、キャッシュがなぜ有効かというと、それは以下の原則によっている。 局所性の法則 時間的局所性(temporal locality) 最近使…


続きを読む

[パタヘネ:読書メモ]第4章 プロセッサ その4

2012年6月24日 (カテゴリ: 読書メモ:)

4.8 制御ハザード 制御ハザードというのは、分岐命令に起因するハザードの事を意味する。 これがなぜ発生するかというと、分岐条件が成立するかの判定はEXステージで比較演算を行い、その後のMEMステージまで決まらないから。一方で、分岐命令がMEMステージに来るころには、直後3命令分に対してそれぞれIM,ID,EX処理が行われている必要があるので、その分のクロックサイクルが無駄になるリスクがある。 これに関しては、その性質上完全に防ぐ事は出来ないので、どうすれば”よりましか”という考え方になる。 単純な分岐の予測 分岐結果が決まるまで後続の命令実行を止めるというのは、その待…


続きを読む

[パタヘネ:読書メモ]第4章 プロセッサ その3

2012年6月22日 (カテゴリ: 読書メモ:)

4.6 データパスのパイプライン化と制御 前の節でも書いたように、MIPSでパイプライン化を検討する際は、以下のステージ分けを行う IF: 命令のフェッチステージ ID: 命令のデコードステージ EX: 実行ステージ MEM:メモリアクセスステージ WB: 書き戻しステージ(write back to register) パイプライン化されたCPU環境で、命令を実行する際、注意が必要なのは2点。 1.WBステージによって、レジスタの値が書き換わってしまう(EXステージの元ネタが変わってしまう) 2.次のPCの値が、EXステージが完了しないと分からない場合(分岐命令)がある 前者はデータハザード…


続きを読む

[パタヘネ:読書メモ]第4章 プロセッサ その2

2012年6月21日 (カテゴリ: 読書メモ:)

4.4 単純な実現方式 ここでは、まずシンプルな命令だけを実行できるCPUを作る 4.1でも書いたけど、サポートする命令を再掲しておく。 メモリ参照命令 : lw(load word), sw(store word) 算術論理演算命令: add, sub, and or, slt ジャンプ命令 : beq, j 演算を行うためにはALUが必要だけど、今回使用するALUは、以下の演算を行う事が出来るものとする。 Cプログラマからするとアセンブリ命令は非常に限られている(=表現力が乏しい)けど、アセンブリからみるとALU回路が行える計算処理は非常に限られている。 ALU制御コード 機能 演算内容 …


続きを読む

[パタヘネ:読書メモ]第4章 プロセッサ

2012年6月18日 (カテゴリ: 読書メモ:)

4.1 はじめに この章では、CPUの設計について考える。 だけど、いきなり本格的なCPU設計を考えると難しいので、まずはシンプルなものを設計する。 最初のバージョンで実行可能な命令は以下の9つだけをサポートする。 メモリ参照命令 : lw(load word), sw(store word) 算術論理演算命令: add, sub, and or, slt ジャンプ命令 : beq, j CPUの実装をしたいのだけど、CPUが最初にすることを考えると、以下の3つになる。 1.プログラムカウンタの値を取得し、メモリから命令をフェッチする 2.命令で指定されたレジスタの値を読み込む 3.ALUを使…


続きを読む

[パタヘネ][C]シフトと加算だけで、掛け算を行う

2012年6月17日 (カテゴリ: C, 読書メモ:)

パタヘネの”第3章:コンピュータにおける算術演算”にある、3.3乗算の補足説明です。 “乗算は、ハードウェア的には、前述した加算処理とシフト処理で実装できる”を確認するために、Cでコードを作成しました。 当然ながら、乗算命令が下記のような形でソフトウェア的に実装されているというわけではないです。 下記のような振る舞いを行う”電子回路が組まれる”という意味だけど、 回路的として説明すると分かり辛いので、説明としてコードとして記述しただけです。 #include <stdio.h>   main(…


続きを読む

[パタヘネ:読書メモ]第3章 コンピュータにおける算術演算

2012年6月14日 (カテゴリ: 読書メモ:)

3.1 はじめに この章で取り扱う話題の確認 実数や小数のあわら仕方(内部表現) 32bitに収まらない、大きな数の管理方法 四則演算などの計算は、ハードウェア的にどうやって実装されているのか 3.2 加算と減算 2進の加算処理の基本 -> 情報処理試験レベルなので省略 演算処理では、オーバーフローの考慮が必要。 ソフトウェアの都合で、オーバーフローの検出を行いたい場合があるので、どうやって検出すればよいかを考えてみる。 加算において2つの値の符号が異なる場合は、絶対オーバーフローしない(減算では、符号が同じ時はオーバーフローしない)。 符号が同じ場合はオーバーフローのリスクがあるが、1bit…


続きを読む

[パタヘネ:読書メモ]2章 命令:コンピュータの言葉 その4

2012年6月13日 (カテゴリ: 読書メモ:)

2.10 32ビットの即値およびアドレスに対するMIPSのアドレシング方式 MIPSの命令長は32bitなので、32bit値をレジスタにセットしたり、32bitアドレス空間の任意の場所にジャンプさせるには工夫が必要。理由は、32bitの中にopcodeやオペランドを指定する場所が必要なので、値の指定には16bitとかしか使えないから。 というわけで、レジスタへの値セットと、ジャンプ命令で指定するアドレスの指定方法を考える。 レジスタに,32bitの値をセットする まず、値のセット方法について。 これは、lui命令(load upper immediate) + ori命令(or immedia…


続きを読む