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