体験!マイコンボードで組込みLinux

第1回組込みLinuxをはじめよう

Linuxとハードウェア

Linuxを象徴する機能

Linuxがハードウェア上で動作をするにはプロセッサの基本的な機能が必要になりますが、アプリケーション単体のROM起動ベースのソフトウェアやTronが動作するにも必要となってきますので、何もLinuxに限ったことではありません。

たいていのシステムは、コンピュータシステムとして最低限必須な機能さえあれば動作をしますが、Linuxはそのような機能だけでは動作をしません。Linuxにおいては最低限必須な機能以外にMMU(メモリ・マネージメント・ユニット)が必要となり、MMUがLinuxを象徴する機能となります。

なぜMMUがLinuxを象徴する機能かというと、Linuxの生い立ちにその理由があります。

Linuxが誕生した当時の状況は、インテルの8086ベースの原始的な16ビットプロセッサをベースとしたMS-DOSというサブルーチンの寄せ集めの原始的なシステムが普及していました。そのときハードウェアベースでは16ビットプロセッサから32ビットプロセッサの80386に移行しつつありましたが、MS-DOSがあまりに普及しているために、32ビットプロセッサの機能は使用せずに原始的な8086プロセッサとして使われていました。

80386プロセッサはMMUをベースとしたプロテクトモードが本来のモードですが、しばらくの間は活用されずに放置されたままとなっていますが、Linuxは活用されずにいた80386のプロテクトモードを活用するためのシステムとして立ち上がりました。現在では多種多様なプロセッサでLinuxが動作はしていますが、その最新版のLinuxでさえ、本質的にはインテルの80386プロセッサのMMUをベースとしたプロテクトモードにべったり依存したコードのままです。

LinuxはMMUを動作させるためのコードを中核としてさまざまな機能が追加されて進化していますので、まさにMMUはLinuxを象徴する機能といえますし、Linuxの本質はMMUといってよいでしょう。

もっとも、最近ではMMUなしで動作するμCLinuxというものもありますが、フル機能のLinuxではありません。

プロセッサ選択の基準

Linuxで選択するプロセッサとしてベストなのは、インテルの80386アーキテクチャのプロセッサで、PentiumやCore2プロセッサといったものになりますが、残念ながらこれらは組込み用プロセッサではなく事務機器用に特化したプロセッサなので、組込みボードとしての使い勝手が悪いものとなっています。一方、組込み用途のプロセッサはあまりにも種類が膨大なので、一見して組込みLinuxにおけるプロセッサの選択が困難なように思えます。そこで、Linuxを象徴する機能としてのMMUということで、プロセッサの選択をします。

組込み用プロセッサはMMUがないものがほとんどで、MMUが搭載されているプロセッサはごく少数なので、実際には選択の自由が狭いのが現状です。また、どの半導体メーカでもMMU搭載のプロセッサはハイエンドにおける最上位シリーズの位置付けなのでコスト面で高価であり、実際に使える形での組込みマイコンボードとしては価格が10万円以上もするのが普通となってしまい、一般的にはPCよりコストが高い傾向にあります。

PCは一般事務機器として膨大な数が普及しているために、その量産効果により価格が抑えられているのに対して、組込み用プロセッサでは1つのボードあたりの絶対数がPCより少なく量産効果も出にくいため高価であるというのはやむを得ないことではあります。

組込み用プロセッサの選択

Linuxは多くのアーキテクチャをサポートしていますが、実用面からはほとんど選択肢がないのが実情です。

個人のホビーはともかくとして、ビジネスとして使うには広く普及しているアーキテクチャでなくてはなりません。その理由は、開発においては技術情報等が必須ですが、普及している場合は技術情報の絶対量が多いからです。また、これまでに蓄積されたソフトウェア資産を活用できるという点と、組込みプロセッサにおける周辺ペリフェラル機能における知見をそのまま活用できるということもあります。

