Linux内存管理重要的数据结构与函数(二)
2018-02-19 11:01
155 查看
当Linux需要将内存的一些页面换出到文件上时(swap),内存与交换设备(比如硬盘)就发生了关联。另一处关联是mmap系统调用将一个文件映射到内存中,这样可以加快文件的访问。对于swap,每一个swap设备或者文件被内核中一个swap_info_struct结构体所描述。 这个结构体定义在include/linux/swap.h头文件中(kernel 2.4)。
在swap_info_struct结构体中有一个unsigned short *类型的成员(swap_map)指向一个数组,且其中每一个短整数都代表一个页面。这个数组的大小是由swap_info_struct的另一个成员pages决定的,这个成员实际上也就指定了swap文件的大小。swap_map[0]说明了该文件的一些性质,例如哪些页面可供使用的位图。一般来说文件的开头与结尾的地方有一些盘上物理页面(现在在盘上的页面)是不能使用的。所以swap_info_struct另外的成员lowest_bit和highest_bit指明可以使用的范围。
Linux允许多个交换文件,且这些文件形成了一个数组:struct swap_info_struct swap_info[MAX_SWAPFILES];其中MAX_SWAPFILES的值为8。除此之外还将这些交换文件组成一个优先级队列:struct swap_list_t swap_list={-1,-1};struct swap_list_t{int head;int next;} 。刚开始的时候 没有交换文件,所以被初始化成-1,-1。这种连接的方式有点像数据结构中的静态链表,假设此时有swap_info_struct连接进来,那么next会指向刚刚进来的那个swap_info_struct。而swap_info_struct的next字段会成为-1。以此类推,当不断的有swap_file连接进来的时候,原来那个next为-1的swap_info_struct的next字段就会指向新进入的swap_info_struct(它们还有一个数组叫swap_info)。
盘上页面也有其表项在页表上,指明这个页面在哪个文件上以及偏移是多少。swap_entry_t实际上是一个包在结构体里的32位数。高27位为偏移(文件里面的哪儿),随后7位指明是哪个设备(文件),最后一位为0(这样硬件就知道这个页面并不在内存中,后面交给操作系统处理)。关于操作这个swap_entry_t的宏也就简单了,无非是左移1位或者8位或者相反。(未完)
在swap_info_struct结构体中有一个unsigned short *类型的成员(swap_map)指向一个数组,且其中每一个短整数都代表一个页面。这个数组的大小是由swap_info_struct的另一个成员pages决定的,这个成员实际上也就指定了swap文件的大小。swap_map[0]说明了该文件的一些性质,例如哪些页面可供使用的位图。一般来说文件的开头与结尾的地方有一些盘上物理页面(现在在盘上的页面)是不能使用的。所以swap_info_struct另外的成员lowest_bit和highest_bit指明可以使用的范围。
Linux允许多个交换文件,且这些文件形成了一个数组:struct swap_info_struct swap_info[MAX_SWAPFILES];其中MAX_SWAPFILES的值为8。除此之外还将这些交换文件组成一个优先级队列:struct swap_list_t swap_list={-1,-1};struct swap_list_t{int head;int next;} 。刚开始的时候 没有交换文件,所以被初始化成-1,-1。这种连接的方式有点像数据结构中的静态链表,假设此时有swap_info_struct连接进来,那么next会指向刚刚进来的那个swap_info_struct。而swap_info_struct的next字段会成为-1。以此类推,当不断的有swap_file连接进来的时候,原来那个next为-1的swap_info_struct的next字段就会指向新进入的swap_info_struct(它们还有一个数组叫swap_info)。
盘上页面也有其表项在页表上,指明这个页面在哪个文件上以及偏移是多少。swap_entry_t实际上是一个包在结构体里的32位数。高27位为偏移(文件里面的哪儿),随后7位指明是哪个设备(文件),最后一位为0(这样硬件就知道这个页面并不在内存中,后面交给操作系统处理)。关于操作这个swap_entry_t的宏也就简单了,无非是左移1位或者8位或者相反。(未完)
相关文章推荐
- Linux内存管理中的数据结构和函数
- linux内存管理重要的数据结构
- linux 内核源代码情景分析——几个重要的数据结构和函数
- 2.3 linux存储管理-重要的数据结构和函数
- linux学习二内存管理重要的数据结构
- linux驱动移植的重要数据结构
- Linux-0.11内核源码分析系列:内存管理up_wp_page()与do_wp_page()函数分析
- Linux内核--网络协议栈深入分析(一)--与sk_buff有关的几个重要的数据结构
- Linux-0.11内核源码分析系列:内存管理get_empty_page()与put_page()函数分析
- Linux 内存管理 重要结构体
- Linux-0.11内核源码分析系列:内存管理get_free_page()函数分析
- Linux驱动编程 step-by-step (三) 字符设备中 重要的数据结构
- linux进程/内存管理的数据结构之u区
- linux设备驱动第三版笔记---->linux驱动重要数据结构之inode.
- Linux kernel 内存管理重要数据结构关系组织图
- Linux内存管理中内存的组织及主要数据结构分析(pg_data_t&&page&&zone)
- FFMpeg 中比较重要的函数以及数据结构
- Linux系统内存管理及相关操作函数
- linux驱动移植的重要数据结构(一)
- 转载:Linux 内存管理 重要结构体