Kernel Arch. Solaris 7 vs. Solaris 8
I am reading the book Solaris Internals 1st edition where majority covers Solaris 7. I maintain this blog post as a place to show the differences I have found along the way.
Solaris 7 data structure for an address space object:
struct as { kmutex_t a_contents; /* protect certain fields in the structure */ uchar_t a_flags; /* as attributes */ uchar_t a_vbits; /* used for collecting statistics */ kcondvar_t a_cv; /* used by as_rangelock */ struct hat *a_hat; /* hat structure */ struct hrmstat *a_hrm; /* ref and mod bits */ caddr_t a_userlimit; /* highest allowable address in this as */ union { struct seg *seglast; /* last segment hit on the addr space */ ssl_spath *spath; /* last search path in seg skiplist */ } a_cache; krwlock_t a_lock; /* protects fields below + a_cache */ int a_nwpage; /* number of watched pages */ struct watched_page *a_wpage; /* list of watched pages (procfs) */ seg_next a_segs; /* segments in this address space. */ size_t a_size; /* size of address space */ struct seg *a_tail; /* last element in the segment list. */ uint_t a_nsegs; /* number of elements in segment list */ uchar_t a_lrep; /* representation of a_segs: see #defines */ uchar_t a_hilevel; /* highest level in the a_segs skiplist */ uchar_t a_unused; uchar_t a_updatedir; /* mappings changed, rebuild as_objectdir */ vnode_t **a_objectdir; /* object directory (procfs) */ size_t a_sizedir; /* size of object directory */ };
Solaris 8:
struct as { kmutex_t a_contents; /* protect certain fields in the structure */ uchar_t a_flags; /* as attributes */ uchar_t a_vbits; /* used for collecting statistics */ kcondvar_t a_cv; /* used by as_rangelock */ struct hat *a_hat; /* hat structure */ struct hrmstat *a_hrm; /* ref and mod bits */ caddr_t a_userlimit; /* highest allowable address in this as */ union { struct seg *seglast; /* last segment hit on the addr space */ ssl_spath *spath; /* last search path in seg skiplist */ } a_cache; krwlock_t a_lock; /* protects fields below + a_cache */ int a_nwpage; /* number of watched pages */ struct watched_page *a_wpage; /* list of watched pages (procfs) */ seg_next a_segs; /* segments in this address space. */ size_t a_size; /* size of address space */ struct seg *a_tail; /* last element in the segment list. */ uint_t a_nsegs; /* number of elements in segment list */ uchar_t a_lrep; /* representation of a_segs: see #defines */ uchar_t a_hilevel; /* highest level in the a_segs skiplist */ uchar_t a_unused; uchar_t a_updatedir; /* mappings changed, rebuild as_objectdir */ vnode_t **a_objectdir; /* object directory (procfs) */ size_t a_sizedir; /* size of object directory */ struct as_callback *a_callbacks; /* callback list */ };
Looks we have an extra callback structure in Solaris 8. Wonder what this is all about?
/* * The as_callback is the basic structure which supports the ability to * inform clients of specific events pertaining to address space management. * An example of the need for this is a driver which has done long-term * locking of memory. Address space management operations (events) such * as as_free, as_umap, and as_setprot will block indefinitely until the * pertinent memory is unlocked. The callback mechanism provides the * way to inform the driver of the event so that the driver may do the * necessary unlocking. * * The contents of this structure is protected by a_contents lock */ typedef void (*callback_func_t)(struct as *, void *, uint_t); struct as_callback { struct as_callback *ascb_next; /* list link */ int ascb_refcnt; /* reference count */ uint_t ascb_events; /* event types */ callback_func_t ascb_func; /* callback function */ void *ascb_arg; /* callback argument */ caddr_t ascb_saddr; /* start address */ size_t ascb_len; /* address range */ };
Leave a Reply