This is an article on how memory and software interact. The article is more of a book with its 100 pages so it is split into 9 pieces. It is Linux-focused so it gives a good alternative view on the crucial interaction of HW-SW.
A highly recommended read for anyone who wants to know more about low-level programming.
Part 1 (Introduction)
Part 2 (CPU caches)
Part 3 (Virtual memory)
Part 4 (NUMA systems)
Part 5 (What programmers can do - cache optimization)
Part 6 (What programmers can do - multi-threaded optimizations)
Part 7 (Memory performance tools)
Part 8 (Future technologies)
Part 9 (Appendices and bibliography)