See http://pdos.csail.mit.edu/6.828/xv6/