問題タブ [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.

0 投票する
2 に答える
3213 参照

c - sbrk() と malloc() について

sbrk() に関する Linux マニュアルを徹底的に読みました。

sbrk() は、プロセスのデータ セグメントの終了を定義するプログラム ブレークの位置を変更します (つまり、プログラム ブレークは、初期化されていないデータ セグメントの終了後の最初の位置です)。

そして、ユーザー空間のメモリの構成が次のようなものであることは知っています: ここに画像の説明を入力

問題は 、sbrk(1) を呼び出すと、ヒープのサイズを増やしていると表示されるのはなぜですか? マニュアル通り、「データセグメント&bss」の終了位置を変更しています。では、データ セグメントと bss のサイズはどのくらい増加するのでしょうか。

0 投票する
2 に答える
1987 参照

c - malloc(1) で複数のページ サイズが得られるのはなぜですか?

私は自分のマシンで sbrk(1) を使用して試してみましたが、4096 バイトのページ サイズをテストするために意図的に範囲外に書き込みました。しかし、malloc(1) を呼び出すと、135152 バイトにアクセスした後に SEGV を取得します。これは、1 ページ サイズよりもはるかに大きい値です。malloc がライブラリ関数であり、実装に依存していることは知っていますが、最終的に sbrk を呼び出すことを考えると、なぜ複数のページ サイズが得られるのでしょうか。誰かがその内部作業について教えてもらえますか?

私のオペレーティング システムは ubuntu 14.04 で、アーキテクチャは x86 です。

更新: malloc が、データを保持するのに十分な大きさの空きリスト ブロックにアドレスを返すためかどうか疑問に思っています。しかし、そのアドレスはヒープの途中にある可能性があるため、ヒープの上限に達するまで書き込みを続けることができます。

0 投票する
1 に答える
432 参照

rust - Rust コードで unistd.h の関数を使用する方法はありますか?

malloc 型の関数を実装しようとしていますが、C の unistd.h にある sbrk 関数の代わりに何を使用すればよいかわかりません。unistd.h を Rust プログラムに FFI する方法はありますか?

0 投票する
2 に答える
936 参照

c - スタティック ライブラリの Newlib スタブ

Eclipse を使用してベアメタル アプリケーションを開発しています。私は newlib にリンクしているので、_sbrk() の独自の実装を提供しました。この機能は通常、私のプロジェクトに含まれており、すべてうまく機能していました。

ここで、この関数を、過去数か月にわたって開発した静的ライブラリに移動しようとしています。

リンク中にundefined reference to _sbrkエラーが発生します。ファイルが配置されているパスは、Eclipse 設定に正しく含まれています (同じディレクトリ内の他のファイルは正しくリンクされています)。

明らかに、リンカーがコードを通過する順序に問題があり、この関数は破棄されます。

使ってみ__attribute__((used))ましたが、運が悪かったです。

Eclipse の設定を使用して、この問題を解決するにはどうすればよいですか? (Makefile ベースまたはコマンド ライン コンパイルは、私が必要とするソリューションではありません)。

0 投票する
2 に答える
644 参照

linux - プログラムブレークの現在位置を見つける方法

これをbrkシステムコール関数内に追加してみました:

しかし、カーネルのコンパイル中に sbrk 関数の暗黙の宣言というエラーが返されました。そして、sbrkが定義されている場所を見つけることができませんでした!! ユーザー プロセスがプログラム ブレーク アドレスを拡張しようとするたびに、現在のプログラム ブレーク アドレスがわかれば、プロセスが要求しているメモリ量を測定できます。

ありがとうございました。

0 投票する
2 に答える
766 参照

c - sbrk の後に無効なメモリにヒットするのはなぜですか?

システム コールを使用しsbrkて 1 つのメモリ ページを要求し、そのページを小さなブロックに分割しようとしていますが、私のコードは常に無効なメモリにヒットします。

sbrk(0)に到達した場合のように0x804d000、バウンド アフターsbrk(one_page_size)は になります0x8055000が、コードは でセグメンテーション違反を起こし0x804e000ます。

0 投票する
2 に答える
350 参照

c - 内部で mmap を 1 回だけ呼び出す複数の malloc 呼び出し

以下のコードを試してみると、malloc api の内部呼び出しを明確に分析できません。システム コール mmap が 2 つ以上の malloc 呼び出しに対して 1 回だけ呼び出されることは明らかではありません。4069 バイト以上を割り当てている場合は、それも内部で 1 つの mmap のみを呼び出しています (トレースは strace -p processid を使用して識別されます)。

トレース出力:

私が探しているのは、mallocが複数回使用されている場合、メモリが4096を超える2つのmallocで超過しているため、複数のmmapを呼び出すことです

0 投票する
0 に答える
186 参照

memory-management - sbrk でヒープを減らすと、データ セグメントと衝突する可能性がありますか?

空きメモリをヒープに割り当てすぎるとスタックと競合する可能性があることはわかっていますが、データ セグメントはどうでしょうか。sbrk は負の値で使用できるためです。前もって感謝します。

0 投票する
2 に答える
1703 参照

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 のバグまたは意図された動作ですか?