linux里用new申请大内存, 会在sdram里申请还是在片内申请?
本人刚开始学,用的是imx283, 发现周立功论坛支持太烂,所以进度超慢.如题.如果我想打开大文件, 把文件放到sdram里, 请问如何做, 如何访问sdram, 用new行吗?
谢谢 虽然不熟悉Linux,但是一般这种都是操作系统管理的,也许你可以请求到很大的RAM,也许申请不到。还有可能是虚拟内存,放在缓存文件里 片内sram类似电脑cpu的一级缓存,应用程序不会直接访问的。关于申请内存,c语言用malloc,c++用new,申请的是sdram划分出的堆内存 片内sram在Linux内核开始后是不使用的,这个SRAM用于在uboot阶段加载程序用。
直接在程序里定义一个数组或者malloc的空间就是在SDRAM中了,用fread把文件数据读取到这段空间中即可。new array也可以 谢谢各位, 有空我试一下, 看看申请的地址是不是在sdram的地址内就知道. 另外问一下有谁知道linxu里面sdram的标准的调用函数吗? 肯定sram啊片内内存一般比较小, hongfadg 发表于 2018-3-25 14:26
肯定sram啊片内内存一般比较小,
不好意思,修正一下 是sdram leonliu_1128 发表于 2018-3-25 14:02
谢谢各位, 有空我试一下, 看看申请的地址是不是在sdram的地址内就知道. 另外问一下有谁知道linxu里面sdram ...
Linux中有mmu地址映射,在程序空间内看到的地址都是映射之后的,不是实际的总线空间地址 感觉有问题, imx283板子上是128MB的sdram. 我在qt里面写的小程序, 用new申请3M数组,返回首地址是0x4111 6008. 283手册sdram首地址是0x4000 0000- 内核首地址, 因此返回的地址是sdram首地址后面17M开始的位置, 应该说明申请的是片外的sdram.
如果我申请4M数组, 结果我写的小程序不能打印输出, 这是为什么? 毕竟还有很多空间没有用. 谢谢!学习到了 leonliu_1128 发表于 2018-3-25 22:41
感觉有问题, imx283板子上是128MB的sdram. 我在qt里面写的小程序, 用new申请3M数组,返回首地址是0x4111 600 ...
new出来的是虚地址,和CPU手册里的SDRAM地址的关系是通过MMU映射的,8楼解释过了,
至于new申请内存,一般是不会申请不到的,看看程序有没有其他问题。极端情况你这板子上全是内存碎片,最大的块已经不到4M了,这种可能性理论上存在,可能性极小。 我也有楼主这样的疑问。在移植linux到STM32F429的过程中看到429内部有256KB的零等待SRAM(其中还包括64KB的CCM RAM),很想把它加到linux内存池里,但是一直也没找到方法。 leonliu_1128 发表于 2018-3-25 22:41
感觉有问题, imx283板子上是128MB的sdram. 我在qt里面写的小程序, 用new申请3M数组,返回首地址是0x4111 600 ...
这是虚拟地址。并不是实际地址,不代表任何情况。 应用层做应用层的事 别想那么多
页:
[1]