a question regarding <sys/shm.h>

Robert Watson rwatson at FreeBSD.org
Thu Feb 15 13:41:01 UTC 2007


On Thu, 15 Feb 2007, Pascal Hofstee wrote:

> On 1/31/07, Robert Watson <rwatson at freebsd.org> wrote:
>> If we do decide to go ahead with the ABI change, there are a number of 
>> other things that should be done simultaneously, such as changing the uid 
>> and gid fields to uid_t and gid_t.  I would very much like to see the ABI 
>> change happen, and the first step (breaking out kernel from user 
>> structures) has been done already as part of the MAC work.  The next step 
>> is to add routines that translate internal/external formats, which isn't 
>> hard, but requires a moderate pile of code to do (as well as great care 
>> :-).
>
> Well .. i finally found some spare time to have a closer look at the 
> "shm_segsz" issue ... and noticed there were actually a very limited number 
> of direct uses of the shm_segsz struct member (26 lines in the entire 
> /usr/src tree)
>
> I have attached a patchset that should change shm_segsz to size_t. There 
> were however 2 to 3 locations all regarding compat code (ibcs2, svr4 and 
> COMPAT_43) where i opted to stay on the clear side and not touch anything, 
> the rest was fairly straightforward as should be obvious from the diff. I 
> checked to make sure no function prototypes changed anywhere.
>
> Please have a look at the attached patch (available at 
> http://callisto.offis.uni-oldenburg.de/shm_segsz-int2size_t.diff in case the 
> attachment gets stripped off by the mailinglist software) and provide any 
> feedback where appropriate.

Unfortunately, things are a bit more tricky.  The problem is not so much the 
API, where converting size_t/int is a relative non-event, rather, the ABI.  By 
changing the size of a field in a data structure, you may change the layout of 
the structure, and hence the offset of other fields.  This offset information 
is compiled into binaries that access the structure -- hence being part of the 
ABI.  On i386, the change from int to size_t doesn't modify the ABI, as both 
int and size_t are 32-bit.  However, on 64-bit platforms, int is 32-bit and 
size_t is 64-bit:

sledge:/tmp> uname -a
FreeBSD sledge.freebsd.org 7.0-CURRENT FreeBSD 7.0-CURRENT #898: Wed Feb 14 
14:20:16 UTC 2007     root at sledge.freebsd.org:/h/src/sys/amd64/compile/SLEDGE 
amd64
sledge:/tmp> ./size_t
sizeof int: 4
sizeof size_t: 8

In practice, this means that all of the later fields in the data structure 
will be offset by 4 bytes.  This will affect any application that accesses 
later fields in the structure but isn't recompiled.  This is why DES and I 
have been discussing this change as requiring kernel compatibility code, which 
would provide new system calls working with the new layout, and retain old 
system calls working with the old layout.  So we'd need to provide a new 
shmctl() with the new structure, and an oshmctl() with the old layout.  While 
doing that, it makes sense to do all the other ABI-related things that we'd 
like to get out of the way, such as fixing the types in shm_perm.

Robert N M Watson
Computer Laboratory
University of Cambridge


More information about the freebsd-hackers mailing list