hardware abstraction layer vs driver