問題タブ [sbrk]
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.
c - malloc(1) で複数のページ サイズが得られるのはなぜですか?
私は自分のマシンで sbrk(1) を使用して試してみましたが、4096 バイトのページ サイズをテストするために意図的に範囲外に書き込みました。しかし、malloc(1) を呼び出すと、135152 バイトにアクセスした後に SEGV を取得します。これは、1 ページ サイズよりもはるかに大きい値です。malloc がライブラリ関数であり、実装に依存していることは知っていますが、最終的に sbrk を呼び出すことを考えると、なぜ複数のページ サイズが得られるのでしょうか。誰かがその内部作業について教えてもらえますか?
私のオペレーティング システムは ubuntu 14.04 で、アーキテクチャは x86 です。
更新: malloc が、データを保持するのに十分な大きさの空きリスト ブロックにアドレスを返すためかどうか疑問に思っています。しかし、そのアドレスはヒープの途中にある可能性があるため、ヒープの上限に達するまで書き込みを続けることができます。
rust - Rust コードで unistd.h の関数を使用する方法はありますか?
malloc 型の関数を実装しようとしていますが、C の unistd.h にある sbrk 関数の代わりに何を使用すればよいかわかりません。unistd.h を Rust プログラムに FFI する方法はありますか?
c - スタティック ライブラリの Newlib スタブ
Eclipse を使用してベアメタル アプリケーションを開発しています。私は newlib にリンクしているので、_sbrk() の独自の実装を提供しました。この機能は通常、私のプロジェクトに含まれており、すべてうまく機能していました。
ここで、この関数を、過去数か月にわたって開発した静的ライブラリに移動しようとしています。
リンク中にundefined reference to _sbrk
エラーが発生します。ファイルが配置されているパスは、Eclipse 設定に正しく含まれています (同じディレクトリ内の他のファイルは正しくリンクされています)。
明らかに、リンカーがコードを通過する順序に問題があり、この関数は破棄されます。
使ってみ__attribute__((used))
ましたが、運が悪かったです。
Eclipse の設定を使用して、この問題を解決するにはどうすればよいですか? (Makefile ベースまたはコマンド ライン コンパイルは、私が必要とするソリューションではありません)。
linux - プログラムブレークの現在位置を見つける方法
これをbrkシステムコール関数内に追加してみました:
しかし、カーネルのコンパイル中に sbrk 関数の暗黙の宣言というエラーが返されました。そして、sbrkが定義されている場所を見つけることができませんでした!! ユーザー プロセスがプログラム ブレーク アドレスを拡張しようとするたびに、現在のプログラム ブレーク アドレスがわかれば、プロセスが要求しているメモリ量を測定できます。
ありがとうございました。
c - sbrk の後に無効なメモリにヒットするのはなぜですか?
システム コールを使用しsbrk
て 1 つのメモリ ページを要求し、そのページを小さなブロックに分割しようとしていますが、私のコードは常に無効なメモリにヒットします。
sbrk(0)
に到達した場合のように0x804d000
、バウンド アフターsbrk(one_page_size)
は になります0x8055000
が、コードは でセグメンテーション違反を起こし0x804e000
ます。
c - 内部で mmap を 1 回だけ呼び出す複数の malloc 呼び出し
以下のコードを試してみると、malloc api の内部呼び出しを明確に分析できません。システム コール mmap が 2 つ以上の malloc 呼び出しに対して 1 回だけ呼び出されることは明らかではありません。4069 バイト以上を割り当てている場合は、それも内部で 1 つの mmap のみを呼び出しています (トレースは strace -p processid を使用して識別されます)。
トレース出力:
私が探しているのは、mallocが複数回使用されている場合、メモリが4096を超える2つのmallocで超過しているため、複数のmmapを呼び出すことです
memory-management - sbrk でヒープを減らすと、データ セグメントと衝突する可能性がありますか?
空きメモリをヒープに割り当てすぎるとスタックと競合する可能性があることはわかっていますが、データ セグメントはどうでしょうか。sbrk は負の値で使用できるためです。前もって感謝します。
c - newlib の malloc() : 1 回の大きな失敗の割り当て後にメモリを浪費しますか?
私は STM32F7 用の組み込みソフトウェアを作成しており、私の libc は newlib-2.4.0.20160527 です。
私は次のように実装_sbrk()
しました:
次に、次のことを行うと:
すべて正常に動作します (つまり、malloc は非ゼロを 2 回返します)。
しかし、次のことを行うと(テスト目的で):
すべてmalloc()
が失敗しますmalloc(0)
(つまり、__BKPT()
is never reached )。そのため、実際にはヒープに割り当てられたメモリはなく(何も取得できなかったmem != 0
ので、何もできませんfree()
)、使用可能なメモリもありません。
malloc()
私は毎回失敗し、毎回sz > 0x40000
成功することを期待していました(それぞれの後に正常に動作するとsz <= 0x40000
仮定します)。free()
malloc()
私は何かを見逃していましたか、それともこれは newlib のバグまたは意図された動作ですか?