1.pgd表只做用户空间的映射,并且必须通过MMU
2.vm_area_struct
是进程用户空间已映射到物理空间的虚拟地址区间
3.struct page用于描述物理页信息,但页内容不在该结构中,通过系统全局变量struct page mem_map[]来记录每个物理页。
4.内核地址空间的映射不能过MMU,
系统空间映射(3G开始)到物理空间0G起始,具体代码:
- PAGE_SHIFT = 12
- PAGE_OFFSET = 3GB
- vitr_to_phys(vadd)
- return vadd - PAGE_OFFSET
- 内核空间的虚拟地址vaddr是通过如下方式找到它对应物理地址的page结构:
- vitr_to_page(vadd)
- index = virt_to_phys(vadd) >> PAGE_SHIFT
- return mem_map[index]
5.初始化虚拟内存区域的内容时,会把虚拟内存区域和一个磁盘文件对象对应起来,这个过程叫内存映射(memory mapping),
Linux的缺页异常处理程序会先检查一个虚拟地址是哪个area内的地址,
如果这个虚拟地址不属于任何一个area,将发生一个段错误,终止进程
6.系统调用时,中间过程需要调用
Copy_to_user()和Copu_from_user()函数进行内核和用户之间的参数传递。
Entry.s系统调用的表项。asm/unistd.h系统调用号的宏定义
7.进程是操作系统分配资源的最小单元,线程是操作系统调度的最小单元。资源表示计算资源(cpu)和存储资源(内存和磁盘)
8.fork创建的子进程采用了copy-on-write的方式。
9.
在Linux系统中,线程是使用clone系统调用,clone是一个轻量级的fork,它只是一个独立的逻辑流,和主线程共享进程的上下文信息。线程和进程一样也是由内核来管理调度,只是如果是同一个进程下的两个线程切换,保存的线程数据仅有线程id,寄存器和栈数据
10.
扇区是基本的物理单元,大小为4KB。磁盘块一般为4KB - 64KB,包含一个或者多个扇区。主存和磁盘交换数据时以块为基本单位
11.
假设磁盘控制器读端口是0xa0,CPU发起IO读的流程如下:
1. CPU把命令,逻辑块号,目的虚拟内存地址,发送到0xa0端口,发起一个磁盘读请求
2. 磁盘控制器把逻辑块号翻译成对应的扇区位置读取扇区,由DMA(直接内存访问,Direct Memery Access)控制器执行磁盘数据到内存的传输,不需要CPU的参与(其中内存和磁盘交互也使用了缓存原理,在内存中开辟了一个缓冲区page cache)
3. 当DMA传输结束后,磁盘控制器采用中断的方式通知CPU读取完毕
=======================================================================================================
1. 黑色+红色 箭头展示了虚拟地址空间到物理空间的映射关系
2. 蓝色箭头涉涉及到文件的映射操作mmap(),相比匿名映射,文件映射多了文件层的磁盘IO。