関数を含むメモリページの先頭を取得したいと思います。
私の場合は、ページの先頭にメイン機能を実装してみました。そのうち0x400a80
メモリのコード部分に位置しているようです。これが本当かどうか確認していただければ幸いです。
私が知っているのは、アドレスが0x400a80
ページにあります。
プロセスのメモリセグメント表示を使用すると、pmap
8Kサイズで始まるセグメントと4Kサイズで始まる次の0x400000
セグメントが表示されます。0x601000
0x400000
関数のアドレスがあるので、アドレスを取得したいと思いますmain()
。ページに住所がある場合は、ページの開始アドレスをどのように知ることができますか?これを行うためにLinuxに組み込まれた方法はありますか?
答え1
UnixとLinux StackExchangeへようこそ!
この質問に対する回答が良いかもしれませんスタックオーバーフロー、プログラミングのトラブルシューティングを担当するStackExchangeサイトです。しかし、とにかく...
x86アーキテクチャでは、標準メモリページは4KiB、つまり0x1000バイトです。メモリページはアドレス0から始まり、重複せずに連続して割り当てられます。
メモリページの先頭アドレスを見つけます。
beginning of page = memory address AND (NOT page size - 1)
したがって、アドレスが 0x400a80 の場合、ページ開始 = 0x400a80 AND (0x000fff 以外) = 0x400a80 AND 0xfff000 = 0x400000 です。
答え2
メモリ位置を含むページの先頭を探している場合は、次のものを使用できます。sysconf(_SC_PAGE_SIZE)
丸められたシステムのページサイズを取得します。
void *alloc;
long pagesz;
pagesz = sysconf(_SC_PAGESIZE);
printf("Default page size: %ld\n", pagesz);
alloc = malloc(512 * 1024 * 1024);
printf("512MiB allocated at %zx\n", alloc);
printf("The corresponding page starts at %zx\n", (((off_t) alloc) / pagesz) * pagesz);
ページサイズが異なる場合は、誤解を招く可能性があります。例えばLinuxで巨大なマッピングを使用するとき。
メモリの場所を含むアドレス空間割り当ての開始を探している場合は、これを行うための移植可能な方法がわかりません。 Linuxでマッピング情報を取得するためのインタフェースはい /proc/self/maps
そのため、開いて構文解析する必要があります。