맨페이지 문서에는 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에서는 두 개의 필드( 및 ) 가 추가되어 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
데비안에서 사용된 헤더 사본의 동일한 주석을 기반으로 한 것 같습니다. 예.
당신이 그것을 처리하고 싶지 않다면 패치를 제출하겠습니다!