Subject:
|
Question about mm.C in BrickOS
|
Newsgroups:
|
lugnet.robotics.rcx.legos
|
Date:
|
Wed, 13 Aug 2003 14:00:32 GMT
|
Viewed:
|
3340 times
|
| |
| |
Hey
My Senior Preoject where I update BrickOS is slowly taking shape (I am actually
trying to do some now, but time is very limited). This project I am editing the
Memory Managment Alg used by BrickOS. the first one I am going to add is Next
Fit, it seems to be the easiest to add since it is the same as First Fit except
instead of starting from MM_Start when looking for free block, I need to start
at ptr++ (where ptr is the the last free block found).
It has been a while since I looked at this code or done any programming in any
langauge other that VB.NET (for work). My OS coding background is becoming very
blurry and I dont understand the a whole block of code very well in mm.c. Of
the block I understand some statements and conditions but not all, if possible
could someone please hlep me and explain what the block is doing?
Here is the malloc function in mm.c (the block is below after the equal signs):
void *malloc(size_t size) {
size_t *ptr,*next;
size=(size+1)>>1; // only multiples of 2
#ifdef CONF_TM
ENTER_KERNEL_CRITICAL_SECTION();
#endif
ptr=mm_first_free;
while(ptr>=&mm_start) {
if(*(ptr++)==MM_FREE) { // free block?
#ifdef CONF_TM
mm_try_join(ptr); // unite with later blocks
#endif
if(*ptr>=size) { // big enough?
*(ptr-1)=(size_t)ctid; // set owner
// split this block?
if((*ptr-size)>=MM_SPLIT_THRESH) {
next=ptr+size+1;
*(next++)=MM_FREE;
*(next)=*ptr-size-MM_HEADER_SIZE;
mm_try_join(next);
*ptr=size;
}
// was it the first free one?
if(ptr==mm_first_free+1)
mm_update_first_free(ptr+*ptr+1);
#ifdef CONF_TM
LEAVE_KERNEL_CRITICAL_SECTION();
#endif
return (void*) (ptr+1);
}
}
ptr+=(*ptr)+1; // find next block.
}
#ifdef CONF_TM
LEAVE_KERNEL_CRITICAL_SECTION();
#endif
return NULL;
}
============
1 if(*ptr>=size) { // big enough?
2 *(ptr-1)=(size_t)ctid; // set owner
3
4 // split this block?
5 if((*ptr-size)>=MM_SPLIT_THRESH) {
6 next=ptr+size+1;
7 *(next++)=MM_FREE;
8 *(next)=*ptr-size-MM_HEADER_SIZE;
9 mm_try_join(next);
10
11 *ptr=size;
12 }
===========
I know what the jist of the block does but I have a foggy idea of what lines 7
and 8 do. Any help with those 2 lines and a summary of the block would be
great. Thanks
Mike
|
|
Message has 2 Replies: | | Re: Question about mm.C in BrickOS
|
| (...) <snip> (...) I've never looked at brickOS code, but here is my take: By the time you hit line 2, you've found a free block that is big enough. Line 2 sets the owner of the block. Line 5 decides if the block is oversized enough to split. Line 6 (...) (21 years ago, 13-Aug-03, to lugnet.robotics.rcx.legos)
| | | Re: Question about mm.C in BrickOS
|
| Hi, (...) Ptr points to the length byte of the first free block (...) *(ptr-1) actually is MM_FREE and is now set to the callers id. (...) Now we can do two things: We could grab all memory we found in this block or we could allocate only the memory (...) (21 years ago, 13-Aug-03, to lugnet.robotics.rcx.legos)
|
7 Messages in This Thread:
- Entire Thread on One Page:
- Nested:
All | Brief | Compact | Dots
Linear:
All | Brief | Compact
|
|
|
|