Linux 操作系统以及驱动程序运行在内核空间,利用程序运行在用户空间,二者不能简单地使用指针传递数据,由于Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数据可能不在内存中。
Linux内核地址映照模型文章源自微观生活(93wg.com)微观生活-https://93wg.com/2931.html
x86 CPU采取了段页式地址映照模型。过程代码中的地址为逻辑地址,经由段页式地址映照后,才真正走访物理内存。文章源自微观生活(93wg.com)微观生活-https://93wg.com/2931.html
段页式机制如下图。文章源自微观生活(93wg.com)微观生活-https://93wg.com/2931.html
Linux内核地址空间划分文章源自微观生活(93wg.com)微观生活-https://93wg.com/2931.html
通常32位Linux内核地址空间划分0~3G为用户空间,3~4G为内核空间。注意这里是32位内核地址空间划分,64位内核地址空间划分是不同的。文章源自微观生活(93wg.com)微观生活-https://93wg.com/2931.html
Linux内核高端内存的由来文章源自微观生活(93wg.com)微观生活-https://93wg.com/2931.html
当内核模块代码或线程走访内存时,代码中的内存地址都为逻辑地址,而对应到真实的物理内存地址,需要地址一对一的映照,如逻辑地址0xc0000003对应的物理地址为0×3,0xc0000004对应的物理地址为0×4,… …,逻辑地址与物理地址对应的关系为文章源自微观生活(93wg.com)微观生活-https://93wg.com/2931.html
物理地址 = 逻辑地址 – 0xC0000000文章源自微观生活(93wg.com)微观生活-https://93wg.com/2931.html
假 设依照上述简单的地址映照关系,那么内核逻辑地址空间走访为0xc0000000 ~ 0xffffffff,那么对应的物理内存规模就为0×0 ~ 0×40000000,即只能走访1G物理内存。若机器中安装8G物理内存,那么内核就只能走访前1G物理内存,后面7G物理内存将会没法走访,由于内核 的地址空间已经全体映照到物理内存地址规模0×0 ~ 0×40000000。即便安装了8G物理内存,那么物理地址为0×40000001的内存,内核该如何去走访呢?代码中必需要有内存逻辑地址 的,0xc0000000 ~ 0xffffffff的地址空间已经被用完了,所以没法走访物理地址0×40000000文章源自微观生活(93wg.com)微观生活-https://93wg.com/2931.html
以上就是微观生活(93wg.com)关于“Linux用户空间与内核空间(理解高端内存)”的详细内容,希望对大家有所帮助!文章源自微观生活(93wg.com)微观生活-https://93wg.com/2931.html
评论