組込みプロセッサの場合は外部機器を制御するのでCPUよりも周辺ペリフェラル機能が主役といってよく、新規習得の場合はCPU本体よりも周辺ペリフェラル機能における習熟に相当の工数がかかります。実際に開発をする場合は、簡単にいつでも入手ができるハードウェアがないといけないわけで、ハードウェアが存在しないと開発そのものが不可能になります。簡単にいつでも入手ができるハードウェアというと、広く普及しているアーキテクチャに限定されてきます。

選択の実際

国際的に普及しているアーキテクチャの1つにARMプロセッサがあります。主にヨーロッパ方面を含む海外進出をメインに考える場合にはこれを選択します。ARMアーキテクチャそのものにはMMUも含まれていますが、半導体メーカがARMライセンスを受けて実際に生産するチップの大半はMMUを含んでいないのが現状です。

国内向けの場合は、近年はARMの普及もありますが、ルネサスエレクトロニクス製 日立系統のSHプロセッサが普及しています。日立系統のプロセッサではSHが最上位シリーズになり、SHシリーズでMMUを含まないコントローラとしてSH1とSH2プロセッサがあり、その上位としてMMUを含むコンピュータのSH3とSH4プロセッサがありました。

現在のSHプロセッサのシリーズは、MMUを含まないコントローラとしてSH2とSH2Aプロセッサが、その上位としてMMUを含むコンピュータとしてSH3、SH4、SH4Aプロセッサが位置付けられており、これらの上でLinuxを動作させることができます。

組込みLinuxを使う準備

ハードウェアを用意する

組込みLinuxボードは価格面では10万円以上するものが多く、安価でも6万円くらいするのが普通です。ここでは簡単に組込みLinuxを使うことができるTAC製のT-SH7706LSRを使うことにします。

T-SH7706LSRは価格が7,980円と手軽に購入できる価格設定になっています。T-SH7706LSRのメーカサイトは以下です。

T-SH7706LSR
URL:http://web.kyoto-inet.or.jp/people/takagaki/T-SH7706/T-SH7706LSR.htm

ネット販売での購入は以下のサイトからできます。

URL:http://itrinity.jp/scb/shop/shop.cgi?id=6&kid=0

T-SH7706LSRを開発するにはその他にPCと電源とケーブルが必要となり、Linuxを動作させる場合はSDカードが別途必要になります。T-SH7706LSRで必要な電源は3.3VのACアダプタで上記のメーカやネット販売のサイトで購入をすることができます。

T-SH7706LSRの開発とリモート操作はPCを使いますが、相互の接続はD-Sub9ピンのストレートシリアルケーブルを用います。このケーブルは以下で購入可能です。

URL:http://akizukidenshi.com/catalog/g/gC-00004/

SD(SDHC)カードはどのようなものでもかまいませんが、ここではSandisk製のSDSDQ-8192-J95M(8GB)を使うことにします。これはmicroSDHCカードですが、SDカードアダプタが付属していますので、SDカードとしてT-SH7706LSRに差し込みます。

T-SH7706LSRの開発や操作はPCで行い、T-SH7706LSRではWindowsマシンからのLinuxインストールやLinuxの操作ができますが、対象はLinuxなので、やはりPCはLinuxマシンのほうがいいと思います。

ソフトウェアを用意する

T-SH7706LSRでLinuxを動作させるためのソフトウェア一式は、筆者の以下のサイトから無償でダウンロードができます。

Micro Embeded System/MES Ver 2.5
URL:http://mes.sourceforge.jp/mes24/
画像

Linuxのページに移るには、上部フレームの「SH-Linux/SH3」をクリックします。またダウンロードは、左フレーム内のメニューの「ダウンロード」をクリックします。Linuxを起動させるのに最低限必要なファイルは、以下のとおりです。

  • ① ルートファイルシステムのアーカイブ : rootfs.tar.gz
  • ② コンパイル済みカーネル/SH7706LSR対応 : vmlinux
  • ③ MES2.5対応Linuxローダのバイナリファイル : boot.exe
  • ④ 初期RAMDISK/initrd.img : initrd.img

コンパイル済みカーネルは旧版T-SH7706LAN用のものもありますので、必ずT-SH7706LSR用をダウンロードしてください。

Linuxのインストールと起動

SDカードへのセットアップ

