Hi, I'm about to graduate with a CS degree from New Mexico Tech, and every course I have taken so far has used linux (and C) for a backdrop. In Systems Programming, a second-year course, we had many projects: 1) Write a program to generate a recursive directory pit. Find out why it stops after a while and what you need to do to remove it after you make it. 2) Write an application to multiply matrices. the catch: the matrices will be stored in a file on a different computer. You have to use a client/server model to get the information. 3) rewrite cat, using both a block-structured approach and a character-structured approach. See by how much one is faster than the other. 4) write a simple shell. Your shell should at least be able to take commands, but once you have that done, add more features like I/O redirection, filename completion, etc.
The kind of material is not very suited to an OS course, just because it isn't about interacting with the OS. However, it is useful for students that haven't had a hands-on course in OS-specific programming. Anyway, besides other linux-based projects for other classes (writing an ADA-CS compiler for LinuxPPC among the more interesting,) we also have an OS class that is very interactive with the Linux Kernel. It's a third-year course, but I'm taking it now. Here are some of the projects I have encountered so far: 1) (starting easy) Become familiar with Linux by installing it on a machine, and then download some kernel source from www.kernel.org, and reconfigure and recompile the kernel. 2) make your own system call. What's involved here is learning how to pass user information to the kernel, and how to set up your system call in the linux kernel (with include/asm/unistd.h and (for us) arch/i386/kernel/entry.S). 3) Implement your own scheduling algorithm. Incorporate it into the Linux kernel by writing a system call to allow the superuser to switch between the default scheduler and the one you wrote. Then, using lmbench, compare the performance benchmarks of your scheduler with that of the builtin Linux scheduler. The more complicated the algorithm, the more points it may be worth (so implementing a lottery-based scheduling algorithm is worth more than a simple least-first algorithm) 4) Something involving cooperative user-space threads (we haven't gotten that far in class yet; the assignment has only been hinted at.)
In all of these projects a major emphasis was that the kernel must not crash under any circumstances (otherwise we might as well do windows programming.) So we had to check all kinds of possible dangerous situations (somebody passes a null buffer for the kernel to store information in, etc.) Also, for these projects, we are allowed to work in groups of up to 4 people. While the coding itself does not lend itself directly to group work, the brainstorming is definitely helped along (four heads are usually better than one.)
For more information about our operating systems course, check out www.cs.nmt.edu/~cs325.
kudos on trying to include linux in the standard CS curriculum.
1) Write a program to generate a recursive directory pit. Find out why it stops after a while and what you need to do to remove it after you make it.
2) Write an application to multiply matrices. the catch: the matrices will be stored in a file on a different computer. You have to use a client/server model to get the information.
3) rewrite cat, using both a block-structured approach and a character-structured approach. See by how much one is faster than the other.
4) write a simple shell. Your shell should at least be able to take commands, but once you have that done, add more features like I/O redirection, filename completion, etc.
The kind of material is not very suited to an OS course, just because it isn't about interacting with the OS. However, it is useful for students that haven't had a hands-on course in OS-specific programming. Anyway, besides other linux-based projects for other classes (writing an ADA-CS compiler for LinuxPPC among the more interesting,) we also have an OS class that is very interactive with the Linux Kernel. It's a third-year course, but I'm taking it now. Here are some of the projects I have encountered so far:
1) (starting easy) Become familiar with Linux by installing it on a machine, and then download some kernel source from www.kernel.org, and reconfigure and recompile the kernel.
2) make your own system call. What's involved here is learning how to pass user information to the kernel, and how to set up your system call in the linux kernel (with include/asm/unistd.h and (for us) arch/i386/kernel/entry.S).
3) Implement your own scheduling algorithm. Incorporate it into the Linux kernel by writing a system call to allow the superuser to switch between the default scheduler and the one you wrote. Then, using lmbench, compare the performance benchmarks of your scheduler with that of the builtin Linux scheduler. The more complicated the algorithm, the more points it may be worth (so implementing a lottery-based scheduling algorithm is worth more than a simple least-first algorithm)
4) Something involving cooperative user-space threads (we haven't gotten that far in class yet; the assignment has only been hinted at.)
In all of these projects a major emphasis was that the kernel must not crash under any circumstances (otherwise we might as well do windows programming.) So we had to check all kinds of possible dangerous situations (somebody passes a null buffer for the kernel to store information in, etc.) Also, for these projects, we are allowed to work in groups of up to 4 people. While the coding itself does not lend itself directly to group work, the brainstorming is definitely helped along (four heads are usually better than one.)
For more information about our operating systems course, check out www.cs.nmt.edu/~cs325.
kudos on trying to include linux in the standard CS curriculum.
(rathstar)