Data Structures | |||||||
| struct | MEM_BLOCK | ||||||
| A memory block structure. More... | |||||||
Defines | |||||||
| #define | M_MAGIC ((dword)"$MB$") | ||||||
| Magic number to identify a memory block. | |||||||
| #define | M_FREE 0 | ||||||
| Free block. | |||||||
| #define | M_ALLOC 1 | ||||||
| Allocated block. | |||||||
Typedefs | |||||||
| typedef MEM_BLOCK | mem_block_t | ||||||
| A memory block structure. | |||||||
Functions | |||||||
| void | kmalloc_init () | ||||||
| Initialize the kernel virtual memory area. | |||||||
| void * | kmalloc (dword size) | ||||||
| void | kfree (void *ptr) | ||||||
Frees the memory space pointed by ptr, which must have been returned by a previous call to kmalloc(size_t size).
| |||||||
| int | mem_sizeof (void *ptr) | ||||||
Return the size of the pointer ptr passed as argument.
| |||||||
| void * | kmemalign (size_t alignment, size_t size) | ||||||
Allocate some memory aligned to a boundary.
| |||||||
|
|
Allocated block.
|
|
|
Free block.
|
|
|
Magic number to identify a memory block.
|
|
|
A memory block structure.
|
|
|
Frees the memory space pointed by ptr, which must have been returned by a previous call to kmalloc(size_t size).
Definition at line 223 of file kmalloc.c.
00224 {
00225 mem_block_t *p, *p2;
00226 dword IF = GET_IF();
00227
00228 if (ptr == NULL) return;
00229
00230 disable();
00231
00232 // Point to the header //
00233 p = (void *)ptr - sizeof(mem_block_t);
00234
00235 if (p->magic != M_MAGIC) return; // Is the process crazy?! :) //
00236 if (p->flags != M_ALLOC) return; // Crazy again?! :) //
00237
00238 // Free the block //
00239 p->flags = M_FREE;
00240 p->owner = NULL;
00241
00242 // Try to combine the block wih the next one... //
00243 p2 = (void *)p + p->size + sizeof(mem_block_t);
00244
00245 if (p2 < (mem_block_t *)K_HEAP_END)
00246 if (p2->flags == M_FREE)
00247 {
00248 // Let's merge the two blocks! //
00249 p->size += p2->size + sizeof(mem_block_t);
00250 p2->magic = NULL;
00251 }
00252
00253 // Try to combine the block with the previous one... //
00254 if (p != (mem_block_t *)K_HEAP_START)
00255 {
00256 // Find the previous block //
00257 p2 = (void *)K_HEAP_START;
00258 for(;;)
00259 {
00260 if (((void *)p2 + p2->size + sizeof(mem_block_t)) == p)
00261 {
00262 // Block found! //
00263 // Check if it's a free block //
00264 if (p2->flags == M_FREE)
00265 {
00266 // Let's merge the two blocks! //
00267 p2->size += (p->size + sizeof(mem_block_t));
00268 p->magic = NULL;
00269 p = p2;
00270 }
00271 break;
00272 }
00273 p2 = (void *)p2 + p2->size + sizeof(mem_block_t);
00274 }
00275 }
00276 // Release the physical space occupied by the block //
00277 deallocate(p);
00278
00279 SET_IF(IF);
00280 }
|
|
|
|
|
|
Initialize the kernel virtual memory area.
Definition at line 22 of file kmalloc.c.
00023 {
00024 mem_block_t *p;
00025
00026 // Create only one hudge block //
00027 p = (mem_block_t *)K_HEAP_START;
00028 p->magic = M_MAGIC;
00029 p->flags = M_FREE;
00030 p->size = K_HEAP_END - K_HEAP_START - sizeof(mem_block_t);
00031 p->owner = NULL;
00032 }
|
|
||||||||||||
|
Allocate some memory aligned to a boundary.
Definition at line 308 of file kmalloc.c.
00309 {
00310 mem_block_t *p, *p2;
00311 dword IF = GET_IF();
00312
00313 // Cannot allocate memory with a size of zero //
00314 if ( !size )
00315 return(NULL);
00316
00317 // Allocate the pointer //
00318 p = kmalloc(size + alignment + 2*sizeof(mem_block_t));
00319 if ( p == NULL )
00320 return(NULL);
00321
00322 // An alignment of zero is intended as a simple kmalloc(size) //
00323 if ( alignment == 0 )
00324 {
00325 return(p);
00326 }
00327
00328 // Check if the pointer is correcly aligned //
00329 if ( (size_t)(p) % alignment )
00330 {
00331 // Align the pointer p to the boundary. //
00332 disable();
00333
00334 // Allocate the new block //
00335 p2 = p + 2;
00336 p2 = (mem_block_t *)ALIGN_UP((size_t)p2, alignment) - 1;
00337 p2->magic = M_MAGIC;
00338 p2->flags = (p-1)->flags;
00339 p2->owner = (p-1)->owner;
00340 p2->size = mem_sizeof(p) - ((size_t)(p2+1) - (size_t)p);
00341
00342 // Free the unused space //
00343 (p-1)->size = (size_t)p2 - (size_t)p;
00344 kfree(p);
00345
00346 SET_IF(IF);
00347
00348 return(p2+1);
00349 }
00350 else
00351 // The pointer p is already aligned to the boudary //
00352 return(p);
00353 }
|
|
|
Return the size of the pointer ptr passed as argument.
Definition at line 287 of file kmalloc.c.
00288 {
00289 // Return the size of the pointer "ptr", or NULL if an error occurs //
00290 mem_block_t *p = ((mem_block_t *)ptr-1);
00291
00292 if ( (p->magic == M_MAGIC) && (p->flags == M_ALLOC) )
00293 return( p->size );
00294 else
00295 return(NULL);
00296 }
|
1.2.18