sysinfo(2) のマニュアルページにバグがありますか?

sysinfo(2) のマニュアルページにバグがありますか?

マンページ文書には、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 */
};

totalbig2.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)];考慮してパディングをに変更します。procstotalbig

2.3.23名前をtotalbig変更して追加し(パディングを適切に調整し)、構造をほぼそのままにします。freebigtotalhighfreehighmem_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」に置き換えました。それはおそらく、libc5Debianで使用されているヘッダーコピーの同じコメントに基づいているようです。はい。

あなたがそれを処理したくない場合は、パッチを送信します!

おすすめ記事