hello worldの表示だけではいまいちですので、いつものASCIIARTベンチマークを動かしてみます。asciiart.basを見ながらasciiart.cを作り、hello.cと同様のビルド環境をつくりました。helloはimage.binに組み込んでフラッシュメモリに書き込むことでプログラムを動かしましたが、毎回image.binを書き込むのも大変です。

uClinuxではRAMディスクがあり、それが/varにmountされています。/tmpもここにあります。ある程度の容量がありますので、小さいプログラムではここに書き込むのがよさそうです。

XMODEMとかZMODEMとかがあると、かっこいいのですが、ここはbusyboxに実装されているuuencode/uudecodeを活用することにしバイナリをテキストにしてシリアルコンソールからアップロードすることにしました。

ビルド環境でのコンパイル

ビルド環境であるubuntuでの作業手順は以下のようになります。

ocha@ubuntu:~/asciiart$ pwd
/home/ocha/asciiart
ocha@ubuntu:~/asciiart$ ls -l 
total 116
-rwxr--r-- 1 ocha ocha  8952 Jun  7 08:49 asciiart
-rw-r--r-- 1 ocha ocha   468 Jun  7 08:49 asciiart.c
-rwxrwxr-x 1 ocha ocha 80105 Jun  7 08:49 asciiart.gdb
-rw-rw-r-- 1 ocha ocha  9212 Jun  7 08:49 asciiart.o
-rw-r--r-- 1 ocha ocha   442 Jun  7 08:16 Makefile
ocha@ubuntu:~/asciiart$ uuencode asciiart asciiart > asciiart.uu
ocha@ubuntu:~/asciiart$ cat asciiart.uu
begin 744 asciiart
M8D9,5`````0```!(```A0```(O```"?````0````(O`````"`````F"]7PX`
M``````````````````````````````!.<4YQ*D5!^0``!M).NX@`(A]P`4Y`
M3G5(YS\Z(&T`.$Z0?O1ZV21M`%`O!4Z26(\H;0!X+SS\4$@7+SP_IW,8+P$O
M`$Z43^\`$"\!+P`F;0!\3I-0CRQ`+P=.DEB/+SQHQI+W+SP_M54=+P$O`$Z4
M3^\`$"\!+P!.DU"/+``H3B8&>``F;0"$+PPO#$Z34(\D`"\#+P-.DU"/(&T`
M3"\`+P).D%"/)&T`E"\.+P!.DE"/)``O#"\,3I)83RZ#+P!.DUA/+H8O`$Z2
   :
   :
M;W0@:6UP;&5M96YT960`````````````````````````````````````````
M````````````````$```````````````````````````````````````````
M`````0```"````````````````````````````````````````````````(`
M```B`````````````````````````````"*L```B@```````````````````
J````````````````````````````````````````````````(G@``")\
`
end
ocha@ubuntu:~/asciiart$

uuencodeでバイナリファイルをテキストファイルに変換します。念のためcatでファイルの内容を確認しました。

uClinuxにアップロード

asciiart.uuをuClinuxのコンソールからアップロードします。アップロードの前に以下のように受信準備をします。

# cd /tmp
# cat > asciiart.uu
(ここでアップロードします)
(アップロードが終わったら CTRL+Dを押します)
# ls -l
-rw-r--r--  1 0        0           12359  May 19 04:02 asciiart.uu
# uudecode asciiart.uu
# chmod 755 asciiart
# ls -l
-rwxr-xr-x  1 0        0            8952  May 19 04:03 asciiart
-rw-r--r--  1 0        0           12359  May 19 04:02 asciiart.uu
#

アップロードが終わったらuudecodeでテキストからバイナリに変換します。

あとはchmodで実行権限をつけることで、asciiartの実行プログラムの準備ができました。

ASCIIARTベンチマークを実行

uClinux上でasciiartを実行してみます。

mc68ez328_dragonone_sbc_uclinux_part11_asciiart.png

いつもの画面が無事表示されました。C言語で書いたのでそこそこ速いです。23秒92でした。

これである程度のプログラムはフラッシュメモリを書き換えなくても動かせることが確認できました。デバックが終わったものはromfsのディレクトリに入れておけば、カーネルの更新タイミングでromfsにも組み込まれます。

現在実験中のDragonOne改 MC68EZ328 SBCのページを作成しました。

製作記事はきょうのかんぱぱにあるのですが、まとめページがあったほうがいいかなと作成しました。COSMACとは全く異なるCPUではありますが、希少なレトロCPUには間違いないので、一旦COSMAC研究会の下に置くことにしました。

トップページからもリンクしていますので、よろしければご覧ください。

dragonone_sbc_solder_pcb4.jpg

uClinuxが動くようになりましたが、自分で作ったアプリケーションを動かすにはどうすればいいのでしょう。Google検索で見つけたuClinux-dist開発者ガイド(アットマークテクノ SUZAKUサイト)を参考にしてアプリケーションを動かしてみました。

作業ディレクトリの作成

ホームディレクトリにuClinux-distがあるとして、ホームディレクトリにmyappという作業用のディレクトリを作成しました。

$ cd
$ mkdir myapp

ハードウェアも問題がなく、カーネルも見た目は問題が無さそうに見えます。残る手としてお手本としているuCsimmが販売されていた2002年当時のuClinuxソースがビルドできる環境を再現してみます。

ビルド環境の構築

ツールチェインが32bitバイナリであることもあり、ホストOSも当時に近くなるように少し古いものを使います。今回はVMware Player上にUbuntu 16.04 LTS 32bitをインストールしたものをビルド環境としました。

当時のソースとツールチェインはInternet Archiveから探して、以下のものをダウンロードしました。

ツールチェインはshで実行するとバイナリが/usr/local配下に展開されるのですが、現在のtailコマンドの仕様が若干変わっていて、そのままでは展開できなかったので39行目のオプションを修正し展開できました。

(修正前) tail +${SKIP} ${SCRIPT} .....

(修正後) tail -n +${SKIP} ${SCRIPT} .....

これで当時のビルド環境が構築できました。

uClinuxのブートプロセスを確認して問題がみつかりませんでした。やはりLinux 2.4.xですのでカーネルは枯れているとおもわれます。そう考えるとファイルシステムがmountできない原因はハードウェア起因か何らかの誤設定である可能性が残ります。

まずはハードウェアに問題がないか再確認します。これまでモニタプログラムを何度も動かしていますが、これは8MBメモリのほんの一部分を使用しているにすぎません。メモリの後半の部分に問題があるとか、フラッシュメモリにうまく書き込まれていないなども考えられます。

DRAMのメモリチェック

メインメモリであるDRAMのチェックを行います。このSBCには8MBのDRAMが実装されています。現在使用しているモニタには起動時にメモリチェック機能が実装されていますが、時間がかかるのでチェックする範囲を狭くしていました。これをモニタの動作の支障のないアドレス$00002000~$007FFFFFをチェックするように設定してみました。

mc68ez328_dragonone_sbc_uclinux_part8_dram_check.png

Passedと表示されるまで、3分01秒かかりました。これは$AAと$55と$00をそれぞれ書き込み一致しなければメモリ不良と判断してFailedと表示されるものです。簡易的なチェックではありますが、問題なさそうです。

前回に続いてinitから呼び出されるprepare_namespace()を探ってみます。

prepare_namespace()

ここから先は慎重にみていきます。 ソースはそんなに長くありません。(不要な部分は削っています)

/*
 * Prepare the namespace - decide what/where to mount, load ramdisks, etc.
 */
void prepare_namespace(void)
{
	int is_floppy = MAJOR(ROOT_DEV) == FLOPPY_MAJOR;
	sys_mkdir("/dev", 0700);
	sys_mkdir("/root", 0700);
	sys_mknod("/dev/console", S_IFCHR|0600, MKDEV(TTYAUX_MAJOR, 1));

	create_dev("/dev/root", ROOT_DEV, NULL);
	if (mount_initrd) {
		if (initrd_load() && ROOT_DEV != MKDEV(RAMDISK_MAJOR, 0)) {
			handle_initrd();
			goto out;
		}
	} else if (is_floppy && rd_doload && rd_load_disk(0))
		ROOT_DEV = MKDEV(RAMDISK_MAJOR, 0);
	mount_root();
out:
	sys_umount("/dev", 0);
	sys_mount(".", "/", NULL, MS_MOVE, NULL);
	sys_chroot(".");
	mount_devfs_fs ();
}

最初に/dev, /rootのディレクトリを作ります。その次は/dev/consoleのデバイスファイルを作ります。TTYAUX_MAJORは5なので、MAJOR=5, MINOR=1のデバイスファイルです。

ここでUbuntuで試しにmountしたromfsの/dev/consoleをみてみると、MAJOR=5, MINOR=1となっていたので一致しています。

mc68ez328_dragonone_sbc_uclinux_part7_dev_console.png

ようやくinitスレッドの起動までできました。これまでたどったソースから、Linuxの起動メッセージの以下の部分まではたどり着いたはずです。

Linux version 2.4.34.5-uc0 (ocha@M715Q-TINY) (gcc version 4.7.2 (GCC) ) #49 Sat May 22 22:05:45 JST 2021
68EZ328 DragonBallEZ support (C) 1999 Rt-Control, Inc
uClinux/MC68EZ328
Flat model support (C) 1998,1999 Kenneth Albanowski, D. Jeff Dionne On node 0 totalpages: 2048 zone(0): 0 pages. zone(1): 2048 pages. zone(2): 0 pages. Kernel command line: Calibrating delay loop... 0.89 BogoMIPS Memory available: 7772k/8064k RAM, 0k/0k ROM (341k kernel code, 186k data) Dentry cache hash table entries: 1024 (order: 1, 8192 bytes) Inode cache hash table entries: 512 (order: 0, 4096 bytes) Mount cache hash table entries: 512 (order: 0, 4096 bytes) Buffer cache hash table entries: 1024 (order: 0, 4096 bytes) Page-cache hash table entries: 2048 (order: 1, 8192 bytes) POSIX conformance testing by UNIFIX

以降はinitスレッドでの処理になります。この中でルートディレクトリのmount処理も行われます。

start_kernelの続きです。ちょうどフリマで購入した参考書が届きました。kernel 2.4対応の詳解LINUXカーネル 第2版です。旧版なので格安というメリットはあります。ただシステムの起動の部分は付録の章となっていてあまり詳しく書かれていませんでした。コードを追うしかなさそうです。

mc68ez328_dragonone_sbc_uclinux_part5_kernel_book.jpg

start_kernelでようやくLinux kernelに入ってきました。細かいところはざっとながしてフィーリングでカーネルのソースを眺めます。

mc68ez328_dragonone_sbc_uclinux_part4_vscode.png

前回 initが読み込めないで停止する状態でしたが、まだ進捗がでていません。

printkで入出力パラメタやerrnoなどを表示して追っていますが、おかしいパラメタやerrnoもみつからずやや手詰まりになっています。

mc68ez328_dragonone_sbc_uclinux_part3_debug.png

そこで、bootからinitの起動までソースをざっと追ってみることにします。

最近のコメント

アセット

  • mc68ez328_dragonone_sbc_uclinux_part11_asciiart.png
  • dragonone_uclinux_startup.png
  • dragonone_sbc_solder_pcb4.jpg
  • dragonball_mc68ez328_cpu.jpg
  • dragonball_mc68ez328_cpu.jpg
  • mc68ez328_dragonone_sbc_uclinux_part10_hello.png
  • mc68ez328_dragonone_sbc_uclinux_part10_hello_run.png
  • mc68ez328_dragonone_sbc_uclinux_part10_images.png
  • mc68ez328_dragonone_sbc_uclinux_part10_romfs_list.png
  • mc68ez328_dragonone_sbc_uclinux_part9_romfs_list.png

カテゴリ

ウェブページ

  • about
  • blogs
  • today
Powered by Movable Type 7.6.0