AMP 設定ガイド
2012 年 10 月 16 日 産業技術総合研究所デジタルヒューマン工学研究センター石綿 陽一
変更履歴
日付 氏名 内容 2012 年 12 月 11 日 石綿 陽一 6.2 節で Ubuntu 12.04 に対応 2012 年 12 月 10 日 石綿 陽一 6.5 節のコマンドを修正1. 概要
AMP (Asymmetric Multi-Processor) では, 物理メモリを分割して各プロセッサに割 り当て, プロセッサ毎に割り当てられたメモリ内で ART-Linux カーネルが一つずつ動 作します. ハードディスクやネットワーク等の周辺デバイスは, 最初に立ち上がる BSP (Boot Strapping Processor) が管理していますが, その他の AP (Application
Processor) の管理に移すことが可能です. BSP と各 AP の間では, 共有メモリ, 仮想 ネットワークデバイス, コンソール用仮想シリアルデバイスで通信できます. 物理メモリの各プロセッサへの割り当ては, BSP カーネルへの引数で指定します. AP カーネルは, BSP のファイルシステムから物理メモリへロードし実行します. AP カ ーネルは, 仮想シリアルデバイスをコンソールとするので, BSP 上のシリアル通信プロ グラムで読み書きします. AP カーネルのルートファイルシステムは, BSP のファイルシ ステム上に用意し, 仮想ネットワークデバイスの NFS を介してマウントします. SMP 機能を持ち, ART-Linux の実時間処理機能を持たない BSP カーネル (非 RT BSP カーネルと呼ぶ) も使用可能です. これはディストリビューションに附属のカーネ ルではなく, AMP 機能を付加したカーネルです. この場合, BSP の SMP 機能が管理 する AP と, AMP 機能が管理して別のカーネルを立ち上げる AP とが区別されます.
1.1 注意
このガイドの中で, #をプロンプトとするコマンドは root ユーザで実行します. %をプ ロンプトとするコマンドは一般ユーザでも実行できます. なお, シェルは bash を仮定し ています.2. プロセッサとメモリの割当
2.1 カーネル引数の書式
apmem=size[kKmMgG][,size[kKmMgG]...] AP に割り当てる低位メモリの領域を指定します. AP が複数あるときには, コンマで区切って複数の領域を指定します. 領域は大きさ size で指定します. 単位はバイトですが, k または K を付け るとキロバイト, m または M を付けるとメガバイト, g または G を付けるとギガ バイトになります. aphighmem=size[kKmMgG][,size[kKmMgG]...] AP に割り当てる高位メモリの領域を指定します. 書式は apmem と同じです. ampshm=size[kKmMgG] 共有メモリに割り当てる低位メモリの領域を指定します. 書式は apmem と 同じですが, 領域は一つしか指定できません. maxcpus=number 非 RT BSP カーネルを使用した場合に, SMP 機能が管理するプロセッサ数 を指定します. SMP 機能が管理しない AP が AMP 機能に使用できるので, 物 理プロセッサ数より小さな値を指定しないと, AMP 機能が使用できません. こ の引数を指定しないと, 全プロセッサを SMP 機能が管理するので, やはり AMP 機能が使用できません.2.2 低位メモリと高位メモリ
i386 用の Linux カーネルは, 物理アドレスの 0x00000000 に仮想アドレスの 0xc0000000 を割り当てるように設定されていることがほとんどです. この 0xc0000000 から 0xffffffff の仮想アドレスが割り当てられる RAM 領域を低 位メモリ (low memory) と呼び, それ以外の RAM 領域を高位メモリ (high memory) と 呼びます. よって, 物理アドレスでは 0x40000000 より下が低位メモリで, それ以上 が高位メモリになります.物理アドレスには, ROM 領域や I/O 領域も割り当てられています. /proc/iomem ファイルにおいて, System RAM に分類されているアドレスが, RAM が割り当てらて れる領域です. BSP カーネルへ apmem, ampshm, そして aphighmem 引数を与える と, System RAM に含まれるように AP に割り当てる RAM 領域が自動的に決められ ます.
AP には十分な大きさの低位メモリを割り当てる必要があります. 小さ過ぎると AP カーネルが立ち上がることができなくなります. 一方 BSP にも十分な大きさの低位メ モリを残す必要があります. 小さ過ぎると BSP カーネルが立ち上がることができなくな ったり, 一部の機能を無効する必要が生じたりします. 高位メモリを AP へ割り当てなくても動作します. BSP カーネルのメモリ管理領域を 小さくすることができるので, 自動的に最高位アドレスから割り当てられます.
2.3 確認
メモリ割り当てが成功したかどうかを, 以下に述べる方法で確認して下さい. N 番目の AP カーネルへの割り当てが成功した場合, /proc/iomem ファイルにお いて, 低位メモリのアドレス内で AMP AP[N]に分類された領域が存在します. 共有メ モリへの割り当てが成功した場合, AMP shared に分類された領域が存在します. BSP カーネルへの引数を指定したにも関わらず, それらの領域が存在しなかった 場合は, 割り当てが失敗しています. カーネル引数を変更して下さい.3. 仮想シリアルデバイス
BSP と各 AP の間には, 仮想シリアルデバイスによる通信が用意されています. BSP カーネルからはデバイスノード/dev/ttyAP[0-]を介して通信できます. AP カーネルはコンソールとして使用します. 通信条件は 115200baud, 8bit, no parity です. また, デバイスノード/dev/ttyBSP0 を介して通信することもできます.4. 仮想ネットワークデバイス
BSP と各 AP の間には, 仮想ネットワークデバイスによる通信が用意されています. Point to point デバイスとして適切に設定することによって, TCP/IP 通信が可能にな ります. BSP カーネルからはネットワークデバイス ap[0-]を介して通信できます. AP カーネルからはネットワークデバイス bsp を介して通信できます.5. 共有メモリ
BSP と全 AP カーネルから読み書きできる共有メモリが用意されています. 実体は, BSP カーネルへの引数 ampshm で設定した物理メモリです. BSP からも AP からも, デバイスノード/dev/ampshm を介して, /dev/mem と同 様に読み書きすることができます. なお, カーネルは排他制御を行いませんので, アプ リケーションが適切に処理する必要があります.6. AP 用ルートファイルシステム
AP カーネルのルートファイルシステムは, BSP のファイルシステム上に用意し, 仮 想ネットワークデバイスの NFS を介してマウントします. 以下には BSP 上で ${APROOT}ディレクトリに作成し, AP カーネルにエクスポートする設定手順を示しま す. なお, AP 仮想ネットワークデバイスに割り当てる IP アドレスを${APIP}, ホスト名 を${APNAME}とします.6.1 AP ブート・コマンドのインストール
AP ブート・コマンドのバイナリ・パッケージをインストールします. ${DATE}はリリー ス日時に基くシリアル番号ですので, 最新の番号のものを使用します. # dpkg -i apboot-1.0_${DATE}_i386.deb6.2 作成
# mkdir -p ${APROOT}# debootstrap ${SUIT} ${APROOT}
${SUIT}は, Ubuntu 10.04 の場合は lucid で, Ubuntu 12.04 の場合は precise です.
6.3 エクスポート
# echo ${APIP} ${APNAME} >> /etc/hosts
# echo ${APROOT} ${APNAME}\(rw,no_root_squash,subtree_check\) >> \ /etc/exports # exportfs -a
6.4 ルータの設定
AP から外部ネットワークに TCP/IP 接続するためには, BSP でルーティングを行う 必要があります. 仮想ネットワークデバイスの BSP 側 IP アドレスを${BSPIP}, BSP の外部接続用ネットワーク・インターフェースを${ETH}とします.# cd /etc/network # cat >> interfaces iface ap0 inet static address ${BSPIP}
netmask 255.255.255.255 pointopoint ${APIP}
up iptables -t nat -A POSTROUTING -s ${APIP} -o ${ETH} -j MASQUERADE
down iptables -t nat -D POSTROUTING -s ${APIP} -o ${ETH} -j MASQUERADE # cd .. # sed -i 's/^#net\.ipv4\.ip_forward/net.ipv4.ip_forward/' \ sysctl.conf 6 行目は point-o-point であり, point-to-point ではないので注意して下 さい.
6.5 AP カーネルのインストール
インストールした BSP カーネル・パッケージが art-generic の場合, ${FLAVOR}は generic です. generic-pae, または art-generic-pae-wo-art の場合, art-generic-pae です. ${YYYYMMDD}はカーネル・パッケージのリリース番号で, BSP カーネル・パッケー ジと同じである必要があります. # dpkg -i --root=${APROOT} \ ap-linux-image-2.6.32-${FLAVOR}_${YYYYMMDD}_i386.deb \ ap-linux-headers-2.6.32-${FLAVOR}_${YYYYMMDD}_i386.deb6.6 整備
1. ルートディレクトリを移動します. # chroot ${APROOT} 2. root にパスワードを設定します. # passwd 3. ホスト名を設定します.4. /etc/default/console-setup 中の ACTIVE_CONSOLES をコメントア ウトします.
# cd /etc/default
# sed -i s/^ACTIVE_CONSOLES/#ACTIVE_CONSOLES/ console-setup
5. 仮想シリアル端末からのログインを可能にします.
# cd /etc/init
# sed s/tty1/ttyBSP0/ tty1.conf > ttyBSP0.conf # rm tty?.conf
# cd ..
# sed -i s/ttyS0/ttyBSP0/ securetty
6. ureadahead を停止します. # cd /etc/init # mv ureadahead.conf ureadahead.conf.bak # mv ureadahead-other.conf ureadahead-other.conf.bak