You are right that, in theory, the kernel can decide based on finer permissions for the memory region object, but such a decision-making procedure should be in the page error handler, which (I suppose) would make access to ordinary memory very expensive.
Instead, the kernel uses these x86 simplification rules:
- the right of access to reading always implies the right to access.
- The right to write access always implies the right to read.
Source: Understanding the Linux Kernel, 1st Edition, p. 205
source share