Linux内核设计与实现(15)第十五章:进程地址空间

1. 虚拟地址空间

定义:地址空间就是每个进程所能访问的内存地址范围,是一段连续的虚拟内存空间.
	每个进程都有唯一的地址空间,彼此之间互不干扰
	
背景(为什么需要虚拟地址空间?):早期的计算机运行方式是直接将程序运行在物理内存上的三个问题

大小: 4GB大小,有时甚至会超过实际物理内存的大小。

组成:linux下,进程虚拟空间分为:操作系统占1GB,进程占3GB。
	内核空间,栈,动态库,堆,bss段数据,数据段(只读数据段),代码段,保留区域

映射:地址空间最终会通过页表映射到物理内存上,因为内核操作的是物理内存。
	两个映射:
		映射1:建立虚拟空间和可执行文件的映射关系
		映射2:建立虚拟空间的各个页映射到相应的物理地址的映射

内存区域: 可被访问的合法地址空间称为内存区域(memory areas)
	
页错误:当cpu执行进程的某个页面时,发现他要访问的页(虚拟地址的页)没有在物理内存中,而导致的中断(页错误)

详细参考 虚拟地址空间
https://blog.csdn.net/lqy971966/article/details/119378416

2. 内存描述符 mm_struct

2.1 内存描述符 mm_struct

定义:

内存描述符用来表示进程的地址空间,用mm_struct表示

1. start_code、end_code分别表示代码段的起始、结束地址,
2. start_data、end_data分别表示数据段的起始、结束地址,
3. mm_struct通过allocate_mm()宏从slab缓存中分配得到。
4. 在进程描述符task_struct中,mm域存放该进程的内存描述符
5. 内核线程没有进程地址空间,也没有相关的内存描述符
	所以内核线程对应的进程描述符中mm域为空。内核线程不需要访问任何用户空间的内存。

内部的mmap和mm_rb两个数据结构表示的内容一样,此处做了冗余。
前者为链表,便于高效遍历所有;后者为红黑树,便于高效搜索

2.2 内核线程没有进程地址空间

对Linux来说,用户进程和内核线程都是 task_struct 的实例,
唯一的区别是内核线程是没有进程地址空间的(内核线程使用的内核地址空间)。
内核线程的mm描述符是NULL,即内核线程的tsk->mm域是空(NULL)。

2.3 进程是用户进程还是内核线程

内核调度程序在进程上下文的时候,会根据tsk->mm判断即将调度的进程是用户进程还是内核线程。
但是虽然内核线程不用访问用户进程地址空间,但是仍然需要页表来访问内核自己的空间。
而对任何用户进程来说,他们的内核空间都是100%相同的,

所以内核会借用上一个被调用的用户进程的mm_struct中的页表来访问内核地址,这个mm_struct就记录在active_mm。
简而言之就是,对于内核线程,tsk->mm == NULL表示自己内核线程的身份,
而tsk->active_mm是借用上一个用户进程的mm_struct,用mm_struct的页表来访问内核空间。
对于用户进程,tsk->mm == tsk->active_mm。

3. 分配进程地址空间(直接用GFP_ATOMIC,不用GFP_KERNEL)

参考 kernel/fork.c 中的宏 allocate_mm
#define allocate_mm()    (kmem_cache_alloc(mm_cachep, GFP_KERNEL))
#define free_mm(mm)    (kmem_cache_free(mm_cachep, (mm)))

详细接口参考:
Linux内存管理之slab 2:slab API
https://blog.csdn.net/lqy971966/article/details/119801912

分配进程地址空间时,都是从slab高速缓存中分配的

[root@localhost home]# cat /proc/slabinfo | grep mm_struct
mm_struct             60     60   1600   20    8 : tunables    0    0    0 : slabdata      3      3      0
[root@localhost home]#

4. 虚拟内存区域(VMA)

内存区域在linux中也被称为虚拟内存区域(VMA),它其实就是进程地址空间上一段连续的内存范围。

struct vm_area_struct {		//linux/mm_types.h

5. 地址空间和页表

5.1 页表:

地址空间中的地址都是虚拟内存中的地址,而CPU需要操作的是物理内存,所以需要一个将虚拟地址映射到物理地址的机制。
这个机制就是页表。

地址的转换工作需要通过查询页表才能完成:

将虚拟地址分段,使每段虚拟地址都作为一个索引指向页表,而页表项则指向下一级别的页表或指向最终的物理页面。

5.2 3级页面(PGD PMD PTE)

linux中使用3级页面来完成虚拟地址到物理地址的转换。

1. PGD - 全局页目录,包含一个 pgd_t 类型数组,多数体系结构中 pgd_t 类型就是一个无符号长整型
2. PMD - 中间页目录,它是个 pmd_t 类型数组
3. PTE - 简称页表,包含一个 pte_t 类型的页表项,该页表项指向物理页面

图:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源
大学生在线租房平台管理系统按照操作主体分为管理员和用户。管理员的功能包括报修管理、报修评价管理、字典管理、房东管理、房屋管理、房屋收藏管理、房屋留言管理、房屋租赁管理、租房论坛管理、公告信息管理、留言板管理、用户管理、管理员管理。用户的功能等。该系统采用了Mysql数据库,Java语言,Spring Boot框架等技术进行编程实现。 大学生在线租房平台管理系统可以提高大学生在线租房平台信息管理问题的解决效率,优化大学生在线租房平台信息处理流程,保证大学生在线租房平台信息数据的安全,它是一个非常可靠,非常安全的应用程序。 管理员权限操作的功能包括管理公告,管理大学生在线租房平台信息,包括房屋管理,培训管理,报修管理,薪资管理等,可以管理公告。 房屋管理界面,管理员在房屋管理界面中可以对界面中显示,可以对房屋信息的房屋状态进行查看,可以添加新的房屋信息等。报修管理界面,管理员在报修管理界面中查看报修种类信息,报修描述信息,新增报修信息等。公告管理界面,管理员在公告管理界面中新增公告,可以删除公告。公告类型管理界面,管理员在公告类型管理界面查看公告的工作状态,可以对公告的数据进行导出,可以添加新公告的信息,可以编辑公告信息,删除公告信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值