マンページ文書には、struct sysinfo(まだ)が記載されています。この構造のサイズは、32ビットシステムと64ビットシステムで異なります。 (構造が長く構成されているためです。)
マンページから次の説明を読むことができます。
...
/* Pads structure to 64 bytes */
...
/* Padding to 64 bytes */
...
しかし、それは完全に真実ではありません。 64ビットでは、構造のサイズは64ではなく112です。それではこれはバグだと思いますか?
ベストアンサー1
マニュアルページは、歴史的な表現でも確かに不正確です。
前述のように、32ビットプラットフォームでstruct
文書に記載されているように、最終サイズは64バイトですが、64ビットプラットフォームでは最終サイズは112バイトです。なぜなら、longの長さは8バイトであり、struct
メンバーは最終的に次の位置にソートされるからです。 8バイト間隔)。
歴史に関する限り、今後2.3.16、struct
ステートメントは次のとおりです。
struct sysinfo {
long uptime; /* Seconds since boot */
unsigned long loads[3]; /* 1, 5, and 15 minute load averages */
unsigned long totalram; /* Total usable main memory size */
unsigned long freeram; /* Available memory size */
unsigned long sharedram; /* Amount of shared memory */
unsigned long bufferram; /* Memory used by buffers */
unsigned long totalswap; /* Total swap space size */
unsigned long freeswap; /* Swap space still available */
unsigned short procs; /* Number of current processes */
char _f[22]; /* Pads structure to 64 bytes */
};
totalbig
2.3.16では、2つのフィールド(および)が追加され、次に入力されfreebig
ました。削除済み:
struct sysinfo {
long uptime; /* Seconds since boot */
unsigned long loads[3]; /* 1, 5, and 15 minute load averages */
unsigned long totalram; /* Total usable main memory size */
unsigned long freeram; /* Available memory size */
unsigned long sharedram; /* Amount of shared memory */
unsigned long bufferram; /* Memory used by buffers */
unsigned long totalbig; /* Total big memory size */
unsigned long freebig; /* Available big memory size */
unsigned long totalswap; /* Total swap space size */
unsigned long freeswap; /* Swap space still available */
unsigned short procs; /* Number of current processes */
};
2.3.17では、新しいフィールドが最後に移動され(おそらく誰かが2.3.16の変更によってユーザースペースABIが破損したことに気づいたようです)、次の理由でパディングが再導入されましたlibc5
(ただし、フルサイズの表示はありません)。
struct sysinfo {
long uptime; /* Seconds since boot */
unsigned long loads[3]; /* 1, 5, and 15 minute load averages */
unsigned long totalram; /* Total usable main memory size */
unsigned long freeram; /* Available memory size */
unsigned long sharedram; /* Amount of shared memory */
unsigned long bufferram; /* Memory used by buffers */
unsigned long totalswap; /* Total swap space size */
unsigned long freeswap; /* Swap space still available */
unsigned short procs; /* Number of current processes */
unsigned long totalbig; /* Total big memory size */
unsigned long freebig; /* Available big memory size */
char _f[22-2*sizeof(long)]; /* Padding: libc5 uses this.. */
};
2.3.18との間のパディングをchar _f[20-2*sizeof(long)];
考慮してパディングをに変更します。procs
totalbig
2.3.23名前をtotalbig
変更して追加し(パディングを適切に調整し)、構造をほぼそのままにします。freebig
totalhigh
freehigh
mem_unit
今日のように;それ以来、Motorola 68kにはいくつかの明示的なパディングが追加され、「標準」型定義に関係なくカーネルに適した型が使用されるように型が変更されました。
struct sysinfo {
__kernel_long_t uptime; /* Seconds since boot */
__kernel_ulong_t loads[3]; /* 1, 5, and 15 minute load averages */
__kernel_ulong_t totalram; /* Total usable main memory size */
__kernel_ulong_t freeram; /* Available memory size */
__kernel_ulong_t sharedram; /* Amount of shared memory */
__kernel_ulong_t bufferram; /* Memory used by buffers */
__kernel_ulong_t totalswap; /* Total swap space size */
__kernel_ulong_t freeswap; /* swap space still available */
__u16 procs; /* Number of current processes */
__u16 pad; /* Explicit padding for m68k */
__kernel_ulong_t totalhigh; /* Total high memory size */
__kernel_ulong_t freehigh; /* Available high memory size */
__u32 mem_unit; /* Memory unit size in bytes */
char _f[20-2*sizeof(__kernel_ulong_t)-sizeof(__u32)]; /* Padding: libc5 uses this.. */
};
/* Padding to 64 bytes */
カーネル履歴に別々の行は表示されません。これはマニュアルページの貢献者によって導入されたようで、マニュアルページプロジェクトバージョン3.41では、「Padding for libc5」を「Padding to 64 bytes」に置き換えました。それはおそらく、libc5
Debianで使用されているヘッダーコピーの同じコメントに基づいているようです。はい。
あなたがそれを処理したくない場合は、パッチを送信します!