`
waterlife
  • 浏览: 65917 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Linux内核之内核缓冲区的管理

阅读更多

Linux内核采用slab方法来管理内核缓冲区,slab类似于面向对象的方法进行内核区的分配和回收。

 

1. slab可能由1个,2个,4个.......最多32个连续的物理页面构成;

2. 每个slab都有slab的描述结构slab_t,用于同一种对象或多个slab通过描述结构队列头形成一个双向链队列。每个slab结构逻辑上分成3段,对一段是各个slab上所有的对象都已分配使用;第二个是各个slab已经部分使用;最后一段是各个slab上的全部对象都处于空闲状态。

3. 每个slab上都有一个对象区,这是对象数据结构的数组,以对象的序号为下标就可以得到具体对象的起始地址;

4. 每个slab上还有一个对象链接数组,用来实现一个空闲对象链;

5. 每个slab上有个字段,表明slab上第一个空闲的对象;

6. slab上还有一个计数器,当一个空闲对象分配时,计数器加1,并从空闲队列中脱链;

7. 当释放一个对象时,只要调整链接数组中的相应元素以及计数器,并且根据此slab的使用情况调整其在slab中的位置;

8. slab的头部都有一个着色区,用来和高速缓存对齐,并且每个slab的着色区尽量安排成不同大小,以使得不同slab上的同一位置的对象的起始地址在高速缓冲中相互错开;

9. 每个slab上最后一个对象也有一个小小的废料区是不用的,这是对着色区的补偿。但该区域与着色区的总和对于同一种对象的各个slab是个常数;

 

系统有个总的slab队列,其对象是各个其它对象的slab队头,其对象是各个其他对象的slab队头。对于大对象和小对象,slab结构略有不同。小对象的控制结构不是放在它所在的slab上,而是集中放置在另外的slab上。并非所有内核的数据结构都使用专用的缓冲区队列,一些不太常用的或初始化开销不大的还是使用通用的缓冲机制。

 

所以Linux中还有既类似于物理页面中所采用按大小分配的方法,又采用slab方式管理的通用缓冲池,称为slab_cache与cache_cache不同,它的顶层不是一个队列而是一个结构数组,数组中的每个元素指向一个不同的slab队列。这些slab队列的不同之处在于所载对象的大小,最小32,64直至128K。

 

分配一个不具slab队列的数据结构而不必为之使用整个页面时,就应该通过kmalloc()分配,释放是kfree();大小接近一个页面时,使用alloc_pages()。

vmalloc()从内核虚拟空间(3G以上)分配一块虚存以及物理内存,类似于系统调用brk();只不过brk()是由进程在用户空间启动并从用户空间分配,而vmalloc()则是在系统空间启动并分配的。由vmalloc()分配的空间不会被kswapd换出,因为kswapd只扫描各进程的用户空间;对于kmalloc()分配的空间,kswapd只是在各个slab队列中寻找和收集空闲不用的slab,不会将尚在使用的slab所占的页面换出

分享到:
评论

相关推荐

    Linux内核缓冲区管理

    Linux内核缓冲区管理 Linux内核缓冲区管理 Linux内核缓冲区管理

    Linux内核缓冲区管理 ppt

    Linux内核缓冲区管理 ppt 本人制作的操作系统讲稿,感觉讲的还比较清晰,希望对你有帮助

    linux内核缓冲区管理课件.rar

    linux内核缓冲区管理课件.rar

    linux内核缓冲区管理

    概括介绍Linux的缓冲区管理,对linux的缓冲区管理进行说明,以pdf格式发布ppt格式的文件

    Linux2.6 slab内核缓冲区管理

    Linux2.6 slab内核缓冲区管理 讲的非常不错,对Linux内核的理解非常有帮助

    Linux2.6+slab内核缓冲区管理

    Linux2.6+slab内核缓冲区管理,个人认为图解讲的还是比较清晰的。有助于理解工作机制。

    Linux内核Slab内存缓冲区管理器.pdf

    Linux内核Slab内存缓冲区管理器.pdf

    linux内核缓冲区管理课件.avi

    linux内核缓冲区管理课件.avi

    深入分析Linux内核源码.chm

    第一章 走进linux 1.1 GNU与Linux的成长 1.2 Linux的开发模式和运作机制 ...2.4 Linux内存管理中Slab缓冲区 2.5 Linux中的VFS 2.6 Linux的连网 2.7 网络设备支持 2.8 模块支持 2.9 硬件接口 2.10 块设备 2.11 USB 设备

    Linux内核源代码情景分析 (上下册 高清非扫描 )

    2.10 内核缓冲区的管理 2.11 外部设备存储空间的地址映射 2.12 系统调用brk() 2.13 系统调用mmap() 第3章 中断、异常和系统调用 3.1 X86 CPU对中断的硬件支持 3.2 中断向量表IDT的初始化 3.3 中断请求队列的...

    linux内核调试方法总结

    4 记录缓冲区 5 syslogd/klogd 6 dmesg 7 注意 8 内核printk和日志系统的总体结构 9 动态调试 六 内存调试工具 1 MEMWATCH 2 YAMD 3 Electric Fence 七 strace 八 OOPS 1 ksymoops 2 kallsyms 3 Kdump 九 KGDB 1 ...

    Linux内核的内存管理探秘之三 物理内存的管理(二)页面周转与缓冲区.pdf

    Linux内核的内存管理探秘之三 物理内存的管理(二)页面周转与缓冲区.pdf

    Linux内核 内容很全

    内存管理 15 2.1 虚拟内存抽象模型 15 2.1.1 请求调页 17 2.1.2 交换 17 2.1.3 共享虚拟内存 18 2.1.4 物理寻址模式和虚拟寻址模式 18 2.1.5 访问控制 18 2.2 高速缓存 19 2.3 Linux页表 20...

    深入分析Linux内核源码

    深入分析Linux内核源码 前言 ...2.4 Linux内存管理中Slab缓冲区 2.5 Linux中的VFS 2.6 Linux的连网 2.7 网络设备支持 2.8 模块支持 2.9 硬件接口 2.10 块设备 2.11 USB 设备 2 参考文献

    linux 内核源代码分析

    2.10 内核缓冲区的管理 2.11 外部设备存储空间的地址映射 2.12 系统调用brk() 2.13 系统调用mmap() 第3章 中断、异常和系统调用 3.1 X86 CPU对中断的硬件支持 3. 2 中断向量表IDT的初始化 3. 3 中断请求...

    Linux编程--Linux内核

    Linux内核 前言 第1章 硬件基础与软件基础 6 1.1 硬件基础 6 1.1.1 CPU 7 1.1.2 存储器 8 1.1.3 总线 8 1.1.4 控制器和外设 8 1.1.5 地址空间 9 1.1.6 时钟 9 1.2 软件基础 9 1.2.1 计算机语言 9 1.2.2 什么是操作...

    深入理解Linux内核-勘误表

    这就是"等待队列".(有多种原因可以让进程进入TASK_INTERRUPTIBLE和TASK_UNINTERRUPTIBLE状态, 如等待缓冲区被填充, 等待 锁被释放等, 于是就构造一个链表, 链表中的进程都在等待同一事件的产生.).解Linux内核正版...

    论文研究-基于Linux内核的页面不可执行的研究与实现.pdf

    为了防范这类攻击,提出利用页面不可执行的方法,重载页表项中User/Supervisor位的含义,用来表示可执行/不可执行状态,并在IA32处理器上,基于Linux内核实现了这种方法。实验表明,该方法能有效地防范缓冲区溢出...

    LINUX内核源代码情景分析

    2.10 内核缓冲区的管理 2.11 外部设备存储空间的地址映射 2.12 系统调用brk() 2.13 系统调用mmap() . 第3章 中断、异常和系统调用 3.1 X86 CPU对中断的硬件支持 3. 2 中断向量表IDT的初始化 3. 3 中断...

Global site tag (gtag.js) - Google Analytics