Student: Not assigned yet
Owner: Cristiano Giuffrida email@example.com
SVN branch name: N/A
MINIX3 is quickly evolving to become a highly-updateable operating system, in which OS updates (as opposed to application updates) can be installed offline or on-the-fly and be quickly rollbacked when something goes wrong.
For offline OS updates (the good old download-install-reboot-see_what_happens routine :) ), we want to provide the user with the ability to switch among completely different versions of the operating system at boot time when some update didn't really work as expected (or simply for testing purposes). Each version must include the kernel, but also all the dependent operating system services (e.g. the process manager).
For OS updates that are installed on-the-fly (live updates), we want the user to be notified when an important operating system update is available, have MINIX3 install the update online, and automatically verify that the system is still functioning correctly. If the update fails for some reason (e.g. one of the newly installed components crashes), the system will automatically rollback to the previous version without even bugging the user. Note that each live update can contain a small patch (e.g. a security update) or a major operating system update that affects a number of operating system components to add new features. Consider, for example, a live update that replaces the memory manager and changes critical memory management policies on-the-fly!
For comparison, see Ksplice on Linux, which can only handle CVE patches on-the-fly, usually consisting of a very limited number of lines of code.
In this project, your job is to add versioning support to MINIX3 to help realize this vision. This will involve making many changes to the core system, working with the new Minix3 package manager (NetBSD's pkgsrc), and interacting with the emerging live update infrastructure. The kernel and each operating system service will need to have a version number assigned to univoquely identify each component. Part of your job is to design a versioning framework that will be able to automatically maintain and increase version numbers without bugging the developers, as well as to export a clean interface to the applications. The integration with the package manager for live updates and with the boot process for offline updates will follow, but ideally the framework should be of general application to cope with future application scenarios.