Linux 内存管理记录

Linux 内存管理记录

以上周的问题作为导向,开始研究linux内存管理的方法。
32位
每个进程都是: 前3g用户空间:0x0~0xc0000000
后1g 内核空间: 0Xc0000000~0Xffffffff

从上周测试的打印看:

  1. const全局变量的地址居然在用户空间,估计是在栈中
  2. const局部变量的地址在内核空间。

2的情况可以理解,毕竟ko驱动就在内核中。
1的情况我猜测,当ko动态加载到内核的时候,不是把整个ko一股脑塞到一个地址里面,还是有分别的,所以const全局变量才会还是放在用户空间。
(需要回去再看一遍动态加载的方法)

页与页框的大小一般为4
MMU
完成虚拟空间到物理空间的映射.
内存保护,设置存储器的访问权限,设置虚拟存储空间的缓冲特性。

具体怎么映射还是不深究了,搞不明白,但是肯定多个虚拟内存会映射到同一块物理内存上。

根据页表对内存进行管理,通过页表对内存的访问权限进行设置,页的大小一般为4KB。

当你输入一个命令,系统会从环境变量里头找你这个命令,然后执行。但是根据你shell的环境,你输入命令的操作相当于交给了shell执行。Shell会执行fork创建一个子进程,ls处于交互shell的前台。

mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。
就是物理内存->虚拟内存。
mmap执行后,在进程的虚拟空间中分配了一段空间,真实的物理地址还不会分配的,当进程第一次访问这段空间(当作内存一样),出现缺页异常,CPU陷入OS内核执行异常处理,然后异常处理会在这个时间分配物理内存,并用文件的内容填充这片内存,然后才返回进程的上下文,这时进程才会感知到这片内存里有数据。

程序的加载
Linux执行一个ELF格式的程序,这个程序在磁盘上,为了执行这个程序,需要把程序加载到内存中,这时采用的就是mmap,mmap让虚拟空间和文件的内容组成的空间(文件空间)对应。因为ELF格式是区分代码、数据段的,这里的就不是简单的整个文件的映射了,需要将文件的分段区域映射到内存的不同位置。OS加载ELF文件的过程非常复杂这里就不展开了,具体内容可以看《程序员的自我修养》。
为什么mmap()可以节约IO读写时间?
常规文件操作为了提高读写效率和保护磁盘,使用了页缓存机制,这是由OS控制的。这样造成读文件时需要先将文件页从磁盘拷贝到页缓存中,由于页缓存处在内核空间,不能被用户进程直接寻址,所以还需要将页缓存中数据页再次拷贝到内存对应的用户空间中。这样,通过了两次数据拷贝过程,才能完成进程对文件内容的获取任务。写操作也是一样,待写入的buffer在内核空间不能直接访问,必须要先拷贝至内核空间对应的主存,再写回磁盘中(延迟写回),也是需要两次数据拷贝。
而使用mmap操作文件中,由于不需要经过内核空间的数据缓存,只使用一次数据拷贝,就从磁盘中将数据传入内存的用户空间中,供进程使用。

.Linux是如何组织虚拟内存的?

内核为系统中的每个进程维护一个单独的任务结构task_struct,其中元素包含了内核运行该进程所需要的所有信息(PID、指向用户栈的指针、可执行目标文件的名字、虚拟内存状态、pc指针等)

task_struct中的mm_struct描述了虚拟内存的当前状态,其中mmap字段指向一个vm_area_struct(区域结构)的链表。顺序搜索区域结构的链表花销会很大,实际上Linux在链表中构建了一个树,并在这棵树中进行查找。
进程对某一虚拟内存区域的任何操作需要用要的信息,都可以从vm_area_struct中获得。mmap函数就是要创建一个新的vm_area_struct结构,并将其与文件的物理磁盘地址相连。

编译过程:
预处理
gcc -E 生成.i文件
#define删除,并且展开所有的宏定义(应该就是替换)
处理所有的条件预编译指令,如#if #ifdef #undef #ifndef #endif #elif
处理#include,将包含的文件插入到此处
删除所有注释 // /* */
编译
gcc -S 生成.s
化后生成汇编代码文件
汇编
gcc -C
汇编是将第二步生成的汇编代码编程机器可执行的指令
链接
链接动态库和静态库

时间复杂度计算方法:
For循环 i++的方法是 kn ,i*=2 是klogn
K是循环内的代码行数量。一般k不会拿来算,一般表示O(n),O(logn)
双层for就是O(n^2).

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值