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.deb 6.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} は art-generic です. art-generic-pae, または artgeneric-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.deb 6.6 整備 1. ルートディレクトリを移動します. # chroot ${APROOT} 2. root にパスワードを設定します. # passwd 3. ホスト名を設定します. # echo $(hostname)-${apname} > /etc/hostname
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 7. AP のブート 次の手順によって, 6.5 でインストールしたカーネルが AP 上で立上り, 仮想シリアルデバイスのコンソールにログインメッセージが表示されます. # ifup ap0 # apboot ${APROOT}/boot/vmlinuz-2.6.32-${FLAVOR} rw \ ip=${apip}:${bspip}:${bspip}:::bsp:p2p \ nfsroot=${bspip}:${aproot},nolock AP が複数ある場合には, apload コマンドの -n AP オプションによって, ブートする AP を指定することができます. AP は 0 から始まる AP の番号です. BSP カーネルが SMP 対応で複数の CPU を制御している場合でも 0 から始まります.