問題タブ [bare-metal]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
beagleboneblack - Beaglebone のベアメタル プログラミング用スターター キット
ビーグルボーンでベアメタルの TCP/IP を試す予定です。優れた TCP/IP スタックを含む TI StarterWare があります。ただし、プログラムを BB にフラッシュするには、JTAG アダプターとソフトウェアが必要です。非常に多くの異なる JTAG デバッガーで、どれを購入/使用する必要がありますか?それらはすべて同等ですか?
c - 割り当て/解放のバランスを取るための C パターン/イディオム
単純なパターンに従うコードがたくさんあります。
の適用はthingFuncX()
他の計算と同様にさまざまですが、最後に常に解放されるというパターンは常に同じです。
ここでは未加工の C を使用する必要があります (つまり、C++ ではなく、派手なスコープ割り当てを使用する)。半制限付きのプロセッサでベアメタルを実行しています。
この一般的なパターンをキャプチャするために CPreprocessor を (ab) 使用する方法はありますか。フリーが忘れられないという自信を持てるように、私が使用する慣用句が欲しいです。マクロと a で何かできると思いますwhile { } do ()
(その場合、例である答えが役立ちます)。それとも、私が見落としている他の巧妙な C トリックがあるのでしょうか?
bare-metal - ベアメタルで Raspberry Pi 2 で追加のコアを起動するにはどうすればよいですか?
質問はかなり広いですが、ARMv7 ARM、MPCore TRM、GIC アーキテクチャ マニュアルなどの出発点を見つけることさえできませんでした。あいまいさを許してください。
アクティビティ LED、UART0、MMU、およびキャッシュを初期化する Raspberry Pi 2 用のシンプルなベアメタル カーネルがあり、すべてが機能します。まばたきをしたり、テキストを出力したり、物理ページを仮想アドレスにマッピングしてアクセスしたりできます。ここまでは順調ですね。
今、追加のコアを起動したいのですが、真空に陥っています。非常に多くのボードをサポートするため、かなり複雑な Linux カーネルを除いて、これを行う方法の例はまだありません。仕様を見ると、良い出発点が見つからないようです。だから、暗闇の中でぶらぶらする代わりに、私はここに来ました。:)
それで、他の誰かがこれを調べて、起動時とリセット時のコアの状態を把握しましたか? 追加のコアを起動するために使用されるブート プロトコル/メカニズムは何ですか? 私が見つけた1つの情報は、これはかなりSOC固有のものであるため、Cortex-A9またはRPi 2以外でこれを行う方法の例はありません.
c - ラズベリーパイベアメタルプログラミングでCライブラリスタブを作成する
私は現在ラズベリーパイを扱っており、valvers.com の第 2 章でよく書かれた第 2 章のチュートリアルに従っています。私はすべてを理解することができましたが、「C-Library stubs」というタイトルの最後のセクションにはほとんど行き詰まっていません。その中で、私は以下に言及したいくつかの疑問に直面しています:
これまでのところ、これが _sbrk 関数の実装であることしか理解していません。
1)。リンクで指定されたチュートリアルを参照して、このコードが正確に何をするのか理解できませんか?
2)。私が理解できないもう 1 つのことは、armc-008c と 009c に共通することです。つまり、main 関数から kernel_main 関数に変更する理由と方法を教えてください。これについて利用可能な唯一のテキストは、
注: main から kernel_main に変更しましたが、これには理由があります。ブートローダーは実際には、標準 C の main 関数とは少し異なるエントリ定義を想定しています。とにかく独自の C ランタイムを設定しているので、正しいエントリ形式を定義できます。
私はCの初心者であり、これらは初心者の質問に聞こえるかもしれませんが、ここでこの質問をする前に、多くの調査を行い、同じチュートリアルに3〜4日を費やしました. 私はまだこれらのプログラムの背後にあるロジックを理解しようとしています。この問題について少し光を当てることができますか?それは単なる助けではありません。
前もって感謝します
linux - objdump がデフォルトで逆アセンブルするセクション
私は現在、コードを含むいくつかの特別なセクションを含むベア メタル実行可能ファイルを作成しています。ただし、実行すると、セクションとセクションobjdump -d
のコードしか取得できません。onlyのマンページには、オプションを使用するときに「命令を含むと予想されるセクションのみを逆アセンブルする」と記載されています。これらはどのセクションで、デコードするセクションはどのようにわかりますか? オプションを使用してすべてのセクションの完全なデコードを取得することもできますが、これは通常、必要以上のものです。.text
.init.text
objdump
-d
objdump
-D
gcc - ベアメタル アームの例でリンカーを実行すると、リンカーが存在するローダー ファイルを見つけられない
私のボードとは異なるボードのベアメタルの例を見つけたので、ローダー スクリプトを変更する必要がありますが、今のところ、例をそのままコンパイルしてリンクできるようにしたいと考えています。
ソース ファイルがある c_blinky のすぐ上のディレクトリに arm-none-eabi クロス コンパイラをコピーしました。(私のウェブサイトのページにディレクトリ構造の図があります)
メイクファイルは次のとおりです。
makefile で GNU_ARM を ../arm-none-eabi/bin に設定して make を実行すると、次のエラーが発生しました: (blinky.ld ファイルはソース ディレクトリに存在します)
最初のLINK割り当ては次のようにする必要があると思いました:
そしてそうではない
そして私は得ました:
arm-none-eabi-gcc が lib/gcc/arm-none-eabi/4.9.3 で collect2 を呼び出しているように見えます。これは、メインの bin ディレクトリにない ld を呼び出します。
arm-none-eabi-ld へのシンボリック リンクを ld として作成しようとしましたが、同じエラーが発生しました。
assembly - なぜhvcは未定義命令例外を作るのですか?
ARMv7-A アセンブリ言語でプログラムを書いています。Virtualization Extension を使用して、ノンセキュア ワールドでプロセッサ モードを PL2 にしたい。
したがって、私は次のように
hvc
指示を使用します。
- セキュア PL1(SVC) モードで起動します。
- MVBAR と VBAR を設定します。
- 命令を使用
smc
して、監視モードに移動します。- モニタモードでは、SCR.NS ビットをセットし、HVBAR をセットして、excetpion を返します。
- プロセッサー・モードを SVC にします。
- hvcを呼び出す
コード
しかし、hvc命令で未定義命令例外が発生しました。go
このコードは、TWR-LS1021A ボード (Cortex-A7) のU-Boot コンソール (コマンド) から呼び出されました。
これの原因/修正方法を知っている人はいますか?
kernel - x86-64 アーキテクチャでのページング
オペレーティング システムの 32 ビット実装では、ページ テーブルの構造は固定されています (ページ ディレクトリとページ テーブルの 2 つのレベル)。ただし、x86_64 システムでは、通常、複数のレベルのページ テーブルが実装されています (Linux では 4)。システムは、使用されているレベルの数をどのように認識していますか? これに必要なコマンドは何ですか? グローバル ページ ディレクトリやその他の構造を CPU に知らせるにはどうすればよいでしょうか。
c++ - デストラクタのない C++ 関数
無限ループに入り、終了しないベアメタル C++ アプリケーションを作成しています。
main() の先頭に構築され、スコープを離れることのないオブジェクトがいくつかあります。メモリ (コードと RAM の両方) は非常に重要です。作業するのに数 k バイトしかないからです。
オプティマイザは通常、未使用のデストラクタを取り除きますか? そうでない場合、デフォルトのデストラクタを生成しないようにコンパイラに指示する方法はありますか?
また、クラスに付属する他のデフォルト関数のいくつかを取り除く類似の方法がありますか (コピー コンストラクターなど)。
c++ - C++ ランタイムは常に malloc() を必要としますか?
できるだけ小さくしたいベアメタルで実行する C++ アプリケーションがあります。
どこでも動的メモリ割り当てを使用していません。STL関数を使用していません。また、すべての種類の「delete」と「new」を空の関数でオーバーライドしました。それにもかかわらず、ソートされたシンボルのリストを見ると、malloc() がコンパイルされたバイナリーの最大の項目の 1 つであることがわかります。それを取り除くことができれば、バイナリを約 25% 縮小できます。
C++ ランタイムは一般に、舞台裏の型作業に malloc() を必要としますか?
(それが重要な場合は、Microblaze アーキテクチャにザイリンクスの gcc のフォークを使用しています)