メッセージ欄

分類 【NetBSD】 で検索

一覧で表示する

rpi_start.Sを読む (第3回)
2013/11/04(月) 22:16 NetBSD はてブ情報 はてブに登録 はてブ数

続きです。

まずは、コメントです。
    132 	/*
    133 	 * Set up a preliminary mapping in the MMU to allow us to run
    134 	 * at KERNEL_BASE with caches on.
    135 	 */
キャッシュをONにしてKERNEL_BASEで動かすため、MMUに準備的なマッピングをセットアップします、とでも訳すのでしょうか? なんのこっちゃ。
MMUに最低限の準備をします、ぐらいにとらえておけばよいのでしょうかねぇ。

さて、今回のメインはこちらです。
    136 	/* Build page table from scratch */
    137 	ldr	r0, Ltemp_l1_table	/* The page table address - entered into TTB later */
    138 	mov	r1, r0			/* Start address to clear memory. */
    139 	/* Zero the entire table so all virtual addresses are invalid. */
    140 	mov	r2, #L1_TABLE_SIZE	/* in bytes */
    141 	mov	r3, #0
    142 	mov	r4, r3
    143 	mov	r5, r3
    144 	mov	r6, r3
    145 	mov	r7, r3
    146 	mov	r8, r3
    147 	mov	r10, r3
    148 	mov	r11, r3
    149 1:	stmia	r1!, {r3-r8,r10-r11}
    150 	stmia	r1!, {r3-r8,r10-r11}
    151 	stmia	r1!, {r3-r8,r10-r11}
    152 	stmia	r1!, {r3-r8,r10-r11}
    153 	subs	r2, r2, #(4 * 4 * 8)	/* bytes per loop */
    154 	bne	1b
ちょっと長いですが、似た命令が多いので、大丈夫でしょう。
    136 	/* Build page table from scratch */
ページテーブルをスクラッチからつくりますというコメントです。なるほど、以降の処理はページテーブルに関する処理というわけですね。

先に進みます。
    137 	ldr	r0, Ltemp_l1_table	/* The page table address - entered into TTB later */
Ltemp_l1_tableのアドレスをr0にロードします。TTBとはTransration Table Baseの略ですね。Ltemp_l1_tableのところは、
    258 Ltemp_l1_table:
    259 	/* Put the temporary L1 translation table just below the kernel. */
    260 	.word	0x4000
と書かれています。kernelのすぐ後ろにテンポラリのL1変換テーブルを置く、と読めます。0x4000の大きさのテーブルが確保されているってことですかね。

まぁ、とにかくL1変換テーブルの先頭をr0に代入したという感じです。

次に進みます。
    138 	mov	r1, r0			/* Start address to clear memory. */
これは、先ほどのr0つまりL1変換テーブルの先頭をr1にも代入しています。
あとでr0を使うので温存しておいて、r1のほうを作業用に使うという感じですかね。

次に進みます。
    139 	/* Zero the entire table so all virtual addresses are invalid. */
テーブル全体をゼロにして、すべての仮想アドレスをinvalidにします。というコメントです。なんだかよくわかりませんが、ゼロにするようです。
    140 	mov	r2, #L1_TABLE_SIZE	/* in bytes */
L1_TABLE_SIZEはarch/arm/include/arm32/pte.hで
  #define    L1_TABLE_SIZE    0x4000        /* 16K */
と定義されていますので、
  r2 = 0x4000; /* L1_TABLE_SIZE */
ということになりますね。そういえば、さっきのL1_temp_tableは
    260 	.word	0x4000
でしたね。なるほど、関係ありそうです。

先に進みましょう。
    141 	mov	r3, #0
    142 	mov	r4, r3
    143 	mov	r5, r3
    144 	mov	r6, r3
    145 	mov	r7, r3
    146 	mov	r8, r3
    147 	mov	r10, r3
    148 	mov	r11, r3
