Linux は 8 ビット MCU 上で実行できますか?

WBOY
リリース: 2024-02-05 18:18:02
転載
745 人が閲覧しました

初心者がマイクロコントローラー フォーラムで、自分の作っているちっぽけな 8 ビット マイクロコントローラーで Linux を実行できるかどうか尋ねているのをよく見かけます。こうした質問はしばしば爆笑を引き起こします。 Linux フォーラムでは、Linux を実行するための最小要件は何ですかと尋ねる人をよく見かけます。一般的な答えは、Linux ではカーネルを満たすために 32 ビット アーキテクチャと MMU (メモリ管理ユニット)、および少なくとも 1MB の RAM が必要であるということです。

しかし、このプロジェクトは、これらの認識を打ち破ることを目的としています (そして打ち破ることに成功しています)。下の写真に示されている開発ボードは ATmega1284P に基づいています。私(外国人)もATmega644aをベースにした開発ボードを作り、これも成功しました。この開発ボードは別のプロセッサを使用せず、Linux 2.6.34 カーネルを起動できます。実際、X (起動を待つ気がある場合) や gnome デスクトップ環境を含む完全な Ubuntu スタックを実行することもできます。

Linux是否能在 8 位 MCU 上运行?

▍RAM (ランダム アクセス メモリ)

はい、その通りです。Linux を完全にインストールするには、数メガバイトの RAM と MMU を備えた 32 ビット CPU が必要です。このプロジェクトにはすべてが含まれています。まずはRAMにアクセスしてみましょう。ご覧のとおり、回路にはアンティークの 30 ピン SIMM メモリ モジュールが含まれています。これらは、80286 ベースの PC がかつて使用していたものです。これはATmegaとインターフェイスしており、仕様に従ってそれにアクセスしてリフレッシュするコードを作成します(SDRAMはデータの損失を避けるために一定速度のリフレッシュが必要です)。

どれくらい速いですか?リフレッシュ割り込みは 62 ミリ秒ごとに発生し、1.5 ミリ秒かかるため、CPU の占有率は 3% 未満です。プログラミングを容易にするために、一度に 1 バイトずつ RAM にアクセスします。これにより生成される最大帯域幅は約 300KBps です。

Linux是否能在 8 位 MCU 上运行?

***▍*ストレージ

RAM がスリープ状態で動作するには、2 つのことに対処する必要があります。ストレージは、解決するのがそれほど難しい問題ではありません。私のプロジェクトでも SPI を使用して SD カードを操作するのは非常に簡単です。 1 GB の SD カードでも問題なく動作しますが、この特定のファイル システム (Ubuntu Jaunty) には 512 MB で十分です。

ATmega にはハードウェア SPI モジュールがありますが、何らかの理由で非常にスムーズに動作しなかったので、インターフェイスをビット ストリップしました。それでも十分な量です - 約 200KBps。また、これはプロジェクトにとって完全に理にかなっています。追加のハードウェア モジュールを使用せずに、十分なピンを備えた任意のマイクロコントローラーに実装できます。

***▍*CPU (中央処理装置)

残るのは、32 ビット CPU と MMU の要件だけです。ただし、AVR には MMU がなく、8 ビットです。この困難を克服するために、私は ARM エミュレータを作成しました。 ARM は私が最もよく知っているアーキテクチャであり、ARM 用のエミュレータを快適に作成できるほど単純です。なぜ移植ではなく新たに作成するのでしょうか?

まあ、他人のコードを移植するのは面白くありませんし、エミュレータを 8 ビット デバイスに簡単に移植する文書も見たことがありません。理由の 1 つは、AVR コンパイラが整数の処理に 16 ビットを要求するため、単純な "(1 Linux是否能在 8 位 MCU 上运行?

***▍*その他の機能

ボードはシリアル ポートを通じて現実世界と通信します。現在、シリアル ポート経由で私の PC 上で実行されている minicom に接続されていますが、テストできる別の接続としては、キーボードとキャラクター LCD を回路に接続し、完全にスタンドアロンにすることが考えられます。ボード上にはさらに 2 つの LED があります。これらは SD カードへのアクセスを示します。 1 つは読み取り操作を表し、もう 1 つは書き込み操作を表します。基板上にはボタンもあります。 1 秒間押し続けると、シリアル ポートがエミュレートされた CPU の現在有効な速度から外れます。 AVR の主な周波数は 24MHz (元の 20MHz をわずかに上回るオーバークロック) です。

