問題タブ [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 - _sbrk への未定義の参照
に問題があり_sbrk
ます。コンパイルのリンク段階で、以下のコマンドを使用してオブジェクトをリンクすると、 への未定義の参照が取得され_sbrk
ます。
私はarm926ej-s用にARMモードでコンパイルしているので 、フォルダーにある正しいマルチライブラリ(libc.a
およびlibgcc.a
)を選択したと思いますhome/ziga/projects/cs_lite/arm-none-eabi/lib/
。
私はインターネットで関数を検索してきまし_sbrk
たが、これはマイクロプロセッサに依存しているため、標準の C ライブラリには含まれていないある種のメモリ管理呼び出しです。_sbrk
だから私は自分で関数を書く必要がありますか? どうすればいいのですか?arm926ej-s の例はありますか? この関数を作成した後、オブジェクト ファイルにコンパイルし、それを他のオブジェクトやライブラリとリンクするつもりです。
c - brk と sbrk は何の略ですか?
brk
Unix のシステム コールと関数が何をするかは知っていますsbrk
が、それらが何を表しているのかはわかりません。誰でも私を啓発できますか?
c - void の値の設定方法 **
したがって、次のコードを使用して、malloc を使用せずにメモリをヒープに追加しようとしています (サイズは関数内の unsigned int パラメーターであり、設定された数値ではありません)。
ここで、temp の void * の値を NULL に設定したいのですが、やろうとすると
私のコンパイラは、void * を逆参照できないと言っています。このエラーを解決するにはどうすればよいですか?
c - 適切なメモリ サイズの割り当て
プログラムで適切なサイズのメモリを割り当てる際に問題が発生しています。私は次のことを行います:
これを行うと、バイト単位ではなく void* 単位で割り当てているため、ヒープにメモリを追加しすぎていると思います。sizeof ( anything ) が他の単位ではなくバイトを意味するようにするにはどうすればよいですか?
編集:
コンパイラがサイズをバイト単位で取得するように、他の人がものを char としてキャストするのを見てきました。sizeof(unsigned int) が 4 バイトで、使用していた型が void * の場合、コンパイラは 4 バイトではなく void * のサイズの 4 倍でブレークしますか?
linux - アセンブリのシステムコールとしての Linux sbrk()
そのため、課題として、またパフォーマンスのために、アセンブリで単純なサーバーを作成しています。私が知っている唯一の方法は、システムコールを使用することです。(int 0x80 を介して) 明らかに、アセンブル時またはロード時に割り当てられるよりも多くのメモリが必要になるので、主に mmap() を理解していないため、読んで sbrk() を使用することにしました:p
とにかく、Linux は sbrk() に対して割り込みを提供せず、brk() のみを提供します。
では、brk() を使用する現在のプログラム ブレークを見つけるにはどうすればよいでしょうか。getrlimit() を使用することを考えましたが、getrlimit() に渡すリソース (私が推測するプロセス ID) を取得する方法がわかりません。または、sbrk() を実装する他の方法を見つける必要がありますか?
c - sbrk(size_t) のセグメンテーション違反
私のプログラムはとてもシンプルで、
デバッグすると、次のように表示されます。
Program received signal SIGSEGV, Segmentation fault.
でTO_INT((pool_tail - 3)) = BUF_LENGTH * -1;
pool_tail と pool_head の値:
pool_tail = 0x805a000
pool_head = 0x804a000
それを解決する方法は?ありがとうございました!
arm - アームネオンコードのリンカエラー
C 組み込み関数を使用して ARM ネオン コードに取り組んでいます。ファイルをコンパイルすると、次のエラーが発生し続けます。
c:/program files (x86)/codesourcery/sourcery g++ lite/bin/../lib/gcc/arm-none-ea bi/4.3.3/../../../../arm-none -eabi/bin/ld.exe: 警告: エントリ シンボル _start が見つかりません。デフォルトは 00008020 です
c:/program files (x86)/codesourcery/sourcery g++ lite/bin/../lib/gcc/arm-none-ea bi/4.3.3/../../../../arm-none -eabi/lib\libc.a(lib_a-exit.o): 関数 'exit': exit.c:(.text+0x28): '_exit' への未定義の参照
c:/program files (x86)/codesourcery/sourcery g++ lite/bin/../lib/gcc/arm-none-ea bi/4.3.3/../../../../arm-none -eabi/lib\libc.a(lib_a-fstatr.o): 関数 '_fst at_r' 内: fstatr.c:(.text+0x1c): '_fstat' への未定義の参照
c:/program files (x86)/codesourcery/sourcery g++ lite/bin/../lib/gcc/arm-none-ea bi/4.3.3/../../../../arm-none -eabi/lib\libc.a(lib_a-openr.o): 関数 '_open _r':openr.c:(.text+0x20): '_open' への未定義の参照
c:/program files (x86)/codesourcery/sourcery g++ lite/bin/../lib/gcc/arm-none-ea bi/4.3.3/../../../../arm-none -eabi/lib\libc.a(lib_a-sbrkr.o): 関数 '_sbrk _r' 内: sbrkr.c:(.text+0x18): '_sbrk' への未定義の参照
c:/program files (x86)/codesourcery/sourcery g++ lite/bin/../lib/gcc/arm-none-ea bi/4.3.3/../../../../arm-none -eabi/lib\libc.a(lib_a-writer.o): 関数 '_write_r':writer.c:(.text+0x20): '_write' への未定義の参照
c:/program files (x86)/codesourcery/sourcery g++ lite/bin/../lib/gcc/arm-none-ea bi/4.3.3/../../../../arm-none -eabi/lib\libc.a(lib_a-closer.o): 関数 '_close_r' 内: close.c:(.text+0x18): '_close' への未定義の参照
c:/program files (x86)/codesourcery/sourcery g++ lite/bin/../lib/gcc/arm-none-ea bi/4.3.3/../../../../arm-none -eabi/lib\libc.a(lib_a-isattyr.o): 関数 '_is atty_r':isattyr.c:(.text+0x18): '_isatty' への未定義の参照
c:/program files (x86)/codesourcery/sourcery g++ lite/bin/../lib/gcc/arm-none-ea bi/4.3.3/../../../../arm-none -eabi/lib\libc.a(lib_a-lseekr.o): 関数 '_lseek_r':lseekr.c:(.text+0x20): '_lseek' への未定義の参照
c:/program files (x86)/codesourcery/sourcery g++ lite/bin/../lib/gcc/arm-none-ea bi/4.3.3/../../../../arm-none -eabi/lib\libc.a(lib_a-readr.o): 関数 '_read _r':readr.c:(.text+0x20): '_read' への未定義の参照
collect2: ld が 1 つの終了ステータスを返しました
これらのエラーを修正する方法を教えてもらえますか? 私が知っているのは、関数などを明示的に定義する必要があるということだけです。しかしisatty()
、fstat
どこで定義するのかわかりません
c - 最初に適合する malloc 関数への私のアプローチに関する意見と提案
私は大学の課題のために malloc 関数を書いています。これが私のアイデアの基本的なレイアウトです。
1) 前のノード、次のノードへのポインター、およびサイズと空席の char を含むノード構造体を定義します。ヒープ内の各領域には、この情報を含む隠しノードが含まれます。
2) マロック関数。最初のノードから始めて、空き状況をチェックする各ノードをループします。ノードが空いていて十分に大きい場合、ノードを含まない領域の先頭への ptr を返します。使用可能なスペースがない場合は、sbrk を使用して、要求されたスペースとノードのスペースを割り当てます。
3)無料機能。parameter-sizeof(struct node) として渡されたポインターに移動し、空きを空に設定します。次に、リストの先頭から始めて、隣接する空きスペースをマージしながらリストをトラバースします。
このアプローチはどのように聞こえますか? 私の主な関心事は、リンクされたリストを実際に開始することです。たとえば、割り当てを開始する前に sbrk を使用してノードを作成し、ptr をグローバル変数として格納する必要がありますか? その場合、malloc 関数がドライバー プログラムによって呼び出されるようにする前に、最初のノードを初期化するにはどうすればよいですか?
前もって感謝します。誰かに私のコードを書くように頼んでいるのではなく、私のアイデアに関する洞察と提案を提供するだけです。
linux - プロセスからOSにメモリを返す方法
さまざまなオペレーティング システムでのメモリ管理に問題があります。
私のプログラムは、数 GB のメモリを必要とする処理を行うサーバーです。その後、別のリクエストが到着するまで数時間待機する間、ほとんどのメモリを解放します。
AIX と Solaris では、次のような動作が見られます。
メモリを解放しても、メモリがオペレーティング システムに戻されません。プロセスが使用する仮想メモリの量は常に増加し、減少することはありません。物理メモリについても、限界まで同じことが言えます。したがって、スリープモードでもこのメモリをすべて使用しているように見えます。
このメモリを OS に戻すことができるのはいつですか? どうすれば作れますか?
Linux は違います。時々メモリを返すようですが、いつ、どのように返すのかわかりません。たとえば、リクエスト前のプロセスが 100MB で、ピーク時には 700MB であり、すべてを解放した後は 600MB に減少したというシナリオがあります。私には理解できません。Linux が OS にメモリを返還するのであれば、なぜすべてを返さないのでしょうか?
gcc - malloc が大量のメモリを要求しているようです
yagarto GCC コンパイラを使用した STM32F0 アプリケーションがあります。_sbrk newlib_stubs.c を実装しました。私が直面している問題は、_sbrk を呼び出して 4K のメモリを要求する際に、malloc(256) を malloc と呼んでいることです。私のシステムには合計 8K しかないので、明らかにこれは問題です。私は _sbrk への呼び出しを監視しましたが、これが少量のメモリを割り当てる前にいくつかの呼び出しを行っているようです。
今のところ、悪臭を避けるために鼻を押さえて、次のようなことをすることで、これを回避しています。
ヒープを再配置する前に _sbrk で。
システムはしっかりしているように見えますが、これが戻ってきて、思いがけないときに私を悩ませることになると確信しています.