レジスタr3に0を代入し、それをレジスタr4, r5, r6, r7, r8, r10, r11に代入しています。つまり、8つのレジスタをぜんぶゼロにしているようです。

ここから、ループに入ります。
    149 1:	stmia	r1!, {r3-r8,r10-r11}
    150 	stmia	r1!, {r3-r8,r10-r11}
    151 	stmia	r1!, {r3-r8,r10-r11}
    152 	stmia	r1!, {r3-r8,r10-r11}
stmiaです。stmはレジスタ-メモリ転送命令の複数版で、iaはIncrement Afterということで、メモリアクセス後にポインタを増やす、でしたね。

ということで、r1つまりL1_temp_tableの先頭からゼロを代入した8つのレジスタをどんどんメモリに転送していきます。

次に進みます。
    153 	subs	r2, r2, #(4 * 4 * 8)	/* bytes per loop */
subsのsubは減算命令です。subsの後ろのsはステータスレジスタを更新するためののsです。

L1_TABLE_SIZE(つまり0x4000)が格納されたr2から4*4*8を引きます。レジスタは32ビットなので4, stmiaが4回なので4, レジスタは8個転送されているので4*4*8ですね。

次に進みます。
    154 	bne	1b
bneのbは分岐命令です。先のsubsの末尾のsで更新されたステータスフラグをみて、分岐します。見るステータスフラグはZ、つまりゼロかどうかです。

bneのneはNot Equalつまりbneはr2がゼロでなければ1bに飛べと言っています。1bとは149行目の1:というラベルです。1bのbはbackのbでしょうか?

今回の処理をCっぽく書いてみると次のような感じでしょうか。
  r0 = &(Ltemp_l1_table);
  r1 = r0;
  r2 = 0x4000; /* L1_TABLE_SIZE */
  r3 = 0;
  r4 = r3;
  r5 = r3;
  r6 = r3;
  r7 = r3;
  r8 = r3;
  r10 = r3;
  r11 = r3;
  
  do {
    for (int i = 0; i < 4; i++) {
      *(r1++) = r3;
      *(r1++) = r4;
      *(r1++) = r5;
      *(r1++) = r6;
      *(r1++) = r7;
      *(r1++) = r8;
      *(r1++) = r10;
      *(r1++) = r11;
    }
    
    r2 -= (4 * 4 * 8);
  
  } while (r2 != 0)
素朴に、r3に0をセットして0x1000回のループにすればよいと思ったのですが、stmiaで8レジスタ一気に転送して、0x4000/(4*4*8)回のループのほうが効率的なんでしょうね。

さてこれで、Ltemp_l1_tableが全部ゼロクリアされた状態になりました。

rpi_start.Sを読む (第2回)
2013/11/04(月) 21:21 NetBSD はてブ情報 はてブに登録 はてブ数

つづきです。

今回読むのはここです。
    127 	mrs	r0, cpsr
    128 	bic	r0, r0, #PSR_MODE
    129 	orr	r0, r0, #(I32_bit | F32_bit | PSR_SVC32_MODE)
    130 	msr	cpsr, r0
まず127行目。
    127 	mrs	r0, cpsr
mrsはステータスレジスタのシステムコールです。mrsはロード、msrはストア。
read status, store registerの頭文字でしょうか。

cpsrは現在のステータスレジスタです(Current Program Status Register)。

現在のステータスレジスタをr0にロードする、ということですね。

次に進みます。
    128 	bic	r0, r0, #PSR_MODE
bicはビットクリアです。#PSR_MODEはarm/include/armreg.hで定義されていて下位5ビットに1が立っています。
  #define PSR_MODE    0x0000001f    /* mode mask */
ということで、r0(ステータスレジスタと同値)の下位5ビットをクリアする、ということですね。

次に進みます。
    129 	orr	r0, r0, #(I32_bit | F32_bit | PSR_SVC32_MODE)
orrは文字どおりorつまり論理和をとります。

