Writing Linux Device Drivers: a guide with exercises