問題タブ [brk]
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.
memory-management - brk を減らしてから再び増やすと、Linux カーネルによってメモリがクリアされますか?
ユーザー プログラムが brk システム コールを介して解放し、その後再び元に戻すと、メモリがどうなるのか気になります。カーネルはそれをクリアしますか、それとも内容は未定義のままですか?
ページがbrkを介して新しく割り当てられると、カーネルがページをクリアすると思いますが、そのページが返されてから再度要求された場合にすべてをゼロにするかどうかはわかりません。lxr.linux.no を調べて調べています。この記事で紹介した本も参考にさせていただきます。
返信ありがとうございます。
ティム
c - プログラムブレイクとは?0x00ってどこから?
インクリメント 0 で sbrk() を呼び出すと、プログラム ブレークの現在の位置を見つけることができます。
プログラムブレイクとは?0x00ってどこから?
c - brk と sbrk は何の略ですか?
brk
Unix のシステム コールと関数が何をするかは知っていますsbrk
が、それらが何を表しているのかはわかりません。誰でも私を啓発できますか?
c - brk() システムコールは何をしますか?
Linuxプログラマーズマニュアルによると:
brk() および sbrk() は、プロセスのデータ セグメントの終了を定義するプログラム ブレークの位置を変更します。
ここのデータ セグメントとはどういう意味ですか? データ セグメントだけですか、それともデータ、BSS、およびヒープを組み合わせたものですか?
ウィキデータセグメントによると:
データ、BSS、およびヒープ領域をまとめて「データ セグメント」と呼ぶことがあります。
データ セグメントのサイズだけを変更する理由はありません。それがデータ、BSS、およびヒープをまとめたものである場合、ヒープがより多くのスペースを取得するので理にかなっています。
それが私の2番目の質問につながります。これまで読んだすべての記事で、著者はヒープが上向きに成長し、スタックが下向きに成長すると述べています。しかし、彼らが説明していないのは、ヒープがヒープとスタックの間のすべてのスペースを占有するとどうなるかということです?
linux - カーネルソース-どのファイルでbrk()が定義されているか
brk
カーネルソースバージョン>=2.6で定義されている場所を知りたいです。それはどのcファイルにその定義が含まれていますか?grep
あまり明らかにされていません。またsbrk
、glibcで実装されていますか?
c - 最初に適合する malloc 関数への私のアプローチに関する意見と提案
私は大学の課題のために malloc 関数を書いています。これが私のアイデアの基本的なレイアウトです。
1) 前のノード、次のノードへのポインター、およびサイズと空席の char を含むノード構造体を定義します。ヒープ内の各領域には、この情報を含む隠しノードが含まれます。
2) マロック関数。最初のノードから始めて、空き状況をチェックする各ノードをループします。ノードが空いていて十分に大きい場合、ノードを含まない領域の先頭への ptr を返します。使用可能なスペースがない場合は、sbrk を使用して、要求されたスペースとノードのスペースを割り当てます。
3)無料機能。parameter-sizeof(struct node) として渡されたポインターに移動し、空きを空に設定します。次に、リストの先頭から始めて、隣接する空きスペースをマージしながらリストをトラバースします。
このアプローチはどのように聞こえますか? 私の主な関心事は、リンクされたリストを実際に開始することです。たとえば、割り当てを開始する前に sbrk を使用してノードを作成し、ptr をグローバル変数として格納する必要がありますか? その場合、malloc 関数がドライバー プログラムによって呼び出されるようにする前に、最初のノードを初期化するにはどうすればよいですか?
前もって感謝します。誰かに私のコードを書くように頼んでいるのではなく、私のアイデアに関する洞察と提案を提供するだけです。
segmentation-fault - brk 呼び出し後の x86_64 printf segfault
brk (int 0x80 with 45 in %rax) を使用して、単純なメモリ マネージャー プログラムをアセンブリに実装し、ブロックを順番に出力しようとしているときに、segfault が発生し続けました。しばらくすると、エラーを再現することしかできませんでしたが、なぜこれが起こっているのかわかりません:
ここの例では、コメント行がコメント解除されている場合、segfault がありますが、一部のコマンド (de movq $0、%rax など) は問題なく動作します。私の他のプログラムでは、最初のいくつかの printf は機能しますが、3 つ目はクラッシュします... 他の質問を探していると、printf がメモリを割り当てることがあり、brk を使用すべきではないと聞きました。この場合、ヒープが破損するためです。または何か...私は非常に混乱しています、誰かそれについて何か知っていますか?
編集: printf を機能させるには %rax=0 が必要であることがわかりました。
posix - brk を使用して brk_start を取得する
int brk(void *end_data_segment); のマニュアル 「brk() は、データ セグメントの末尾を end_data_segment で指定された値に設定します」
成功すると 0 を返し、それ以外は -1 を返します。
しかし、ブレークの初期値 (sbrk(0) など) を取得するにはどうすればよいですか?
よろしくお願いします、
linux - アセンブリ x86 brk() 呼び出しの使用
メモリをヒープに動的に割り当て、それらのメモリ アドレスに値を割り当てようとしています。メモリを割り当てる方法は理解していますが、たとえばレジスタの値を最初の動的メモリ アドレスに割り当てるにはどうすればよいでしょうか? これは私がこれまでに持っているものです:
mov
たとえば、値をにrax
するにはどうすればよいでしょうかbrk_firstLocation