How to refer to the unamed structure in page struct
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 */ }; ------------------------------------------------------------------------- As you can see in the code, the union in the page structure doesn't have a name, so does the structure in the union, how to refer to those two? Thanks in advance, Jimmy
Hi Jimmy, On Fri, Nov 4, 2011 at 8:27 AM, Jimmy Pan <dspjm1@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 -- Dave Hylands Shuswap, BC, Canada http://www.davehylands.com
On Sat, Nov 5, 2011 at 12:00 AM, Dave Hylands <dhylands@gmail.com> wrote:
Hi Jimmy,
On Fri, Nov 4, 2011 at 8:27 AM, Jimmy Pan <dspjm1@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
-- Dave Hylands Shuswap, BC, Canada http://www.davehylands.com
Well, I see, but what is the use of the union and structure?
Hi Jimmy, On Fri, Nov 4, 2011 at 9:28 AM, Jimmy Pan <dspjm1@gmail.com> wrote:
On Sat, Nov 5, 2011 at 12:00 AM, Dave Hylands <dhylands@gmail.com> wrote:
Hi Jimmy,
On Fri, Nov 4, 2011 at 8:27 AM, Jimmy Pan <dspjm1@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
participants (2)
-
Dave Hylands -
Jimmy Pan