先ほど下位5ビットをクリアしたr0にビットを立てています。I32_bit, F32_bit,PSR_SVC32_MODEのそれぞれです。これまたarm/include/armreg.hに定義されています。
     62 #define I32_bit (1 << 7)	/* IRQ disable */
     63 #define F32_bit (1 << 6)	/* FIQ disable */
     77 #define PSR_SVC32_MODE	0x00000013
コメントから想像するに、割り込みを禁止するビットのようですね。
    130 	msr	cpsr, r0
最初のmrs(リード)に対するmsr(ストア)ですね。ここまでr0を操作してきた内容をステータスレジスタにストアしています。

ということで、ここでは割り込みを禁止する一連の処理をしていたようです。

rpi_start.Sを読む (第1回)
2013/11/04(月) 20:47 NetBSD はてブ情報 はてブに登録 はてブ数

ARMアセンブリ言語を勉強するため、CPUのスタートアップを題材にソースコードを読んでみようと思います。

といっても、ARMアセンブリ言語の知識は皆無なので、Webで一命令ずつ調べながら、わからないところは大胆に飛ばしながら読んでいくという無責任企画です。

今話題のRaspberry Piをターゲットに、少しづつ勉強していきます。

src/sys/arch/evbarm/rpi/rpi_start.Sの1.7がターゲットになります。コメント含めて328行の小さなプログラムですが、自分にとっては楽しめそうです。

さて、はじめましょう。

一番最初に実行されるエントリーポイントから読んでいきます。ソースの最初の部分は少し飛ばして、122行目からスタートです。
    122 	.global	_C_LABEL(rpi_start)
    123 _C_LABEL(rpi_start):
ラベルですね。_CとついているとCのプログラムから呼べるんでしたっけ? 先に進みましょう。
    124 	adr	r8, rpi_boot_regs
いきなりのadrはGNU asの疑似命令です。指定したレジスタにラベル(ここだとrpi_boot_regs)のアドレスをロードします。プログラムカウンタr15にadd or subして実現されているそうです。r15なんて書かれてないから不思議な感じですね。

rpi_boot_regsには
    327 rpi_boot_regs:
    328 	.space 4 * 4
と書かれています。ブート用のレジスタ(?)の領域を確保ということかな? 4*4なので32bitのアドレスを4つ確保と読むのかな。

ということで、ラベルrpi_boot_regsのアドレスをr8に読み込むという命令ですね。

adrという疑似命令は、ARMでは命令の長さが4バイトに固定されるため、32ビット(4バイト)の整数 やラベルの値(メモリアドレス)を直接レジスタに転送することができません。 とのこと。

さて次に進みます。
    125 	stmia	r8!, {r0-r3}
stmはレジスタ-メモリ転送命令の複数版です。stmはストアマルチ、ldmはロードマルチかな。iaはIncrement Afterということで、メモリアクセス後にポインタを増やす。つまり、以下のようなイメージでしょうか。
  addr = r8;
  r0 = *(addr++);
  r1 = *(addr++);
  r2 = *(addr++);
  r3 = *(addr++);
 r8!の!は最後にr8に書き戻すという意味なので
  r8 = addr;
ということなのでしょう。

rpi_boot_regがr0からr3に割り当てられたということですね。

しかし、rpi_boot_regは、どこにも使っていそうな場所がありませんね。うーん。

PostgreSQL 9.3.1でレプリケーション(ただしNetBSD)
2013/11/03(日) 19:03 NetBSD はてブ情報 はてブに登録 はてブ数

PostgreSQLのコア機能にレプリケーションが実装されてずいぶん経過し、機能も着々と増強されています。

そんなレプリケーション機能をNetBSDユーザとしてあれこれ使ってみました。
  • ビッグエンディアンマシンとリトルエンディアンマシンでレプリケーションできるのか?
  • 32bitアーキテクチャと64bitアーキテクチャでレプリケーションできるのか?
  • Intel以外のアーキテクチャでレプリケーションできるのか?