***▍*どれくらい速いですか?

uARM にはレート デーモンがありません。 BASH プロンプト (「init=/bin/bash」カーネル コマンド ライン) で起動するのに約 2 時間かかりました。その後、Ubuntu 全体を起動する (「exec init」してログインする) までに 4 時間以上かかりました。 X の起動には時間がかかります。エミュレートされた CPU の実効速度は約 6.5KHz で、これは、わずか 8 ビットのマイクロコントローラー上で 32 ビット CPU と MMU をエミュレートする場合に期待される速度とほぼ同じです。奇妙なことに、一度起動すると、システムはある程度使用できるようになります。コマンドを入力すると、1 分以内に応答が得られます。つまり実際に使えるということです。たとえば、今日は SD カードをフォーマットするために使用しました。これは間違いなく最速ではありませんが、おそらく最も安く、最も遅く、手作業で組み立てるのが最も簡単で、部品点数が最も少なく、最もローエンドの Linux PC であると感じています。回路基板は、プリント基板 (PCB) を使用せずに、ワイヤーを使用して手はんだ付けされます。

***▍*エミュレータの詳細は?

エミュレータは非常にモジュール化されているため、他の SoC (システム オン チップ) やハードウェア構成をエミュレートするように拡張することができます。シミュレートされた CPU は ARMv5TE です。少し前に、ARMv6 のサポートに取り組み始めましたが、(コードからわかるように) 必要性が低いため、まだ完了していません。シミュレートされた SoC は PXA255 です。

モジュール設計により、必要に応じて、SoC.c ファイルを置き換えて、同じ ARMv5TE コアを使用して完全な新しい SoC をコンパイルしたり、コアを置き換えたり、ペリフェラルを置き換えたりすることができます。これは意図的なもので、このコードは ARM SoC がどのように動作するかを示す非常に優れた例でもあるということです。 CPU エミュレータ自体のコードはそれほどきれいではないので、まあ、CPU エミュレータです。これは数年前に6か月以上の自由時間を使って書き、その後脇に置いておいたものです。このプロジェクトのために特別に最近復活しました。エミュレータは速度を向上させるために i-cache を実装しています。これにより、AVR に多くの助けが与えられ、外部 RAM とは異なり、内部メモリに毎秒 5MB 以上でアクセスできるようになります。 d-cache (データ キャッシュ) の実装にはまだ着手していませんが、やるべきことリストには入っています。ブロック デバイスへのアクセスは SD デバイスとしてエミュレートされません。これでは遅すぎることが判明しました。代わりに、準仮想化ディスク デバイス (pvdisk、pvDisk.tar.bz2 を参照、GPL ライセンス) があり、エミュレータをロードしてディスクにアクセスするために無効なオペコードを使用して作成しました。私のイメージの ramdisk (仮想ディスク) はこの pvdisk をロードし、ルート ディレクトリを /dev/pvd1 に変更します。

ramdiskは「rd.img」に含まれています。私が使用している「マシンタイプ」は PalmTE2 です。なぜ?私はこのハードウェアに精通しているので、初めて見たタイプの PXA255 マシンです。

***▍*ハイパーコール?

特別なオペコードを使用してエミュレータにリクエストできるサービスがいくつかあります。 ARM では 0xF7BBBBBB、Thumb では 0xBBBB です。これらは、ARM の保証が定義されていない範囲内にあるため選択されました。ハイパーコール番号はレジスタ R12 に渡され、パラメータはレジスタ R0 ~ R3 に渡され、戻り値は R0 に配置されます。

###移行:###

· 0 = シミュレーションを停止

· 1 = 10 進数を表示

· 2 = 文字を印刷します

· 3 = RAM サイズを取得

· 4 = ブロックデバイス操作 (R0 = 操作、R1 = セクター番号)。これらはエミュレートされた RAM に書き込むのではなく、別のハイパーコールを使用して、エミュレートされたユーザーがアクセスするエミュレータの内部バッファを一度に 1 ワードずつ埋めることに注意してください。 DMA を実装するつもりでしたが、まだ実装できていません。

