**********************************************************************
1)但凡经过MMU页表拜访的地址都叫虚拟地址,而一旦启用了MMU,那CPU宣布的一切地址都是虚拟地址
内核用到的地址规模是3G-4G(不是很准确,与CPU系统有关吧),这当然就称为内核虚拟地址了(这跟用户态的0-3G的用户虚拟地址相对应),在3G-4G这段规模内,有段子集3G -3G+main_memory_size,这段主存巨细的虚拟地址空间,由于在MMU页表映射时是选用的是平整的线性映射,在LDD里所以又给她起个专门称号,叫内核逻辑地址
2) 用不同姓名分开叫的原因,与一切的姓名的效果相同,是为了便利称号,便利描绘,因而能够说,在内核代码里,关于内核逻辑地址,你能够经过简略的偏移(3G)(rwen2012兄所述),获晓对应的物理地址,而不是内核逻辑地址的那部分内核虚拟地址,是不能获晓物理地址的
************************************************************************
便是假定你的物理主存是256M,总线地址为0-0x10000000(256M),那么虚拟地址便是0xC0000000(3G)-0xD0000000(3G+256M),换句话说,内核逻辑地址0xC0000000对应物理主存地址0,内核逻辑地址0xD0000000对应物理地址256M,那么从内核逻辑地址,就能够直接减去偏移量PHYS_OFFSET,比方为0xC0000000,就能够得到物理主存地址了,这种映射就叫做平整的线性映射
************************************************************************
仍是不明白啊
便是假定你的物理主存是256M,总线地址为0-0x10000000(256M),那么虚拟地址便是0xC0000000(3G)-0xD0000000(3G+256M),换句话说,内核逻辑地址0xC0000000对应物理主存地址0,内核逻辑地址0xD0000000对应物理地址256M,那么从内核逻辑地址,就能够直接减去偏移量PHYS_OFFSET,比方为0xC0000000,就能够得到物理主存地址了,这种映射就叫做平整的线性映射
你的回复是指把一切的主内存都映射到了内核空间?那用户空间不就拜访不到主内存了你么?我在清华大学出书的一本书上写到:
vmalloc()分配的地址不是内核逻辑地址,可是在它紧跟着的比方程序里边又说 找到vmalloc()分配的地址对应的内核逻辑地址,这是怎样回事啊,他还给出一大段代码找vmalloc()分配的地址对应的内核逻辑地址,已然说分配的不是内核逻辑地址怎样又会找它对应的内核逻辑地址呢。
struct page *virt_to_page(void *kaddr),需求的参数时内核逻辑地址,那么怎样把vmalloc()分配的地址转化为page结构呢
***********************************************************************
主内存应该是悉数映射到内核空间了,可是映射了并不代表就使用了,因而用户空间的内存映射也能够映射到相同的物理内存空间(不过即便内核使用了一切的物理内存,应该也能够经过缺页恳求技能取得内存)。内核在初始化时将一切的物理内存构成了一个page结构数组,vmalloc分配的是3g+main_memory_size之上的虚拟空间,由于在内核初始化时并没有树立这一段虚拟内存空间的映射,因而就需求树立相应的页表映射。用page_address()函数即可回来页的内核虚拟地址。
************************************************************************
从0xc0000000到0xffffffff-128M的内核空间确实是映射到0到896M的物理空间上,并且是经过特别地初始化页表后进行的线性映射,可是物理内存被映射后不一定被分配,假如没有被内核分配,则能够由用户进程分配,该页一起被内核与用户映射,
***********************************************************************
LDD 15.1.1在介绍内核虚拟地址的原话
“ All logical addresses are kernel virtual addresses, but many kernel virtual addresses are not logical addresses. For example,memoryallocated by vmalloc has a virtual address (but no direct physical mapping).”
配图:
内核虚拟地址和内核逻辑地址相似,都是把内核空间的地址映射到物理地址上,可是,内核虚拟地址不具有内核逻辑地址的一些特色,比方线性、和物理地址1对1映射的特色。
一切的逻辑地址都是内核虚拟地址,但反之否则。例如, vmalloc 分配的内存有虚拟地址(但没有直接物理映射)。
在LDD中虚拟地址便是1G的内核空间的线性地址,而逻辑地址则是逐个映射物理内存的那一块,也叫做直接映射或平整映射,便是ZONE_DMA+ZONE_NORMAL区。
在ULK中,各种地址的由来主要是从分段和分页机制讲起的(不同于LDD是从模块使用的视点来说的),所以分的很清楚。但进场率最高的仍是线性地址。
所以,我认为,(不一定正确,仅参阅),管它什么各种地址,只需捉住物理地址以及对应内核1G地址的映射规模和映射方法就行,详细看语境吧。