以上の三本でお送りします。

ビッグエンディアンマシンとリトルエンディアンマシンでレプリケーションできるのか?
結論から言うと、できません。

ちょっと詳しい人なら、そりゃそうだろうなと思うはずです。
ただ、どのレベルで動かないか気になりますよね!

では、実機で検証してみましょう。

まず、ビッグエンディアンマシンを用意します。今回はMac mini (PPC版)を使いました。SPARCマシンを引っ張り出すのも良いでしょう。

次にリトルエンディアンマシンを用意します。ここでは、USL-5Pを使います。USL-5PはCPUにSH4を搭載しています。ここは国産CPUアーキテクチャに頑張っていただきましょう。

PostgreSQLのインストールは大変簡単で、pkgsrcを導入してpkgsrc/databases/postgresql93-serverでmake installと打つだけです。ただし、USL-5PはCPU 266MHz、メモリ64MB、ストレージがCFというスペックですので、distccなどを使ってコンパイルを進めたほうが良いでしょう。セットアップしてコンパイルするのに丸々一日程度を見込んでおけばよいと思います。

今回は、Mac miniをマスター、USL-5Pをスレーブとして起動します。

すると、次のようなエラーを出力してスレーブ側が起動しません。
FATAL:  database files are incompatible with server
DETAIL:  The database cluster was initialized with PG_CONTROL_VERSION -1459421184 (0xa9030000), but the server was compiled with PG_CONTROL_VERSION 937 (0x000003a9).
HINT:  This could be a problem of mismatched byte ordering.  It looks like you need to initdb.
なるほど、PG_CONTROL_VERSIONが(0xa9030000)と(0x000003a9)ですから、まさにエンディアン依存していますね。

近所のPostgreSQLコミッターに聞いたところ、このバージョンチェックを外したとしても、さまざまな場所でエンディアン依存しているから、クイックハックでどうにかできる代物ではない、とのコメントをいただきました。

ビッグエンディアンマシンを多く抱えるNetBSDユーザとしては、残念な結果となりました。
32bitアーキテクチャと64bitアーキテクチャでレプリケーションできるのか?
結論から言うとできません(二回目)。

ちょっと詳しい人なら、そりゃそうだろうなと思うはずです。
ただ、どのレベルで動かないか気になりますよね!(二回目)

では、実機で検証してみましょう。

64bitアーキテクチャとしてVMwareにNetBSD/amd64をインストールして32bitアーキテクチャであるUSL-5Pとレプリケーションさせてみます。

これまた、スレーブ起動時に次のようなエラーが表示されます。
FATAL:  incorrect checksum in control file
エラーメッセージで検索すると、64bitと32bitの違いに触れたページがいくつかヒットします。多くの場合は、マシンの移行に伴うもののようですが、レプリケーションも同様の理由で失敗するのでしょう。

エンディアンはともかくとして、チェックサムぐらいは同じにしてくれればいいのになとは思ったりするところです。

Intel以外のアーキテクチャでレプリケーションできるのか?
結論から言うと、できます。

ただし、先の例にもあるとおり、エンディアンが同じであったり、CPUのビット長が同じであるという前提条件を満たす必要があります。

今回は、32bitでリトルエンディアンをいくつかテストしました。

成功した組合せを列挙しておきます。
  • NetBSD/i386 on VMware(32bit)とNetBSD/landisk on USL-5P
  • NetBSD/i386 on VMware(32bit)とNetBSD/evbarm on Raspberry PI
Raspberry PIもPostgreSQLのコンパイルには時間がかかるので覚悟が必要ですね。
まとめ
PostgreSQLのコア機能によるレプリケーションを行う際には、エンディアンやビット長に注意する必要があることがわかりました。

しかし、エンディアンやビット長が違うマシン間でレプリケーションを行うことができないかというとそうではなく、マシン間でSQLを飛ばすタイプのSlony-Iを採用するなど、広い視点で検討を行う必要があるといえます。

