
linux紧急学习
不动心、
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
epolloneshot是怎么实现的
在内核把发生的事件和文件描述符都返回给用户空间之后,会判断if (epi->event.events & EPOLLONESHOT),如果为真,那么就会将events修改为EP_PRIVATE_BITS。而这个位图定义为:#define EP_PRIVATE_BITS (EPOLLWAKEUP | EPOLLONESHOT | EPOLLET | EPOLLEXCLUSIVE)也就是说,用户自定义的关注事件都被清除了。...原创 2021-09-05 15:33:21 · 393 阅读 · 0 评论 -
malloc的过程
内存中堆和栈的大小在加载的时候是固定的也就是说,可执行文件加载到内存中的时候,就给栈和堆划分了固定大小的空间,vm_area_struct结构体指明了一个连续区域的头地址和尾地址。所谓的栈和堆的动态增长,并不是指堆和栈空间的头尾指针发生变化,它们是不会改变的。变的只是两个指针:栈顶的指针和堆顶的指针。malloc的两种方法malloc当然会先从空闲页面中找合适大小的页面。但是如果找不到,需要分配新的页面。这时候有两种方法:brk()调用,将堆顶的指针brk往上推mmap()调用,在文件映射区域原创 2021-07-23 17:50:16 · 633 阅读 · 0 评论 -
Linux中伙伴算法分配的是物理内存
malloc分配的是虚拟页面。在第一次访问时产生缺页中断,操作系统负责分配物理页面,映射到这些虚拟页面上。而伙伴算法解决的就是怎样分配物理页面。伙伴算法是一个门户,用户控件的malloc、内核空间的vmalloc和kmalloc都通过伙伴算法来分配物理页面。...原创 2021-07-23 15:28:01 · 196 阅读 · 0 评论 -
共享内存的实现原理
shmget物理内存_共享内存的几点总结IPC共享内存shmget函数创建一片共享内存空间,返回这片共享内存的id。shmat调用能将这片共享内存空间映射到自己进程的虚拟内存空间,返回虚拟地址。两个进程要通过共享内存进行通信,必然要映射到同一片物理内存。如何保证这一点呢?shmget函数有一个参数是shm_key,它能唯一的标志一片物理内存。第一个进程用某个key创建了共享内存空间,而另一个进程使用相同的key调用shmget时,不会创建新的共享内存,而是直接返回前一个进程创建的。IPC共享内存实原创 2021-07-21 21:32:49 · 733 阅读 · 0 评论 -
两种内存映射:普通文件和匿名文件
普通文件将可执行文件加载到内存中,进行的映射是普通文件的映射。比如.data段、.bss段、.text段等。在cpu第一次访问相关页面的时候,发生缺页中断,才真正将磁盘中的页面缓存到物理内存中。对于.bss段,不占据实际的磁盘空间,只在段表中记录大小,在符号表中记录符号。当文件加载运行时,才分配空间以及初始化。这就是csapp中提到的如果区域比文件区大,就用零来填充这个区域的余下部分。匿名文件堆、栈都是匿名文件映射。虚拟页面并不和磁盘中的文件发生映射。CPU第一次引用一个区域内的匿名页面时,发生缺页原创 2021-07-21 17:59:42 · 1399 阅读 · 0 评论 -
vm_area_struct的作用:Linux缺页处理
进程的task_struct中存了mm_struct的指针mm,task_struct中存了vm_area_struct的链表结构每个vm_area_struct都代表虚拟内存空间中一段连续的、具有相同访问权限的区域。包含下面的成员:vm_start:指向这个区域的起始处vm_end:指向这个区域的结束处vm_prot:描述这个区域所有页的读写许可权限vm_flags:描述这个区域内的页面是与其他进程共享的还是私有的vm_next:指向链表下一个区域结构当访问某个页面发生缺页中断,需要查询原创 2021-07-21 17:45:35 · 405 阅读 · 0 评论 -
Core i7的四级页表翻译过程
虚拟地址中真正用于寻址的部分是48位物理地址是52位每个物理页面的大小是4KB,因此在一个页面中寻找某个字节,需要一个12位的数字定位(因为212=40002^{12} = 4000212=4000)。所以虚拟地址用36位来关联一个物理页面,用12位来关联这个物理页面中具体的某一个字节。物理地址用40位定位一个物理页面,用12位来定位这个物理页面中具体的某一个字节。所以物理内存中,每个页面的基地址都是4KB对齐的,也就是说每个页面的第一个字节的物理地址,低12位都是0。每一级的页表,大小都是一个物理原创 2021-07-21 17:09:35 · 775 阅读 · 0 评论 -
一级页表在物理内存上是连续的
困惑了很久的问题。task_struct中有一个成员mm_struct,mm_struct有一个成员pgd,每次要进行进程切换的时候,通过pgd来修改cr3寄存器中的值,将它修改为进程的一级页表的物理地址。每张页表在物理内存上是连续的,所以获得这个地址之后,就可以访问一级页表中的每一项了。pgd是一个指针,指向的是一级页表。但是它并不是物理地址,而是虚拟地址。所以在修改寄存器cr3的时候,需要先转换为物理地址:#define cpu_switch_mm(pgd,mm) cpu_do_switch_mm原创 2021-07-06 00:52:51 · 856 阅读 · 0 评论 -
用等待队列实现阻塞的系统调用
什么是等待队列?等待队列可以看作是双向链表,但队列头和队列成员不是同一种数据结构上图中,能看出队列头包含一个自旋锁(用于互斥访问,保证安全)和两个指针,而等待队列的成员包含一个flags域和一个task域以及两个指针。队列头可以看作是某一种资源,而队列的成员可以看作是请求这个资源而不得的人(进程)。怎么用等待队列实现阻塞?一个进程请求某项资源的过程(比如read某个文件)如下:1.用当前的进程描述块(PCB)初始化一个等待队列成员,表示一个等待任务,让这个新创建的队列成员的task域指向当前的原创 2021-06-19 23:35:49 · 200 阅读 · 3 评论