linux core

1.pgd表只做用户空间的映射,并且必须通过MMU
2.vm_area_struct 是进程用户空间已映射到物理空间的虚拟地址区间
3.struct page用于描述物理页信息,但页内容不在该结构中,通过系统全局变量struct page mem_map[]来记录每个物理页。
4.内核地址空间的映射不能过MMU, 系统空间映射(3G开始)到物理空间0G起始,具体代码:

  1. PAGE_SHIFT = 12
  2. PAGE_OFFSET = 3GB  
  3. vitr_to_phys(vadd)  
  4.   return vadd - PAGE_OFFSET  
  5.     
  6. 内核空间的虚拟地址vaddr是通过如下方式找到它对应物理地址的page结构:  
  7. vitr_to_page(vadd)  
  8.     index = virt_to_phys(vadd) >> PAGE_SHIFT  
  9.     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。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值