また、今回の趣旨とは外れますが、PostgreSQLはIntel系のCPU以外でも問題なく動作することが確認できました。PowerPCでもARMでもSuperHでも動作しましたからね。今回は時間切れでMIPSは試せず、無念です。

なお、今回の実機検証ではNetBSDの6.1.2を使いました。

NetBSD/evbarm (APC8750) 2013/10/24
2013/10/24(木) 26:38 NetBSD はてブ情報 はてブに登録 はてブ数

やっとここまで来ました!
WMT # set serverip 192.168.0.10; tftpboot 8000; go 8000
EEP-less strapping = TRUE
*** Warning: no boot file name; using 'C0A80002.img'
TFTP from server 192.168.0.10; our IP address is 192.168.0.2
Filename 'C0A80002.img'.
Load address: 0x8000
Loading: #################################################################
         ###########################################T ######################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         ################################T #################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         ####################T #############################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #####################################################T ############
         #################################################################
         ##################
done
Bytes transferred = 6747520 (66f580 hex)
## Starting application at 0x00008000 ...
00008328
NetBSD
00000000 00000000 0088a74b 00000412
00000000 00000412 00000008 00000412
c0000000 00000000 0088a74b 0000041e
00003000 0000041e 00000008 0000041e
fe000000 d8000000 010fffff 00000412
00003f80 d8000412 00000010 00000412
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
NS
NetBSD/evbarm (APC) booting ...
initarm: Configuring system ...
arm32_bootmem_init: memstart=0, memsize=0x20000000, kernelstart=0x8000
arm32_bootmem_init: kernelend=0x68b000
arm32_bootmem_init: adding 129397 free pages: [0x68b000..0x1fffffff] (VA 0xc068b000)
arm32_bootmem_init: adding 8 free pages: [0..0x7fff] (VA 0xc0000000)
arm32_kernel_vm_init: 2 L2 pages are needed to map 0x6b6000 kernel bytes
arm32_kernel_vm_init: allocating page tables for vectoradd_pages: adding pv 0xc0677cac (pa 0x68b000, va 0xc068b000, 1 pages) at tail
 kerneladd_pages: appending pv 0xc06826ec (0x68c000..0x68ffff) to 0x68b000..0x68bfff
add_pages: appending pv 0xc0677f30 (0x690000..0x690fff) to 0x68b000..0x68ffff
add_pages: appending pv 0xc0677f44 (0x691000..0x691fff) to 0x68b000..0x690fff
 vmadd_pages: appending pv 0xc0677f58 (0x692000..0x692fff) to 0x68b000..0x691fff
add_pages: appending pv 0xc0677f6c (0x693000..0x693fff) to 0x68b000..0x692fff
add_pages: appending pv 0xc0677f80 (0x694000..0x694fff) to 0x68b000..0x693fff
add_pages: appending pv 0xc0677f94 (0x695000..0x695fff) to 0x68b000..0x694fff
add_pages: appending pv 0xc0677fa8 (0x696000..0x696fff) to 0x68b000..0x695fff
add_pages: appending pv 0xc0677fbc (0x697000..0x697fff) to 0x68b000..0x696fff
add_pages: appending pv 0xc0677fd0 (0x698000..0x698fff) to 0x68b000..0x697fff
add_pages: appending pv 0xc0677fe4 (0x699000..0x699fff) to 0x68b000..0x698fff
arm32_kernel_vm_init: allocating stacks
add_pages: appending pv 0xc0678230 (0x69a000..0x69afff) to 0x68b000..0x699fff
add_pages: appending pv 0xc0678244 (0x69b000..0x69bfff) to 0x68b000..0x69afff
add_pages: appending pv 0xc0678258 (0x69c000..0x69cfff) to 0x68b000..0x69bfff
add_pages: appending pv 0xc067826c (0x69d000..0x69dfff) to 0x68b000..0x69cfff
add_pages: appending pv 0xc0678280 (0x69e000..0x69ffff) to 0x68b000..0x69dfff
add_pages: appending pv 0xc067821c (0x6a0000..0x6a1fff) to 0x68b000..0x69ffff
add_pages: appending pv 0xc0677d24 (0x6a2000..0x6a5fff) to 0x68b000..0x6a1fff
Creating L1 page table at 0x0068c000
arm32_kernel_vm_init: adding L2 pt (VA 0xc068b000, PA 0x68b000) for VA 0xffff0000
 (vectors)arm32_kernel_vm_init: adding L2 pt (VA 0xc0690000, PA 0x690000) for VA 0xc0000000 (kernel)
