また物理アドレスとの関係で言えば、プロセス空間は仮想記憶システムの複雑な アドレス変換機構で管理されているのに対し、カーネル空間は物理アドレスに ストレートにマッピングされています。 下記にカーネルの仮想アドレス、物理アドレス、バスアドレスの関係を インテルのx86 CPUの場合について、示します。 /usr/src/linux/include/asm/io.hに下記のような関数が定義されています。
#define virt_to_bus virt_to_phys #define bus_to_virt phys_to_virt extern inline unsigned long virt_to_phys(volatile void * address) { return __pa(address); } extern inline void * phys_to_virt(unsigned long address) { return __va(address); } in /usr/src/linux/include/asm/page.h #define __pa(x) ((unsigned long)(x)-PAGE_OFFSET) #define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET)) #define __PAGE_OFFSET (0xC0000000) #define PAGE_OFFSET ((unsigned long)__PAGE_OFFSET)これらの定義から、インテルx86 CPUにおいては
00000000-0009fbff : System RAM 000a0000-000bffff : Video RAM area 000c0000-000c7fff : Video ROM 000c8000-000cc7ff : Extension ROM 000f0000-000fffff : System ROM 00100000-07ffffff : System RAM 00100000-0022f8d5 : Kernel code 0022f8d6-002aa143 : Kernel data f8000000-fbffffff : S3 Inc. ViRGE/DX or /GX ffbeb000-ffbebfff : Adaptec AIC-7881U ffbefc00-ffbefc7f : Digital Equipment Corporation DECchip 21140 [FasterNet] ffbefc00-ffbefc7f : eth0 fff80000-ffffffff : reserved