How Does Hardware and Software Communicate?