![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
内存分配研究
文章平均质量分 61
jasonLee_lijiaqi
这个作者很懒,什么都没留下…
展开
-
内存分配方式与内存分配算法
内存分配方式有两种,连续内存分配方式和离散内存分配方式。不同的分配方式又有不同的分配算法。内存分配算法,其实就是:有一大块空闲的资源,如何合理地分配资源?内存分配的思想可以用到很多其他的领域。比如Java虚拟机是如何将内存分配与回收的?再比如文件系统是如何将磁盘块分配与回收的?其本质就是如何把空闲的资源分配出去,分配之后又如何回收?目标就是分配快,回收也快,而且还不浪费。那么,就需要根据资源的...转载 2018-03-14 20:24:56 · 8275 阅读 · 0 评论 -
文件读写基本流程
读文件1、进程调用库函数向内核发起读文件请求;2、内核通过检查进程的文件描述符定位到虚拟文件系统的已打开文件列表表项;3、调用该文件可用的系统调用函数read()3、read()函数通过文件表项链接到目录项模块,根据传入的文件路径,在目录项模块中检索,找到该文件的inode;4、在inode中,通过文件内容偏移量计算出要读取的页;5、通过inode找到文件对应的addres...原创 2018-09-06 11:26:53 · 4482 阅读 · 0 评论 -
slab和slub分析
slab分配器slub分配器原创 2018-09-06 15:15:24 · 578 阅读 · 0 评论 -
Linux内核栈信息获取dump_stack()
参考下面这个博客:Linux内核栈信息获取与理解原创 2018-09-10 15:02:35 · 986 阅读 · 0 评论 -
Linux内核链表原理和实例
深入分析Linux链表链表的实例原创 2018-09-07 09:25:05 · 1398 阅读 · 0 评论 -
QEMU挂载磁盘
1、 建一個5G的raw格式的虛擬磁盤,大小根據自己的需要設定。 $ qemu-img create test.img 5G2、接着运行qemu并加载磁盘:$ qemu-system-x86_64 -kernel /usr/src/linux-4.6.2-x86_64/arch/x86/boot/bzImage -initrd ~/Downloads/initramfs.img...原创 2018-09-07 16:58:55 · 8573 阅读 · 0 评论 -
container of()函数与拓展
container of原理其实,原理很简单: 已知结构体type的成员member的地址ptr,求解结构体type的起始地址。 type的起始地址 = ptr - size (这里需要都转换为char *,因为它为单位字节)。到此,该函数已经讲完,是不是很简单??? 其实也不是,这里并没有提到size如何计算,而令我们头晕的正是这里。好吧,先上c...原创 2018-09-19 09:51:25 · 343 阅读 · 1 评论 -
struct file中f_mode和f_flags区别
mode_t f_mode:文件模式(FMODE_WRITE,FMODE_READ),用在创建文件时使用它通过FMODE_READ和FMODE_WRITE位来标识文件是否可读或可写,因为内核在调用驱动程序的read和write前已经检查了訪问权限。所以不必为这两个方法检查权限。在没有获得相应訪问权限而打开文件的情况下,对文件的读写操作将被内核拒绝,驱动程序无需为此而作额外的推断。unsig...原创 2018-09-14 10:52:24 · 3162 阅读 · 0 评论 -
Linux IO子系统和文件系统读写流程
我们所有分析的,是基于2.6.32及其后的内核.我们在Linux上总是要保存数据,数据要么保存在文件系统里(如ext3),要么就保存在裸设备里。我们在使用这些数据的时候都是通过文件这个抽象来访问的,操作系统会把我们需要的数据提交给我们,而我们则无需和块设备打交道。从下图,我们可以清除的看到:I/O子系统是个层次很深的系统,数据请求从用户空间最终到达磁盘,经过了复杂的数据流动。对设驱开发人...原创 2018-09-25 09:30:58 · 1764 阅读 · 0 评论 -
从文件 I/O 看 Linux 的虚拟文件系统
1 引言Linux 中允许众多不同的文件系统共存,如 ext2, ext3, vfat 等。通过使用同一套文件 I/O 系统 调用即可对 Linux 中的任意文件进行操作而无需考虑其所在的具体文件系统格式;更进一步,对文件的 操作可以跨文件系统而执行。如图 1 所示,我们可以使用 cp 命令从 vfat 文件系统格式的硬盘拷贝数据到 ext3 文件系统格式的硬盘;而这样的操作涉及到两个不同的文件...原创 2018-09-25 10:19:41 · 345 阅读 · 0 评论 -
bio,request,request_queue的关系
通用块层的核心数据结构称为bio描述符,它描述了块设备的io操作。每一个bio结构都包含一个磁盘存储区标识符(存储区中的起始扇区号和扇区数目)和一个或多个描述与IO操作相关的内存区段(bio_vec数组)bio结构中的字段/* * main unit of I/O for the block layer and lower layers (ie drivers and * stacking...原创 2018-09-26 11:13:50 · 2611 阅读 · 1 评论 -
普通文件和块设备文件的page cache问题
注:本文代码基于linux-3.18.31,此版本中块缓存已经合入页缓存。写在前面普通文件和块设备文件都有一个address_space对象,inode中分别维护两个成员指向这两个不同的address_space,分别是i_mapping和i_data。需要注意的是,这两个page cache中可能拥有磁盘上相同的数据(即拥有相同的页数据)。struct inode { ………… con...原创 2018-09-26 17:30:44 · 1301 阅读 · 0 评论 -
kmalloc和vmalloc的区别
kmalloc和vmalloc完全不同。kmallockmalloc申请一段物理地址和逻辑地址连续的内存空间。 /* 申请一段物理地址连续的内存空间 */static __always_inline void *kmalloc(size_t size, gfp_t flags){ if (__builtin_constant_p(size)) { if (size > KMA...原创 2018-11-02 09:39:05 · 2593 阅读 · 2 评论 -
编译内核出现:implicit declaration of function
修改内核,添加了一些函数,重新编译后,出现以下情况:经过查看源码:自定义的page_is_NVM的函数定义位置 在 使用位置 的后面,这在C语言的语法中是错误的;解决方法:在文件首部,添加该函数的声明即可。...原创 2018-08-24 16:57:22 · 4020 阅读 · 0 评论 -
浅谈哈希表(HashTable)——拉链法、哈希桶、Probing探测方法
概述 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f...原创 2018-08-31 10:31:33 · 3897 阅读 · 2 评论 -
内核调试出现value optimized out的问题
最近在用gdb调试内核的过程中经常会有< value optimized out>的提示,首先分析该提示出现的原因,我的理解是可能这些被优化的变量已从内存中被移到了寄存器中,所以会找不到。为了能在调试过程中看到所有的变量,不知道能不把内核编译为-O0?若可以的话,又需要在什么地方来改呢?在所有的CONFIG中,我只发现了一个CONFIG_CC_OPTIMIZE_FOR_SI...原创 2018-08-27 10:04:59 · 5562 阅读 · 2 评论 -
常用垃圾回收算法
今天我关于常见的垃圾回收算法来做个总结,我们最常听到的是Java虚拟机里的垃圾回收机制,其实垃圾回收的概念最先并不是Java里首先提出来的,垃圾回收这个概念很早就已经被提出来了,并且已经在其他语言中得到了应用。 关于垃圾回收的机制,这里不再解释,这篇文章我主要介绍常见的垃圾回收算法,当然还有其他的。算法一:引用计数法。这个方法是最经典点的一种方法。具体是对于对象设置一个引用...原创 2018-03-14 21:20:58 · 1475 阅读 · 0 评论 -
NVM和DRAM混合存储小结
与 DRAM 相比,新型 NVM 具有扩展性好、静态能耗低以及非易失性等优势,有望用于内存系统。 然而,NVM 同样存在着写延迟长、写功耗大等缺点,如 PCM 的写延迟为150ns左右,明显大于 DRAM 的写延迟;DRAM的写能耗为4×10-15J/b,而PCM 的写能耗为6×10-12J/b,也显著大于 DRAM 的写能耗。将 NVM 用 于内存系统有 3 种不同的内存 结构: 第1种原创 2018-03-19 10:46:07 · 5599 阅读 · 0 评论 -
内存管理之:页和页框&地址变换结构
一、基本概念1、页和页框的区别划重点::逻辑地址空间分为若干页;物理内存空间分为若干页框(也叫作块)页 分页存储管理是将作业的逻辑地址划分为一系列同等大小的部分,称为页。 并为各页加以编号,每个作业的页的编号都是从0开始的。页框 与之类似,把可用的物理内存也划分为同样大小的连续的部分,称为块或页框。同样为块也进行标号,从0#开始。...原创 2018-03-19 15:01:13 · 36770 阅读 · 6 评论 -
Linux中的TLB小结
TLB(Translation Lookaside Buffer)转换检测缓冲区TLB是一个内存管理单元,用于改进虚拟地址到物理地址转换速度的缓存。 TLB是一个小的,虚拟寻址的缓存,其中每一行都保存着一个由单个PTE(Page Table Entry,页表项)组成的块。如果没有TLB,则每次取数据都需要两次访问内存,即查页表获得物理地址和取数据。重点:加快线性地址(逻辑地址...原创 2018-03-26 10:49:57 · 2536 阅读 · 0 评论 -
Linux:伙伴系统buddy system
主要为了解决外碎片的问题。为了满足对连续大的页框的需求原创 2018-03-26 11:34:33 · 664 阅读 · 0 评论 -
Linux进程上下文
进程上下文和中断上下文是操作系统中很重要的两个概念,这两个概念在操作系统课程中不断被提及,是最经常接触、看上去很懂但又说不清楚到底怎么回事。造成这种局面的原因,可能是原来接触到的操作系统课程的教学总停留在一种浅层次的理论层面上,没有深入去研究。处理器总处于以下状态中的一种: 1、内核态,运行于进程上下文,内核代表进程运行于内核空间; 2、内核态,运行于中断上下文,内核代表...原创 2018-04-09 10:39:02 · 889 阅读 · 0 评论 -
likely()与unlikely()函数的意义
看内核时总遇到if(likely( )){}或是if(unlikely( ))这样的语句,最初不解其意,现在有所了解,所以也想介绍一下。likely() 与 unlikely()是内核中定义的两个宏。位于/include/linux/compiler.h中, 具体定义如下:#define likely(x) __builtin_expect(!!(x), 1)#define unl...原创 2018-04-09 11:47:19 · 1340 阅读 · 0 评论 -
__SetPageBuddy & __ClearPageBuddy
__SetPageBuddystatic inline void set_page_order(struct page *page, unsigned int order) { set_page_private(page, order); __SetPageBuddy(page); }__ClearPageBuddystatic inline v...原创 2018-04-16 10:30:14 · 817 阅读 · 0 评论 -
pfn_to_page()和page_to_pfn()
pfn_to_page()和page_to_pfn()#define page_to_pfn(page) ((unsigned long)((page) - mem_map) + PHYS_PFN_OFFSET)根据给出页地址求出对应的页帧号。两个结构相减,得出的是两者之间的对象个数,加上起始帧号偏移,即给出页地址的相对绝对页号。#define pfn_to_page(pfn) (me...原创 2018-04-16 14:29:17 · 5170 阅读 · 0 评论 -
linux内存源码分析 - SLAB分配器概述
基于linux 2.6.34 之前说了管理区页框分配器,这里我们简称为页框分配器,在页框分配器中主要是管理物理内存,将物理内存的页框分配给申请者,而且我们知道也可页框大小为4K(也可设置为4M),这时候就会有个问题,如果我只需要1KB大小的内存,页框分配器也不得不分配一个4KB的页框给申请者,这样就会有3KB被白白浪费掉了。为了应对这种情况,在页框分配器上一层又做了一层SLAB层,SLAB分配...原创 2018-04-13 10:02:03 · 447 阅读 · 0 评论 -
QEMU+gdb调试Linux内核全过程
1、编译源码(Linux kernel 4.6.2)make menuconfig执行make menuconfig时报错缺少库文件需要安装依赖库sudo aptitab instab libncurses5-dev首先编译内核,编译内核时注意要选两个选项。(注意:除此之外kernel hacking选项下其他的选项都不要选,否则会出现断点无法拦截的情况。这个说法有待验证)...原创 2018-07-09 15:41:52 · 21815 阅读 · 15 评论 -
VFS中的read/write系统调用
VFS中的read/write系统调用 VFS所隐含的主要思想在于引入了一个通用的文件模型(common file model),这个模型能够表示所有支持的文件系统。VFS是所有文件系统的抽象。 linux内核对每个文件读写操作都必须使用一个指针,指向要访问的具体文件系统的适当函数。换句话说,当应用程序对read()或是write()调用引起内核调用相应的sys_read()或...原创 2018-07-15 14:56:06 · 1410 阅读 · 0 评论 -
gem5+NVMain联合编译
1.注册bitbucket账号进入官网,注册即可,记住你的用户名及邮箱,在后面会用到。2.获取NVMain使用权打开https://bitbucket.org/mrp5060/nvmain/并登陆bitbucket账号,登陆后重新打开前面这个网站获取下载命令我的命令是:hg clone https://jason_lee2419@bitbucket.org/mrp5060/nvmai...原创 2018-11-27 19:37:57 · 1072 阅读 · 0 评论