进程是内核提供的一种机制,使用各种资源的一种方式
内核和用户态的进程的执行环境不同,编译使用的编译器不同,用户态的进程是一种编程模型
内核中模拟进程的数据对象task_struct,mm_struct,address_space这些都是逻辑结构,实际在执行的时候还是一条条的指令
这些数据结构都是编程的模型和范式,影藏在执行机制后有mmu完成的虚拟地址地址或线性地址到物理地址的转换
一旦系统调用进入到内核后,就会像进入了另一个环境,内核代替进程来执行
内核如何知道进程是否要挂起?
内核判定进程依赖的资源需要等待,或者是网络包或者是文件内容
mmap映射文件后的效果比直接的文件操作有哪些不同?
直接的文件read/write操作需要经过系统调用,并且读写有拷贝
mmap直接将文件的页面操作直接映射到了进程的地址空间(也就是进程的页表中建立了相关的表项)
对地址的访问就会直接映射到文件相关的页,此时并没有所谓的系统调用陷入内核,也没有内存拷贝
既有内核页表也有进程页表,内核页表由所有的进程上下文、中断上下文共享,进程的页表放在cr3寄存器中,pgd是在mm_struct中
进程页表和内核页表需要同步(页表和vm_area是不同的概念,vm_area是管理虚拟地址空间,页表是管理物理内存的)
逻辑地址与虚拟地址的区别?
内核提供的进程机制也包括了进程的地址空间(虚拟地址空间):0~3G
线性地址也是逻辑地址,是在段页式管理内存的时代遗留下来的概念,逻辑地址就是指的段内的偏移
现在的很多代码反汇编后,还保留着段寄存器的方式,但是cpu已经进化,没有es,ds,ss,cs等段寄存器了,但是现在的编译器还是会给出这样的指令,进化后的cpu还是能执行这些指令,这里的兼容的不是汇编指令,而是机器码,cpu只对机器码兼容,编译器只需要保证
不同的汇编指令映射到相同的机器码,也就是指令兼容
阅读(1051) | 评论(0) | 转发(0) |