How does a device driver communicate with a device?