How to refer to the unamed structure in page struct

Dave Hylands dhylands at gmail.com
Fri Nov 4 15:01:49 EDT 2011


Hi Jimmy,

On Fri, Nov 4, 2011 at 9:28 AM, Jimmy Pan <dspjm1 at gmail.com> wrote:
> On Sat, Nov 5, 2011 at 12:00 AM, Dave Hylands <dhylands at gmail.com> wrote:
>> Hi Jimmy,
>>
>> On Fri, Nov 4, 2011 at 8:27 AM, Jimmy Pan <dspjm1 at gmail.com> wrote:
>>> truct page {
>>>        unsigned long flags;            /* Atomic flags, some possibly
>>>                                         * updated asynchronously */
>>>        atomic_t _count;                /* Usage count, see below. */
>>>        union {
>>>                atomic_t _mapcount;     /* Count of ptes mapped in mms,
>>>                                         * to show when page is mapped
>>>                                         * & limit reverse map searches.
>>>                                         */
>>>                struct {                /* SLUB */
>>>                        u16 inuse;
>>>                        u16 objects;
>>>                };
>>>        };
>>>        union {
>>>            struct {
>>>                unsigned long private;          /* Mapping-private opaque data:
>>>                                                 * usually used for buffer_heads
>>>                                                 * if PagePrivate set; used for
>>>                                                 * swp_entry_t if PageSwapCache;
>>>                                                 * indicates order in the buddy
>>>                                                 * system if PG_buddy is set.
>>>                                                 */
>>>                struct address_space *mapping;  /* If low bit clear, points to
>>>                                                 * inode address_space, or NULL.
>>>                                                 * If page mapped as anonymous
>>>                                                 * memory, low bit is set, and
>>>                                                 * it points to anon_vma object:
>>>                                                 * see PAGE_MAPPING_ANON below.
>>>                                                 */
>>>            };
>>> #if USE_SPLIT_PTLOCKS
>>>            spinlock_t ptl;
>>> #endif
>>>            struct kmem_cache *slab;    /* SLUB: Pointer to slab */
>>>            struct page *first_page;    /* Compound tail pages */
>>>        };
>>
>> You just reference the variable as if the unnamed union weren't there
>> (i.e. just like unnamed unions in C++).
>>
>> Here's an example from the kernel source tree:
>> http://lxr.linux.no/linux+v3.1/include/linux/mm.h#L419

> Well, I see, but what is the use of the union and structure?

Unions and structures are basic elements of the C language.
http://en.wikipedia.org/wiki/Union_(computer_science)
http://publications.gbdirect.co.uk/c_book/chapter6/unions.html

-- 
Dave Hylands
Shuswap, BC, Canada
http://www.davehylands.com



More information about the Kernelnewbies mailing list