1. A method for accessing hardware resources of a device, the method comprising: allocating the hardware resources to one or more functions, wherein the hardware resources include variable resources and permanent resources; allocating address space for an input/output (I/O) mapping of control registers in a system memory that is separate from the device; for each function of the one or more functions, assigning a respective portion of the allocated address space; assigning space within each respective portion of the allocated address space to store: addresses of the variable resources available for allocation to the function to which the respective portion is assigned; and an address range of a set of the permanent resources that have been allocated to the function to which the respective portion is assigned; providing a translation table having a plurality of entries; storing within each entry of the translation table, a different internal address of a permanent resource of the set of permanent resources that has been allocated to a particular function of the one or more functions; and using a function identifier (ID) of a function requesting a given permanent resource and an address of a programmed I/O (PIO) request to index into a particular location of the translation table.