ハードウェアを意識したプログラミングの基礎(前編)

荘司靖

tag: 組み込み

技術解説 2008年4月 8日

デバイス・ドライバを作るためには,まずハードウェアをアクセスする手法を知らなければならない.エンディアンやアラインメントを意識したり,CPUのバージョンによる命令の違いなどを考慮する必要がある.さらに最近では,命令そのものを追加できるソフト・マクロのCPUコアなども登場している.そこで,ここではCPUとデバイス(メモリ)の間のエンディアンについて説明する.  (編集部)

 本稿では,筆者がこれまでに行ったLinuxを用いた開発の中で得た経験を元に,Linuxなどのデバイス・ドライバを開発・移植するときにハマりやすい点を紹介したいと思います.内容は大きく分けて,以下の四つになります.

  • エンディアン
  • I/Oアクセス
  • ハードウェア,CPU,コンパイラ
  • アラインメント

 特に断りがなければ,ここではポインタ・サイズが32ビットのCPUを対象にします.具体的には,x86,ARM,MicroBlaze,PowerPCの四つのCPUを中心に進めていきますが,特にそれぞれのCPUについて知らなくても問題ないように説明しています.

1.ビッグかリトルか,それが問題だ

 デバイス・ドライバをいろいろなアーキテクチャに移植するときに,まず問題になるところと言えばエンディアンです.エンディアン(またはバイト・オーダ)はメモリやネットワークにデータを配置する際の並び順です.

 図1のようにバイト単位で読み込みを行う場合,レジスタに書かれる値は読み込んだメモリの値になります.しかし一度に複数バイトを読み込む場合は,図2のように2通り注1の方法があり,どちらかを選択しなければなりません.図1の左側の方法をリトル・エンディアン,右側の方法をビッグ・エンディアンと呼びます.

注1;PDP11で使われたミドル・エンディアンというのもあるが,最近では使われていないので説明を割愛する.

zu01_01.gif
図1 バイト単位で読み込みを行う場合

zu02_01.gif
図2 リトル・エンディアンとビッグ・エンディアン

 エンディアンは基本的に,CPUの設計段階でCPUの設計者が決定します.Intel社はx86を設計するときにリトル・エンディアンを選択しました.一方,Xilinx社はMicroBlazeを設計するときにビッグ・エンディアンを選択しました(図3)

zu03_01.gif
図3 CPUとエンディアンの関係

 エンディアンの選択をユーザに任せているCPUもあります.ARMとPowerPCはバイ・エンディアンと呼ばれ,設定によってどちらのエンディアンにもなれるように設計されています.と言っても,実行中にポンポンとエンディアンを変更するわけではなく,起動時にどちらかに設定するのが一般的です.ARMではリトル・エンディアンが,PowerPCではビッグ・エンディアンが多く選択されているようです.

組み込みキャッチアップ

お知らせ 一覧を見る

電子書籍の最新刊! FPGAマガジン No.12『ARMコアFPGA×Linux初体験』好評発売中

FPGAマガジン No.11『性能UP! アルゴリズム×手仕上げHDL』好評発売中! PDF版もあります

PICK UP用語

EV(電気自動車)

関連記事

EnOcean

関連記事

Android

関連記事

ニュース 一覧を見る
Tech Villageブログ

渡辺のぼるのロボコン・プロモータ日記

2年ぶりのブログ更新w

2016年10月 9日

Hamana Project

Hamana-8最終打ち上げ報告(その2)

2012年6月26日