[CSE]  Advanced Operating Systems 
 COMP9242 2009/S2 
UNSW
CRICOS Provider
Number: 00098G

PRINTER Printer-Friendly Version
Administration                        
- Notices
- Course Intro
- Consultations
- Statistics
- Survey Results
 
Work
- Lectures
- Selected Papers
- Project Spec
- Exam
 
Forums
- Forums
 
Resources
Project Resources
Slug Lab
L4 Debugging Guide
Developing on a Mac
Developing on Linux
SOS source browser

 
Documentation
OKL4 reference manual
Elfweaver user manual
IXP42X hardware manual 
OKL Wiki
NSLU2-Linux HomePage
Intel IXP400 Software

 
Related Info
IBM OS Prize
OS Hall of Fame
 
History
2008
2007
2006
2005
2004
2003
2002
2000
1999
1998
- 1997
 
Staff
- Gernot Heiser
- Kevin Elphinstone (LiC)
- Guest Lecturers (TBA)
 
Stureps
- Student Reps

 
Valid HTML 4.0!

M1: Memory manager

Your first milestone is fairly straightfoward, and should only take you around 5 hours to complete. However, you should use this as an opportunity to get to used working with your partner, and probably work out exactly how you can work together so you don't end up duplicating work, or worse still not completing essential parts of the project.

By now you should have got yourself in a group and you should have a group account setup for you. We recommend that you use Mercurial (or another version control system of your choice) to maintain your source code, (this isn't a requirement, just a suggestion), and that a repository be setup in your group account with the correct permissions and sticky bits set so that you can both access it.

NOTE: If you are using Mercurial (hg), you can use the prebuilt version in CSE by adding /home/cs9242/bin to your $PATH. Be careful if you add this in your .bashrc, because your .bashrc may have some code at the top to quit if it is being run noninteractively. Your PATH modifications must be above this line if you want hg push and hg pull to work.

NOTE: If you are using CVS, be careful that the lib/lwip/core directory is ignored on import by CVS by default. See this page for more information.

The aim of this milestone is to design and implement simple memory management. You will need to set up a frame table so that you can keep track of the system's physical memory. You should extend the current implementation in frames.c. The comments in the provided file explain the existing interface.

Design alternatives

Some things you should think of are what information you need to store in the frame table. You may want to take into account the fact that you will later be using this frame table to support virtual memory, swapping and multiple processes. You should take this into account when designing your data structures.

You should also take into account which operations you want to perform on the frame table, and the required algorithms to fulfill these. For example, you don't want an order n-square O(n^2) search to find the next free frame.

Of course it is easy to change these data structures later as you gain a better understanding of the issues involved, so don't spend too much time designing the perfect structure now.

Your design should take into account the space and time complexity and bounds of your data structures.

Supplied Code

For this project you have been supplied with an extensive set of skeleton code to help you along the way. This code is intended as an implementation guide, not as a 'black-box' library.

It is important that you fully understand all provided code that you use. You are encouraged to modify and improve the supplied code, though for your own sanity avoid libs/ixp_* as they are Intel's incredibly complex networking libaries. For the purposes of assessment, we treat any supplied code that you call as your code and as such you may be asked to describe how it works.

Now might be a good time to get familiar with the resources, e.g. the framework documentation

Assessment

The demonstration of this solution should show the execution of some example code using the allocation routine. For example:

/* Allocate 10 pages and make sure you can touch them all */
for (i = 0; i < 10; i++) {
    /* Allocate a page */
    page = frame_alloc();
    assert(page);

    /* Test you can touch the page */
    *page = 0x37;
    assert(*page == 0x37);

    printf("Page #%d allocated at %p\n",  i, page);
}
/* Test that you eventually run out of memory gracefully,
   and doesn't crash */
for (;;) {
     /* Allocate a page */
     page = frame_alloc();
     if (!page) {
	  printf("Out of memory!\n");
	  break;
     }

     /* Test you can touch the page */
     *page = 0x37;
     assert(*page == 0x37);
}
/* Test that you never run out of memory if you always free frames. 
    This loop should never finish */
for (;;) {
     /* Allocate a page */
     page = frame_alloc();
     assert(page != NULL);

     /* Test you can touch the page */
     *page = 0x37;
     assert(*page == 0x37);

     printf("Page #%d allocated at %p\n",  i, page);

     frame_free(page);
}

You should also be able to explain to the tutor the structure of your frame table, how your code works and any design decisions you took.


Last modified: 03 Aug 2009.