Lots of good suggestions on the list. I would add a few (maybe advanced ones) that I don't think I saw:
* write a device driver for a real or virtual device; hook into the various kernel virtual filesystems that allow userspace interaction.
* write a small network stack (for example a raw protocol on top of ethernet).
* add a scheduling algorithm or mess with an existing one; analyze its performance impact.
Lots of new-to-me tools in that list were interesting. Back in my day, we had to use a serial port console, and if we were fancy we would set it up so that you could remotely cycle the computer's power when it hung up (uphill both ways in the snow).
* write a device driver for a real or virtual device; hook into the various kernel virtual filesystems that allow userspace interaction.
* write a small network stack (for example a raw protocol on top of ethernet).
* add a scheduling algorithm or mess with an existing one; analyze its performance impact.
Lots of new-to-me tools in that list were interesting. Back in my day, we had to use a serial port console, and if we were fancy we would set it up so that you could remotely cycle the computer's power when it hung up (uphill both ways in the snow).