首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux申请大页内存(mmap)

---- 1.为什么要使用大页内存   了解操作系统内存管理的人一般都知道操作系统对内存采用多级页表和分页进行管理,操作系统每个页默认大小为4KB。...当多个内存密集型应用访问内存时,会造成过多的TLB未命中,因此在特定情况下会需要减少未命中次数,一个可行的办法就是增大每个页的尺寸。...---- 2.怎样使用大页内存 2.1 先预留一定量的大页内存 #先查看系统有多少已经预留的大页内存 # cat /proc/meminfo |grep -i huge #预留192个大页 # sysctl...vm.nr_hugepages=192 #查看是否预留成功 # cat /proc/meminfo |grep -i huge 2.2 通过系统调用来从预留的大页内存申请大页 #include <sys...\n"); getchar(); munmap(m, s); return 0; } ---- 3.最后的话 大页内存的好处不仅是减少TLB未命中次数,而且大页内存分配的是物理内存,不会被操作系统的内存管理换出到磁盘上

11.4K110

Linux驱动开发_块设备驱动开发(内存模拟存储)

一、前言 块设备驱动块是Linux下3大设备驱动框架之一,块设备主要是针对存储类型的设备设计的驱动,配合文件系统完成数据存储。...所以大致总结下:块设备驱动的目的是给Linux文件系统提供底层接口。 二、编写块设备驱动的思路 既然学到了驱动开发,了解到块设备开发。...那么为了方便介绍块设备的驱动开发,我这里会先用malloc在驱动申请一块内存来当做FLASH设备,这样就不需要接任何硬件,降低了难度,纯软件的方式理解驱动框架运作流程。...这份代码里存储数据的空间是申请了一段内存来模拟的。...看懂块设备框架,使用的模拟的内存。 2.​ 加入SD卡的驱动,配合块设备框架,完成完整的块设备驱动编写。

4.5K30
您找到你想要的搜索结果了吗?
是的
没有找到

Android 内存申请分析

作者:amritazhou 最近一直在做有关内存方面的优化工作,在做优化的过程,除了关注内存申请量以及GC的情况之外,我们经常需要想方法找出是那些对象占用了大量内存,以及他们是如何导致GC的,这意味着我们需要获取对象申请的信息...对象的信息: 这种使用方式相当直观,可以看到申请对象大小,数量,还有堆栈等,通过这些信息,我们可以作为我们接下来进行内存优化的参考 但是,对于这种获取申请对象信息的方法,会存在几个问题: 1、获取的信息过于分散...AllocTracker.cpp这里的方法: 从上面的代码可以看出,在开启了Allocation Tracker之后,在Dalvik全局变量gDvm下,将其中的allocRecords指向了一块新的申请内存区域...对Allocation Tracker的响应过程就非常清晰了: 1、在收到Allocation Tracker的请求的时候,首先给Dalvik全局变量gDvm中的allocRecords字段指向一段新申请内存...,申请内存的大小,由gDvm.allocRecordMax指定; 2、后续Dalvik每次新申请对象的时候,只要allocRecords不为NULL,那就会不断的往allocRecords指向的内存区域中写入的新申请对象的信息

1.6K00

Linux内核设备驱动内存管理笔记整理

/********************** * linux内存管理 **********************/ 到目前为止,内存管理是unix内核中最复杂的活动。...无论是应用程序还是驱动程序,我们在程序中使用的地址都是虚拟地址。 *物理地址(physical address) 32位无符号整数,与从CPU的地址引脚发送到存储器总线上的电信号相对应。...这些特性包括: *一些硬件只能用某些特定的内存地址来执行DMA *一些体系结构其内存的物理寻址范围远大于虚拟寻址范围,这样,就有一些内存不能永久地映射到内核空间 针对这些限制,linux采用了三种区(<...注意,kmalloc不能分配高端内存 b.释放 #include void kfree(const void *ptr); 如果要释放的内存已经被释放了,或者释放属于内核其他部分的内存...每次要分配数据结构就不用再申请内存,而是直接从这个空闲链表中分配数据块,释放结构时将内存还回这个链表。

1.6K20

Kmalloc申请内存源码分析

本节我们重点分析下Kmalloc的实现,其实在驱动中大家使用最多的就是用kmalloc申请内存,kmalloc申请内存大小都普遍比较小,比较快,而且物理地址和虚拟地址是线性映射的,因为kmalloc拿到的内存是从...2个参数,第一个参数就是要申请的大小,第二个参数就是申请内存的一些flag,比如常见的GFP_KERNEL 大家也看下注释都有哪些flag,这些flag都代表啥意思,是否可以睡眠,是否是原子操作等 __...也就是申请太大的内存,就不用直接找我slab了,直接去找buddy拿吧 通过kmalloc_slab去获取对应大小的kmem_cache缓冲池 调用slab_alloc从对应的kmem_cache中去申请一个...所以说来说去,还是从slab去申请内存,里面的内存就和上一节的内存一样了。 如果size大于4K,每个平台,每个版本,每个slab的实现大小不一样。...kmalloc_caches[index]; } 根据size计算出一个index,此index就是kmalloc_caches数组下标,此数据中有对应很多个大小的kmalloc_cache缓冲池 如果申请内存是从