操作:

· 0 = 情報を取得します (セクター番号が 0 の場合はセクター数を返します。セクター番号が 1 の場合はセクター サイズをバイト単位で返します)
· 1 = セクター読み取り
· 2 = セクター書き込み

· 5 = ブロック デバイス バッファ アクセス (R0 = 入力値/出力値、R1 = ワード数、R2 = 書き込まれる場合は 1、それ以外の場合は 0)

***▍*親指のサポート?

親指を完全にサポートします。 ARM エミュレータ機能を使用する代わりに、少しズルをして各 Thumb 命令文字列 (instr) を同等の ARM 命令文字列にデコードして実行しました。オリジナルほど高速ではありませんが、シンプルでコードも小さいです。 256KBのルックアップテーブルを使用することも可能ですが、マイコンのフラッシュメモリとしては256KBは大きすぎるような気がします。一部の Thumb 命令は ARM 命令に変換できませんが、代わりに正しく処理されます。

私も作りたいです!

非営利目的であれば、これを行うことができます。配線方法は以下の通りです。

· RAM の DQ0 ~ DQ7 は AVR の C0 ~ C7 に接続されています;

· RAM の A0 ~ A7 は AVR の A0 ~ A7 に接続されています;

· RAM の A8 ~ A11 は AVR の B0 ~ B3 に接続されています;

· RAM nRAM nRAS nCAS nWE は AVR D7 B4 B5 に接続されています;

·SDのDI SCK DOはAVRのB6 B7 D6に接続されています;

· LED の読み書きは AVR の D2 D3 に接続されます (LED の他のピンはグランドに接続されます);

· ボタンはAVRのD4に接続されています(他のピンはグランドに接続されています)。

Linux是否能在 8 位 MCU 上运行?RAM には、64 ミリ秒ごとの 4000 サイクルの CAS-before-RAS リフレッシュ レートで実行できる任意の 30 ピン 16MB SIMM を使用できます。私が使用しているもの (OWC) はオンラインで数ドルで購入できます。回路図をここに示します。クリックすると拡大します。

**

*▍*ソースコード?

このコードは少し面倒ですが、機能します (コードは中国ではダウンロードできません)。 PC にエミュレータをセットアップして試してみるには、「make」と入力します。実行するには「./uARM DISK_IMAGE」を使用します。最適化された PC バージョンをビルドするには、「make BUILD=opt」を使用します。 AVR の実行バージョンをビルドするには、「make BUILD=avr」を使用します。現在、ATmega1284P をターゲットとするようにコンパイルされています。 ATmega644 をターゲットとしてコンパイルするには、makefile の変更に加えて、i-cache が 644 内の RAM と一致するのに十分な大きさになるように icache.h の数を減らします。アーカイブには、1284p の最終 hex ファイルも含まれています。

▍起動プロセス

AVR のコード領域を確保するため、エミュレータにはスタートアップ コードがほとんど存在しません。実際、「ROM」は合計 50 バイトです。8 バイトは Thumb モードの選択に使用され、一部の Thumb コードは SD カードの最初のセクターを読み取り、Thumb モードにジャンプします (embeddedBoot.c を参照)。 SD カードの MBR には別のブートローダーがあります (Thumb モードで書き込み)。このブートローダーは MBR を調べ、アクティブなパーティションを見つけて、その内容を RAM の最後にロードします。次に、宛先 RAM アドレス 512 にジャンプします (mbrBoot.c を参照)。 3 番目で最大のブートローダーである ELLE (ELLE.c を参照) がここで実行されています。このブートローダーは、RAM ディスクを再配置し、ATAGS をセットアップし、カーネルを呼び出します。必要に応じて独自のイメージを作成できるように、すべてのバイナリとソース コードを提供します。起動プロセスは PC の起動を彷彿とさせます。 :) 付属の mkbooting.sh ツールを使用して、ブート パーティションの作業イメージを作成できます。

以上がLinux は 8 ビット MCU 上で実行できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:lxlinux.net
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート