問題タブ [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.
usb - U-boot: load kernel via USB
I'm writing a small OS for a ARM board, and I'm a bit tired of the usual "remove SD card, copy kernel, insert SD card, switch on" pattern, so I started to look towards u-boot, and now I'm able to load the kernel via serial port using u-boot and kermit: I don't have to remove/insert the SD card anymore.
However this is painfully slow (~5min for 2.5 Mo), and I wonder if I could do the same using the usb port of the board (I know u-boot support tftpt booting method, but I didn't managed to setup the network correctly so far).
Best,
V.
bare-metal - エラー: マルチブート ヘッダーが見つかりません
この日、気になるものを見つけました。シンプルなベア OS をビルドする
マルチブート対応にする方法を読みました。NASM と GCC を使用しています。マルチブート ヘッダーを持つローダーを作成し、そのためにシステムのメイン ポイントを呼び出す必要があります。loader.asm と loader.ld の 2 つのファイルがあります。
loader.asm
loader.ld
main.c
私が使用しているビルドのために
そして最後のリンク
grub-mkrescue でシンプルな iso を構築し、qemu で実行しましたが、常に
問題はファイルにあると思いますloader.ld
が、どこにあるのかわかりません
c - 割り込みハンドラーをイベントリスナーとして使用する際の何が問題なのですか
私のシステムは、OS なしで実行できるほどシンプルです。デスクトップ プログラムでイベント リスナーを使用する場合と同じように、割り込みハンドラーを使用するだけです。私がオンラインで読んだものすべてで、人々は割り込みハンドラーに費やす時間をできるだけ少なくし、制御をタスクに戻そうとしています。しかし、私は OS も実際のタスク システムも持っていません。また、OS のないターゲットの設計情報を実際に見つけることはできません。
私は基本的に、USB からデータのチャンクを読み取り、データをメモリに書き込む 1 つの割り込みハンドラーと、データを読み取り、GPIO でデータを送信し、ハードウェア タイマーで再度スケジュールする 1 つの割り込みハンドラーを持っています。
私のように割り込みを使用し、作業階層を管理するために NVIC (私は cortex-M3 を使用) を使用することの何が問題になっていますか?
assembly - Raspberry Pi での memset の独自の実装
私は Raspberry Pi B+ 用に独自のカーネルを作成して遊んでおり、独自の単純な実装を作成しようとしていましたmemset
。私が考えることができる最良の解決策(アセンブリ言語の専門家であるとは限りません)が含まれていました
stm r0!, {r1,r1,r1,r1,r1,r1,r1,r1}
wherer0
には宛先配列アドレスが含まれてr1
おり、配列に入力している番号が含まれています。動作しているように見えますが、コンパイラーはレジスターの重複に関する警告を出し続けます。これを達成するためのよりクリーン/安全/より良い方法はありますか?
ld - セクションの開始アドレスを ROM の専用の場所に書き込む方法
ベア メタル プロジェクトでは、ROM セクションの開始アドレスを専用のアドレスに書き込む必要があります。私がこれまでに見つけたのは、リンカー スクリプトの次の定義のようなものです。
0x10001014 に配置される値を定義するには、これを C++ ファイルのどこかに追加できます。
定数整数を宣言し、リンカーを使用してコードセクションの開始アドレスを直接書き込む必要を回避する方法を知っている人はいます0x10001014
か?
beagleboneblack - LWIP と StarterWare を使用した Beaglebone パケット スニファー
私は、BeagleBone Black をローカル ネットワークのパケット スニファー (およびロガー) として使用することを計画しているプロジェクトに取り組んでいます。Starterware の例である echo_server と http_server を使用しましたが、これらは問題なく動作します。しかし、TCP/IP の内部操作に精通していないため、既存の Starterware コード ベースを変更してプロミスキャス モードのパケット スニッフィングを実装する方法がわかりません。この LWIP のポートが意図した用途で機能する場合と機能しない場合がある理由について、何か提案や理由がある人はいますか? ありがとう、
arm - ルート デバイスはどこにありますか?
私はRaspberry Pi用にゼロから小さなマイクロカーネルを書いています(コードは次のとおりです:https://github.com/yrakcaz/RasPiK/)
すべて正常に動作しているように見えますが、ちょっとした問題があります。ファイル システムが必要ですが、ルート デバイス アドレスを取得する方法がわかりません。x86 アーキテクチャでは、メイン関数の引数に渡されたタグを使用して ROM アドレスを取得できることはわかっていますが、すでに atags を解析しており、興味深いものは何もありません...
このアドレスを取得するにはどうすればよいですか?
virtual-machine - ベアメタルマシンに Vagrant Box をインストールする方法は?
Vagrantボックスを「ベアメタル」マシン、つまりハイパーバイザーではなく通常のコンピューターのオペレーティングシステムとして、インストールプロセスを経ずに使用する確立された方法はありますか?
一般的な回答は、おそらく「OS を定期的にインストールしてから、Puppet や Chef などの適切な構成管理ツールを使用する」というものになると思いますが、聞いてください。私たちの IT 組織は、すべてのセキュリティ関連のプロトコルとアプリケーションが適用されたベース Vagrant ボックスを作成したいと考えています。次に、Puppet のような構成管理ツールを使用して、データベースや Web サーバーなどの「便利な」アプリケーションをその上にインストールできます。
これは、ソフトウェア開発者が新しいユーティリティを開発環境またはサーバーにデプロイしたい場合に最適です。Puppet コードを記述して、必要なものを正確にインストールできます。これを IT に引き渡して、検証済みの Vagrant ボックス上で実行することができます。仮想マシン サーバーを作成します。
Vagrant ボックスを内部でホストすることにより、開発者が新しい Puppet コードを作成している間、セキュリティの詳細を開発者から隠すことができ、開発者はそれを実行するのと同じ環境で Puppet コードをテストできます。一度だけダウンロードされます。ほとんどの「運用」展開は仮想マシンのままです。
まれに、より多くの VM を実行するために新しいハードウェアを入手した場合や、必要なユーティリティが非常に計算量が多い場合に、VM ではなく実際のベアメタル サーバーが必要になることがあります。既存の Vagrant ボックスを再利用して、ベアメタル サーバーと仮想サーバーの区別がつかないようにできれば素晴らしいと思います。
編集: askubuntu ( https://askubuntu.com/questions/32499/migrate-from-a-virtual-machine-vm-to-a-physical-system ) で投稿を見つけました。そのような手順がVagrantディスクイメージで機能するかどうか、必要なクリーンアップ(Vagrant sshキーなど)があるかどうか、またはUbuntu以外のオペレーティングシステムに一般化できるかどうか(Live CDを使用しているため)を誰かが確認しますか?
c - Bare-Metal C: crt0.s が処理するはずの処理を実行する IDE スタートアップ ファイルがあるのはなぜですか?
Em::Blocks IDEを使用して、ARM Cortex-M3 マイクロコントローラー STM32F4 用のベアメタル C ソフトウェアを作成しています。
IDE に含まれている startup_stm32f429x.S ファイルの内容を次に示します。
.data
169 行目から 192 行目で、セクションが初期値で満たされていることがわかります。- 199 行目で、 GCC ツールチェーン
_start
の crt0.s ファイルで定義されているシンボルに分岐しています。 - 211 行目から 223 行目は、セクションをクリアするための独自のコードを提供しています
.bss
。(ここでも_start
定義されていますが、弱いです。したがって、このコードは、_start
シンボルが他の場所で定義されていない場合にのみアクティブになります。)
私の質問は次のとおりです。
- 起動ファイルが初期化
.data
とクリアのコードを提供しているのはなぜ.bss
ですか? それがcrt0.sの仕事だと思った?! - 前述したように、クリアのコードは、
.bss
crt0.s が見つからない場合にのみアクティブになるようです。- これは、crt0.s が欠落している可能性があるようです。crt0.s が見つからないのはなぜですか? 利用可能であることを信頼できないのはなぜですか。どのような状況で欠落するのでしょうか?
- それとは対照的に、crt0.s が使用可能かどうかに関係なく、
.data
セクションの初期化が常にアクティブなのはなぜですか?
アップデート
例外ベクトルの設定は、crt0.s が担当するもう 1 つのことです。繰り返しますが、これが私の起動ファイルの 41 行目から 151 行目で行われるのはなぜですか?
c - 端末スクロールの実装方法
Bare Bones チュートリアルに従って、カーネルを作成しました。端末スクロールのサポートを追加しましたが、実際には機能していません。最終的な ISO イメージを VirtualBox で実行すると、重大なエラーが発生します。ログファイルは意味不明なものでいっぱいです。現在、私の端末スクロール機能は次のとおりです。