2K20

Java通过JNI申请直接内存

【环境】 Linux环境 约定: 所有的测试文件都放在2022-3-14目录下 【1】 将 JAVA_HOME/include/jni.h 和 JAVA_HOME/include/linux/jni_md.h...函数申请内存, 主要就是要观察在Java中, 堆外内存/直接内存申请方式, 以及如何被管理的....在Java中可以通过使用ByteBuffer.allocateDirect() 和 unsafe.allocateMemory() 以及本文介绍的通过JNI申请内存, 这三种方式的区别是什么呢?...mmap申请内存, 我们拿到的起始地址就是maps中显示的地址, 是吻合的....而Java方式拿到的地址, 还是一样, 偏差了0x10 简单说, malloc底层调用mmap系统函数申请内存(还有一种是brk系统函数), 只是malloc又对从操作系统拿到的内存做了手脚, 之所以做手脚是为了合理管理内存

1.2K30

Postgresql源码(90)共享内存申请CreateSharedMemoryAndSemaphores

Postgresql启动后申请两段内存,在启动时会判断系统支持情况,默认是使用mmap申请共享内存。...《Linux内存映射函数mmap与匿名内存块》 ipc的共享内存,只申请PGSharedMemoryCreate大小。...《Linux共享内存与子进程继承》 Postgresql的共享内存在9.2以后就是使用mmap申请的了,在少数情况下使用ipc的共享内存。...IPC的共享内存: 在当前例子中,IPC的共享内存申请了一个PGShmemHeader的空间,没有其他空间可以使用。...在这个步骤前,直接使用ShmemAlloc申请共享内存,调整freeoffset位置 在这个步骤后,使用ShmemInitStruct申请共享内存,先在哈希表中创建一个索引条目,在使用ShmemAlloc

66520

探秘malloc是如何申请内存

今天分析下malloc申请内存时都发生了什么,Let dot it 我们都清楚malloc申请内存不是立刻就建立虚拟地址和物理地址的映射的,当int *p = malloc(100*1024)执行这条指令之后...当malloc申请内存小于128K的时候是属于heap的,自己可以动手实验下。当申请内存大于128K之后,就会从mmap区域申请内存的。...当写malloc申请内存0x76143BC000的时候,就会发生缺页异常,发生page_fault。...return ret; } 如果pmd里面的值是NULL,所以pte不存在,设置pte为NULL 判断此vma是否是匿名页,通过判断vma→vm_ops是否为NULL, 啥是匿名页: malloc申请内存...stack里申请内存 mmap申请的匿名的内存映射 以上三种都属于匿名页 很明显我们是malloc申请内存,就会走到匿名页里面去 如果不是匿名页,那就是有文件背景的页,就是和映射的时候有对应的实体

2.2K40

Linux驱动开发: USB驱动开发

四、 linux内核下USB相关的API函数与数据结构 前面介绍了USB相关一些基础概念与重要的数据结构,接下来就分析在linux内核中如何编写一个USB 驱动程序,编写与一个USB设备驱动程序的方法和其他总线驱动方式类似.../ __u16 match_flags; /*用于特定于产品的匹配 */ __u16 idVendor; /*USB设备的制造商ID,须向www.usb.org申请*/ __u16 idProduct...struct urb *usb_alloc_urb(int iso_packets, gfp_t mem_flags) @iso_packets:这个urb的iso包的数量 @mem_flags:要分配的内存类型...(中断传输方式) 5.1 USB驱动注册框架代码 #include #include #include /*...#include /* 本程序为USB鼠标驱动程序,要安装本驱动,需要先将内核自带的USB驱动程序卸载掉 */ //定义USB的IDTAB 24ae:2002 static

69.3K20

Linux 内核 内存管理】内存管理系统调用 ② ( mmap 创建内存映射 | mmap 创建内存映射 与 malloc 申请内存对比 | mmap 创建内存映射 与 普通文件操作对比 )