PCのLinuxディストリビューションは複数ありますが、ここではVine Linux5.xで作業をすることにします。まず、新品のSDカード(Sandisk製/SDSDQ-8192-J95M)をカードリーダに差し込んでから、カードリーダをPCに接続します。SDカードを差し込むと、PCはSDカードを自動認識します。この状態でSDカードのデバイス名を調べるために、以下のようにdfコマンドを実行します。

# df
ファイルシステム     1K-ブロック  使用        空き 使用% マウント位置
/dev/sda2            342688356  13966308 311314416   5% /
none                    516156       172    515984   1% /dev/shm
/dev/sdb1              7746672         4   7746668   1% /media/disk

この例の場合、SDカードのパーティションは/dev/sdb1となっているので、SDカードのデバイス名は/dev/sdbとなります。

このままではSDカードのファイルシステムをマウントしたままになるので、SDカードのドライブをアンマウントします。SDカードにおけるデバイス名は環境によって異なりますので、デバイス名を正しく指定してください。SDカードのパーティションを新規作成する場合は以下のようにします。

# fdisk /dev/sdb

fdiskコマンドの操作画面に入ると、最初にdコマンドで既存パーティションを全て削除してから、新規にパーティション作成します。第1パーティションはおおむね16Mバイト程度に設定し、領域のシステムIDを「FAT16」に設定します。第2パーティションは残り容量全てに設定し、領域のシステムIDをデフォルトである「Linux」のままにしておきます。

新規にパーティションを作成したら、パーティション設定内容をpコマンドで確認します。たとえば、Sandisk製 / SDSDQ-8192-J95Mの場合は以下のようになります。

コマンド (m でヘルプ): p
Disk /dev/sdb: 7948 MB, 7948206080 bytes
81 heads, 10 sectors/track, 19165 cylinders
Units = シリンダ数 of 810 * 512 = 414720 bytes
Disk identifier: 0x00000000
デバイス Boot      Start         End      Blocks   Id  System
/dev/sdb1               1          41       16600    6  FAT16
/dev/sdb2              42       19165     7745220   83  Linux

パーティション設定内容を確認したらwコマンドで内容を確定し、fdiskコマンドを抜けます。パーティションを作成したら、2つのパーティションをそれぞれ以下のようにフォーマットします。

# mkfs -t msdos /dev/sdb1
# mkfs -t ext3 /dev/sdb2

フォーマットをしたら、いったんカードリーダごとPCから取り外してから再度PCへ差し込むと、2つのパーティションが自動認識をして自動でマウントされます。

それぞれのマウント位置を確認するために以下のようにdfコマンドを実行します。

# df
ファイルシステム     1K-ブロック  使用        空き 使用% マウント位置
/dev/sda2            342688356  13966440 311314284   5% /
none                    516156       172    515984   1% /dev/shm
/dev/sdb1                16550      2568     13982  16% /media/disk
/dev/sdb2              7623468    148220   7087988   3% /media/disk-1

第1パーティションには以下のファイルのコピーをします。

  • vmlinux
  • initrd.img
  • boot.exe

第2パーティションにはrootfs.tar.gzをコピーした後、第2パーティションのマウント位置にフォルダを移動し、以下のように展開をします。

# tar xvzf rootfs.tar.gz

SDカードへのセットアップが終了したら、SDカードの全てのドライブをアンマウントします。

Linuxの起動

PCからT-SH7706LSRをシリアルポート経由で操作をするには適当なターミナルソフトを用い、通信速度は115200[bps]にします。T-SH7706LSRを起動するとMES2.5が起動しますので、以下のようにMESのコマンドでSDカードをマウントしてから、Linuxを起動します。

MES > mount mmc0
MES > cd /mmc0/
MES > boot.exe

おわりに

今回使用したLinuxブートローダやルートファイルシステムの起動関連部については、あくまでもLinux起動用のサンプル例として提供しています。

組込み機器の場合、その利用環境や方法が現場によって異なります。そのため、次回ではLinuxブートローダやルートファイルシステムの起動関連部をカスタマイズできるように、Linux起動の概要を解説します。

おすすめ記事

記事・ニュース一覧