Research has shown that operating systems hamper the performance of cache memories because of their large code and data size, and intermittent behavior. Little research has addressed this issue recently. We conduct a study of the Linux kernel to analyze the effects of the kernel on cache performance and make suggestions for future cache design. Our methodology uses real-time hardware monitoring and small kernel modifications to distinguish between user and kernel generated references. We gather data for four typical workloads and analyze the cache behavior of the kernel. Our analysis suggests that the kernel significantly affects the cache miss rate. We classify cache misses as types of interference and show that the kernel suffers because of interference with memory references that are generated in user mode. Adding a separate cache that is dedicated to kernel references eliminates this interference, but does not improve the overall miss rate because of the traceoff with cache size. Although associativity continues to be an important parameter in cache design, the kernel references moderate the diminishing returns of associativity. Effective access time analysis shows that associativity is not always justified because of the latency of the extra multiplexing required in an associative cache. We give suggestions concerning the use of associativity in cache design. We conclude that this decision should consider factors such as cache size, miss penalty, associativity penalty, and typical workloads.