|
|
1.1 ! root 1: .\" Copyright (c) 1983, 1986 The Regents of the University of California. ! 2: .\" All rights reserved. ! 3: .\" ! 4: .\" Redistribution and use in source and binary forms are permitted ! 5: .\" provided that the above copyright notice and this paragraph are ! 6: .\" duplicated in all such forms and that any documentation, ! 7: .\" advertising materials, and other materials related to such ! 8: .\" distribution and use acknowledge that the software was developed ! 9: .\" by the University of California, Berkeley. The name of the ! 10: .\" University may not be used to endorse or promote products derived ! 11: .\" from this software without specific prior written permission. ! 12: .\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ! 13: .\" IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ! 14: .\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 15: .\" ! 16: .\" @(#)5.t 6.4 (Berkeley) 3/7/89 ! 17: .\" ! 18: .nr H2 1 ! 19: .\".ds RH "Memory management ! 20: .br ! 21: .ne 2i ! 22: .NH ! 23: \s+2Memory management\s0 ! 24: .PP ! 25: A single mechanism is used for data storage: memory buffers, or ! 26: \fImbuf\fP's. An mbuf is a structure of the form: ! 27: .DS ! 28: ._f ! 29: struct mbuf { ! 30: struct mbuf *m_next; /* next buffer in chain */ ! 31: u_long m_off; /* offset of data */ ! 32: short m_len; /* amount of data in this mbuf */ ! 33: short m_type; /* mbuf type (accounting) */ ! 34: u_char m_dat[MLEN]; /* data storage */ ! 35: struct mbuf *m_act; /* link in higher-level mbuf list */ ! 36: }; ! 37: .DE ! 38: The \fIm_next\fP field is used to chain mbufs together on linked ! 39: lists, while the \fIm_act\fP field allows lists of mbuf chains to be ! 40: accumulated. By convention, the mbufs common to a single object ! 41: (for example, a packet) are chained together with the \fIm_next\fP ! 42: field, while groups of objects are linked via the \fIm_act\fP ! 43: field (possibly when in a queue). ! 44: .PP ! 45: Each mbuf has a small data area for storing information, \fIm_dat\fP. ! 46: The \fIm_len\fP field indicates the amount of data, while the \fIm_off\fP ! 47: field is an offset to the beginning of the data from the base of the ! 48: mbuf. Thus, for example, the macro \fImtod\fP, which converts a pointer ! 49: to an mbuf to a pointer to the data stored in the mbuf, has the form ! 50: .DS ! 51: ._d ! 52: #define mtod(\fIx\fP,\fIt\fP) ((\fIt\fP)((int)(\fIx\fP) + (\fIx\fP)->m_off)) ! 53: .DE ! 54: (note the \fIt\fP parameter, a C type cast, which is used to cast ! 55: the resultant pointer for proper assignment). ! 56: .PP ! 57: In addition to storing data directly in the mbuf's data area, data ! 58: of page size may be also be stored in a separate area of memory. ! 59: The mbuf utility routines maintain ! 60: a pool of pages for this purpose and manipulate a private page map ! 61: for such pages. ! 62: An mbuf with an external data area may be recognized by the larger ! 63: offset to the data area; ! 64: this is formalized by the macro M_HASCL(\fIm\fP), which is true ! 65: if the mbuf whose address is \fIm\fP has an external page cluster. ! 66: An array of reference counts on pages is also maintained ! 67: so that copies of pages may be made without core to core ! 68: copying (copies are created simply by duplicating the reference to the data ! 69: and incrementing the associated reference counts for the pages). ! 70: Separate data pages are currently used only ! 71: when copying data from a user process into the kernel, ! 72: and when bringing data in at the hardware level. Routines which ! 73: manipulate mbufs are not normally aware whether data is stored directly in ! 74: the mbuf data array, or if it is kept in separate pages. ! 75: .PP ! 76: The following may be used to allocate and free mbufs: ! 77: .LP ! 78: m = m_get(wait, type); ! 79: .br ! 80: MGET(m, wait, type); ! 81: .IP ! 82: The subroutine \fIm_get\fP and the macro \fIMGET\fP ! 83: each allocate an mbuf, placing its address in \fIm\fP. ! 84: The argument \fIwait\fP is either M_WAIT or M_DONTWAIT according ! 85: to whether allocation should block or fail if no mbuf is available. ! 86: The \fItype\fP is one of the predefined mbuf types for use in accounting ! 87: of mbuf allocation. ! 88: .IP "MCLGET(m);" ! 89: This macro attempts to allocate an mbuf page cluster ! 90: to associate with the mbuf \fIm\fP. ! 91: If successful, the length of the mbuf is set to CLSIZE, ! 92: the size of the page cluster. ! 93: .LP ! 94: n = m_free(m); ! 95: .br ! 96: MFREE(m,n); ! 97: .IP ! 98: The routine \fIm_free\fP and the macro \fIMFREE\fP ! 99: each free a single mbuf, \fIm\fP, and any associated external storage area, ! 100: placing a pointer to its successor in the chain it heads, if any, in \fIn\fP. ! 101: .IP "m_freem(m);" ! 102: This routine frees an mbuf chain headed by \fIm\fP. ! 103: .PP ! 104: The following utility routines are available for manipulating mbuf ! 105: chains: ! 106: .IP "m = m_copy(m0, off, len);" ! 107: .br ! 108: The \fIm_copy\fP routine create a copy of all, or part, of a ! 109: list of the mbufs in \fIm0\fP. \fILen\fP bytes of data, starting ! 110: \fIoff\fP bytes from the front of the chain, are copied. ! 111: Where possible, reference counts on pages are used instead ! 112: of core to core copies. The original mbuf chain must have at ! 113: least \fIoff\fP + \fIlen\fP bytes of data. If \fIlen\fP is ! 114: specified as M_COPYALL, all the data present, offset ! 115: as before, is copied. ! 116: .IP "m_cat(m, n);" ! 117: .br ! 118: The mbuf chain, \fIn\fP, is appended to the end of \fIm\fP. ! 119: Where possible, compaction is performed. ! 120: .IP "m_adj(m, diff);" ! 121: .br ! 122: The mbuf chain, \fIm\fP is adjusted in size by \fIdiff\fP ! 123: bytes. If \fIdiff\fP is non-negative, \fIdiff\fP bytes ! 124: are shaved off the front of the mbuf chain. If \fIdiff\fP ! 125: is negative, the alteration is performed from back to front. ! 126: No space is reclaimed in this operation; alterations are ! 127: accomplished by changing the \fIm_len\fP and \fIm_off\fP ! 128: fields of mbufs. ! 129: .IP "m = m_pullup(m0, size);" ! 130: .br ! 131: After a successful call to \fIm_pullup\fP, the mbuf at ! 132: the head of the returned list, \fIm\fP, is guaranteed ! 133: to have at least \fIsize\fP ! 134: bytes of data in contiguous memory within the data area of the mbuf ! 135: (allowing access via a pointer, obtained using the \fImtod\fP macro, ! 136: and allowing the mbuf to be located from a pointer to the data area ! 137: using \fIdtom\fP, defined below). ! 138: If the original data was less than \fIsize\fP bytes long, ! 139: \fIlen\fP was greater than the size of an mbuf data ! 140: area (112 bytes), or required resources were unavailable, ! 141: \fIm\fP is 0 and the original mbuf chain is deallocated. ! 142: .IP ! 143: This routine is particularly useful when verifying packet ! 144: header lengths on reception. For example, if a packet is ! 145: received and only 8 of the necessary 16 bytes required ! 146: for a valid packet header are present at the head of the list ! 147: of mbufs representing the packet, the remaining 8 bytes ! 148: may be ``pulled up'' with a single \fIm_pullup\fP call. ! 149: If the call fails the invalid packet will have been discarded. ! 150: .PP ! 151: By insuring that mbufs always reside on 128 byte boundaries, ! 152: it is always possible to locate the mbuf associated with a data ! 153: area by masking off the low bits of the virtual address. ! 154: This allows modules to store data structures in mbufs and ! 155: pass them around without concern for locating the original ! 156: mbuf when it comes time to free the structure. ! 157: Note that this works only with objects stored in the internal data ! 158: buffer of the mbuf. ! 159: The \fIdtom\fP macro is used to convert a pointer into an mbuf's ! 160: data area to a pointer to the mbuf, ! 161: .DS ! 162: #define dtom(x) ((struct mbuf *)((int)x & ~(MSIZE-1))) ! 163: .DE ! 164: .PP ! 165: Mbufs are used for dynamically allocated data structures such as ! 166: sockets as well as memory allocated for packets and headers. Statistics are ! 167: maintained on mbuf usage and can be viewed by users using the ! 168: \fInetstat\fP\|(1) program.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.