arm32_kernel_vm_init: adding L2 pt (VA 0xc0691000, PA 0x691000) for VA 0xc0400000 (kernel)
arm32_kernel_vm_init: adding L2 pt (VA 0xc0692000, PA 0x692000) for VA 0xc1000000 (vm)
arm32_kernel_vm_init: adding L2 pt (VA 0xc0693000, PA 0x693000) for VA 0xc1400000 (vm)
arm32_kernel_vm_init: adding L2 pt (VA 0xc0694000, PA 0x694000) for VA 0xc1800000 (vm)
arm32_kernel_vm_init: adding L2 pt (VA 0xc0695000, PA 0x695000) for VA 0xc1c00000 (vm)
arm32_kernel_vm_init: adding L2 pt (VA 0xc0696000, PA 0x696000) for VA 0xc2000000 (vm)
arm32_kernel_vm_init: adding L2 pt (VA 0xc0697000, PA 0x697000) for VA 0xc2400000 (vm)
arm32_kernel_vm_init: adding L2 pt (VA 0xc0698000, PA 0x698000) for VA 0xc2800000 (vm)
arm32_kernel_vm_init: adding L2 pt (VA 0xc0699000, PA 0x699000) for VA 0xc2c00000 (vm)
Mapping kernel
arm32_kernel_vm_init: adding chunk for kernel text 0x8000..0x1cffff (VA 0xc0008000)
add_pages: adding pv 0xc0677c98 (pa 0x8000, va 0xc0008000, 456 pages) before pa 0x68b000
arm32_kernel_vm_init: adding chunk for kernel data/bss 0x1d0000..0x68afff (VA 0xc01d0000)
add_pages: appending pv 0xc0677cfc (0x1d0000..0x68afff) to 0x8000..0x1cffff
add_pages: merging pv 0xc0677cac (0x68b000..0x6a5fff) to 0x8000..0x68afff
Listing Chunks
arm32_kernel_vm_init: pv 0xc0677c98: chunk VA 0xc0008000..0xc06a5fff (PA 0x8000, prot 3, cache 1)

Mapping Chunks
arm32_kernel_vm_init: mapping last chunk VA 0xc0008000..0xc06a5fff (PA 0x8000, prot 3, cache 1)
pmap_map_chunk: pa=0x8000 va=0xc0008000 size=0x69e000 resid=0x69e000 prot=0x3 cache=1
PPPPPPPPLLLLLLLLLLLLLLLSSSSSLLLLLLLLLLPPPPPP
devmap: d8000000 -> d8ffffff @ fe000000
pmap_map_chunk: pa=0xd8000000 va=0xfe000000 size=0x1000000 resid=0x1000000 prot=0x3 cache=0
SSSSSSSSSSSSSSSS
                             Physical              Virtual        Num
                       Starting    Ending    Starting    Ending   Pages
               SDRAM: 0x00000000 0x1fffffff 0xc0000000 0xdfffffff 131072
        text section: 0x00008000 0x001cffff 0xc0008000 0xc01cffff 456
        data section: 0x001d0000 0x00677580 0xc01d0000 0xc0677580 1192
         bss section: 0x00677580 0x0068a74c 0xc0677580 0xc068a74c 20
   L1 page directory: 0x0068c000 0x0068ffff 0xc068c000 0xc068ffff 4
   ABT stack (CPU 0): 0x0069a000 0x0069afff 0xc069a000 0xc069afff 1
   FIQ stack (CPU 0): 0x0069b000 0x0069bfff 0xc069b000 0xc069bfff 1
   IRQ stack (CPU 0): 0x0069c000 0x0069cfff 0xc069c000 0xc069cfff 1
   UND stack (CPU 0): 0x0069d000 0x0069dfff 0xc069d000 0xc069dfff 1
  IDLE stack (CPU 0): 0x0069e000 0x0069ffff 0xc069e000 0xc069ffff 2
           SVC stack: 0x006a0000 0x006a1fff 0xc06a0000 0xc06a1fff 2
      Message Buffer: 0x006a2000 0x006a5fff 0xc06a2000 0xc06a5fff 4
   Exception Vectors: 0x006a6000 0x006a6fff 0xffff0000 0xffff0fff 1
         Free Memory: 0x006a7000 0x1fffffff                       129369
         Free Memory: 0x00000000 0x00007fff                       8
