Caches are generally the top level or levels of the memory hierarchy and are almost always constructed out of SRAM. The main structural difference between a cache and other levels in the memory hierarchy is that caches contain hardware to track the memory addresses that are contained in the cache and to move data into and out of the cache as necessary. Lower levels in the hierarchy generally rely on software or a combination of hardware and software to perform this function.