Throughout the course, I will make certain assumptions about your knowledge. In particular, I will assume the following:
You have taken an undergraduate course in operating systems and understand basic operating system concepts such as processes, threads, file system implementation, mutual exclusion, process synchronization, and process scheduling.
You can program proficiently in the C or C++ programming language as well as Java. If you know one, you can learn the other without too much grief. A tutorial that seems pretty good (on casual inspection) on C can be found at http://www.eskimo.com/\~scs/cclass/cclass.html
I learned C eons ago via Kernighan and Ritchie’s text (it was the thinnest book I could find). It is still one of my favorites because of its concise nature. It is particularly good if you already know how to program in some other programming language:
Brian W. Kernighan and Dennis M. Ritchie, The C Programming Language Second Edition, Prentice-Hall, 1988, ISBN 0–13–110362–8, 0–13–110370–9.
For more info on C, take a look at www.lysator.liu.se/c/index.html. I expect you to have both a command of the language and a clear and concise programming style.
You can compile and run programs. If you are intimidated by anything longer than a three-page program and have not developed techniques in debugging or functional decomposition, I strongly recommend dropping the class and getting a copy of:
Brian W. Kernighan and Rob Pike, The Practice of Programming, Prentice-Hall, 1999, ISBN 0–20–161586-X.
You have a rudimentary knowledge of using a Linux system.
If you are unfamiliar with any of these items, it should not necessarily deter you from taking the course (most are easy to learn) but you may wish to speak with me. If, on the other hand, you feel that you have difficulty programming then I recommend that you drop the course.