My current understanding is that the user does not have any way of knowing the kernel address space layout due to the protection mechanisms such as Kernel Address Space Layout Randomization (KASLR).
However, I see that if I use cat /proc/iomem
it shows address ranges for some memory-mapped devices and for kernel code and kernel data.
00000000-00000fff : reserved
00001000-0009dfff : System RAM
0009e000-0009ffff : reserved
000a0000-000bffff : PCI Bus 0000:80
000a0000-000bffff : PCI Bus 0000:00
000c0000-000c7fff : Video ROM
000cc800-000cd7ff : Adapter ROM
000e0000-000fffff : reserved
000f0000-000fffff : System ROM
00100000-783d5fff : System RAM
2a000000-347fffff : Crash kernel
783d6000-797d5fff : reserved
797d6000-79bf3fff : System RAM
79bf4000-7bbf3fff : reserved
7bbf4000-7e2fefff : System RAM
7e2ff000-7eafefff : reserved
7eaff000-7eefefff : ACPI Non-volatile Storage
7eeff000-7effefff : ACPI Tables
7efff000-7effffff : System RAM
7f000000-8fffffff : reserved
80000000-8fffffff : PCI MMCONFIG 0000 [bus 00-ff]
90000000-dfffefff : PCI Bus 0000:00
90000000-910fffff : PCI Bus 0000:04
90000000-910fffff : PCI Bus 0000:05
90000000-90ffffff : 0000:05:00.0
91000000-9101ffff : 0000:05:00.0
91100000-911fffff : PCI Bus 0000:02
91100000-9111ffff : 0000:02:00.3
91100000-9111ffff : igb
91120000-9113ffff : 0000:02:00.0
91120000-9113ffff : igb
91140000-91143fff : 0000:02:00.3
91140000-91143fff : igb
91144000-91147fff : 0000:02:00.0
91144000-91147fff : igb
91200000-91203fff : 0000:00:04.0
91200000-91203fff : ioatdma
91204000-91207fff : 0000:00:04.1
91204000-91207fff : ioatdma
91208000-9120bfff : 0000:00:04.2
91208000-9120bfff : ioatdma
9120c000-9120ffff : 0000:00:04.3
9120c000-9120ffff : ioatdma
91210000-91213fff : 0000:00:04.4
91210000-91213fff : ioatdma
91214000-91217fff : 0000:00:04.5
91214000-91217fff : ioatdma
91218000-9121bfff : 0000:00:04.6
91218000-9121bfff : ioatdma
9121c000-9121ffff : 0000:00:04.7
9121c000-9121ffff : ioatdma
91220000-9122000f : 0000:00:16.0
91221000-9122100f : 0000:00:16.1
91222000-912220ff : 0000:00:1f.3
91224000-912247ff : 0000:00:1f.2
91224000-912247ff : ahci
91225000-912253ff : 0000:00:1d.0
91225000-912253ff : ehci_hcd
91226000-912263ff : 0000:00:1a.0
91226000-912263ff : ehci_hcd
91227000-91227fff : 0000:00:05.4
91300000-913fffff : PCI Bus 0000:02
91300000-9131ffff : 0000:02:00.0
91320000-9133ffff : 0000:02:00.0
91340000-9135ffff : 0000:02:00.3
91360000-9137ffff : 0000:02:00.3
dffff000-dfffffff : pnp 00:00
e0000000-fbffffff : PCI Bus 0000:80
e0000000-e0003fff : 0000:80:04.0
e0000000-e0003fff : ioatdma
e0004000-e0007fff : 0000:80:04.1
e0004000-e0007fff : ioatdma
e0008000-e000bfff : 0000:80:04.2
e0008000-e000bfff : ioatdma
e000c000-e000ffff : 0000:80:04.3
e000c000-e000ffff : ioatdma
e0010000-e0013fff : 0000:80:04.4
e0010000-e0013fff : ioatdma
e0014000-e0017fff : 0000:80:04.5
e0014000-e0017fff : ioatdma
e0018000-e001bfff : 0000:80:04.6
e0018000-e001bfff : ioatdma
e001c000-e001ffff : 0000:80:04.7
e001c000-e001ffff : ioatdma
e0020000-e0020fff : 0000:80:05.4
feb00000-feb03fff : reserved
fec00000-fec00fff : reserved
fec00000-fec003ff : IOAPIC 0
fec01000-fec013ff : IOAPIC 1
fec40000-fec403ff : IOAPIC 2
fed00000-fed003ff : HPET 0
fed00000-fed003ff : PNP0103:00
fed18000-fed18fff : reserved
fed1c000-fed8ffff : reserved
fed1c000-fed1ffff : pnp 00:00
fed1f410-fed1f414 : iTCO_wdt.0.auto
fed20000-fed3ffff : pnp 00:00
fee00000-fee00fff : Local APIC
fee00000-fee00fff : reserved
ff000000-ffffffff : INT0800:00
ffc00000-ffffffff : reserved
100000000-207fffffff : System RAM
15ed200000-15ed9a1279 : Kernel code
15ed9a127a-15edf6c2bf : Kernel data
15ee165000-15ee472fff : Kernel bss
In this case, I am not sure what the KASLR is doing since I am able to know the address range of the kernel code and kernel data by using the above command.
Maybe I am misunderstanding what KASLR is actually doing, any help in understanding this better is really appreciated.