switching to new L1 page table @0x68c000...TTBR0=0x68c000 OK
done.
nfreeblocks = 2, free_pages = 129377 (0x1f961)
bootstrap done.
vectors 0xffff0000
init subsystems: stacks vectors undefined page pmap_physload pmap [ Kernel symbol table missing! ]
done.
Loaded initial symtab at 0xc01d4360, strtab at 0xc01f42a0, # entries 8165
pmap_postinit: Allocated 35 static L1 descriptor tables
Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
    2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013
    The NetBSD Foundation, Inc.  All rights reserved.
Copyright (c) 1982, 1986, 1989, 1991, 1993
    The Regents of the University of California.  All rights reserved.

NetBSD 6.99.24 (APC) #5: Thu Oct 24 17:27:18 UTC 2013
        root@oct.localdomain:/usr/obj/sys/arch/evbarm/compile/APC
total memory = 512 MB
avail memory = 495 MB
sysctl_createv: sysctl_create(machine_arch) returned 17
mainbus0 (root)
cpu0 at mainbus0 core 0: ARM1176JZ-S r0p7 (ARM11J V6ZK core)
cpu0: DC enabled IC enabled WB enabled LABT
cpu0: 16KB/32B 4-way L1 Instruction cache
cpu0: 16KB/32B 4-way write-back-locking-C L1 Data cache
vfp0 at cpu0: VFP11
obio0 at mainbus0
wmicu0 at obio0 addr 0xd8140000-0xd814ffff
wmtmr0 at obio0 addr 0xd8100000-0xd810ffff intr 48 : WMT System Timer
wmtcom0 at obio0 addr 0xd8200000-0xd820ffff intr 32 : WMT UART
rn_init: radix functions require max_keylen be set
boot device: <unknown>
root on md0a dumps on md0b
mountroot: trying nfs...
mountroot: trying msdos...
mountroot: trying ffs...
root file system type: ffs
WARNING: no TOD clock present
WARNING: using filesystem time
WARNING: CHECK AND RESET THE DATE!
init: copying out flags `-s' 3
init: copying out path `/sbin/init' 11
erase ^?, werase ^W, kill ^U, intr ^C

# ls /
.profile        kern            sbin            sysinstmsgs.fr  usr
bin             libexec         sysinst         sysinstmsgs.pl  var
dev             mnt             sysinstmsgs.de  targetroot
etc             mnt2            sysinstmsgs.es  tmp
# ls /usr/sbin
chroot
# ls /usr/bin
cu        gunzip    gzip      more      sed       tip
ftp       gzcat     less      progress  tar       tset
# ls /bin
cat   chmod dd    ed    ls    mv    pwd   rmdir stty
chgrp cp    df    ln    mkdir pax   rm    sh    sync
# echo hello > /foo.txt
# cat /foo.txt
hello
#