文章目录 一、mmap 创建内存映射 与 malloc 申请内存对比 1、malloc 函数原型 2、malloc 申请动态内存过程 3、malloc 使用的系统调用判定 ( brk | mmap )...调用 " Linux 内核 " 中的 kmalloc vmalloc 函数 ; 参考 【Linux 内核 内存管理】内存管理架构 ④ ( 内存分配系统调用过程 | 用户层 malloc free |...函数 申请 虚拟内存 , 之后将该 虚拟内存页 划分成 内存块 , 分配给 应用进程 , 默认的 内存块 划分阈值 是 128 KB ; 使用 brk 系统调用 : 如果 应用程序 申请内存大小...小于 划分阈值 , glibc 库 的 ptmalloc " 内存分配器 " 会使用 brk 系统调用 , 向 Linux 内核申请内存 ; 使用 mmap 系统调用 : 如果 应用程序 申请内存大小...大于等于 划分阈值 , glibc 库 的 ptmalloc " 内存分配器 " 会使用 mmap 系统调用 , 向 Linux 内核申请内存 ; 4、mmap 创建内存映射 mmap 可以直接向 Linux

6.1K20

申请内存时底层发生了什么?

---- 内存申请释放对程序员来说就像空气一样自然,你几乎不怎么能意识到,有时你意识不到的东西却无比重要,申请过这么多内存,你知道申请内存时底层都发生什么了吗?...当CPU执行我们写的“普通”代码(非操作系统、驱动程序员)时就处于用户态,粗糙的划分方法就是除了操作系统之外的代码,就像我们写的HelloWorld程序。...标准库 虽然我们可以通过系统让操作系统替我们完成一些特定任务,但这些系统调用都是和操作系统强相关的,Linux和Windows的系统调用就完全不同。...这就是为什么在C语言下同样的open函数既能在Linux下打开文件也能在Windows下打开文件的原因。 说了这么多,这和malloc又有什么关系呢?...我们看到的冰山是这样的:我们向malloc申请内存,malloc内存不够时向操作系统申请内存,之后malloc找到一块空闲内存返回给调用者。

64610

Linux SPI 驱动

四、指纹SPI设备驱动框架 在对硬件有了较高的基础理解后,其实代码主要就是开始对SPI的接口做的软件实现了。...由于平台厂商通常给我们做好了spicontroller以及spicore部分,接下来的总结主要是针对SPI设备驱动部分的。...代码部分均来自于linuxkernel开源代码https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/?...五、总结 个人理解现在这个科技发展的风口下,手机、IOT、车机等终端设备齐放异彩的大背景下,新终端生态的搭建、基础智能设备的整合、大健康的趋势下,Sensor的发展是一个非常关键的驱动力,基础驱动软件能力的掌握也是重中之重...,linux给了我们一个很好的平台让我们能在前辈的肩上进行各种高质量的代码学习,我们也需抓住这个机会,在做好本质工作的基础上静心努力钻研,不断前行,祝愿各位也祝愿我自己在技术的道路上越走越远。

18.3K12

Linux——Linux驱动之基本理论常识总结(什么是Linux驱动Linux驱动需要掌握哪些?)

2 Linux驱动程序需要掌握的内容 3 Linux驱动可参考的资源 4 ARM处理器体系架构 5 ARM的前世今生 ---- 0 引言 前面Linux专题中关于Linux下系统编程总结了17篇博文,主要是为了提高...Linux下的C编程应用能力,熟悉Linux编程应用环境,从此篇博文起开始Linux驱动的总结,后面计划加一些综合实践项目练习。...Linux驱动可参考的资源 Linux本身就是一个开源软件,开源的好处大家都知道,资料丰富,我们做Linux驱动开发,能找到技术支持和相应资源的有如下,列出的,对于新手来说,建议最佳的顺序是从1到5:...对上:Linux设备驱动给上层提供调用的接口; 对中:Linux设备驱动要注册到内核中,标准说法是 挂载在总线上; 对下:直接操作硬件,如GPIO、IIC、SPI、PWM等; 以上三个,Linux内核都提供了大量的接口函数...、结构体,其实Linux驱动,就是掌握了这些东西怎么用,适应到自己要写的驱动程序中。

8.1K30

Linux笔记】Linux驱动基础

上一篇分享的:从单片机工程师的角度看嵌入式Linux中有简单提到Linux的三大类驱动: ? 我们学习编程的时候都会从hello程序开始。...同样的,学习Linux驱动我们也从最简单的hello驱动学起。...但是,在嵌入式Linux中,驱动和应用的分层是特别明显的,最直观的感受就是驱动程序是一个.c文件里,应用程序是另一个.c文件。...我们前面说了驱动的装载方式之一的动态装载:把驱动程序编译成模块,再动态装载。动态装载的体现就是开发板已经启动运行了Linux内核,我们通过开发板串口终端使用命令来装载驱动。...以上就是分享关于驱动一些内容,通过以上分析,我们知道,其是有套路(就是常说的驱动框架)可寻的,比如: #include #include <linux/kernel.h

25.8K54
领券