leonliu_1128 发表于 2018-3-23 16:43:47

linux里用new申请大内存, 会在sdram里申请还是在片内申请?

本人刚开始学,用的是imx283, 发现周立功论坛支持太烂,所以进度超慢.
如题.如果我想打开大文件, 把文件放到sdram里, 请问如何做, 如何访问sdram, 用new行吗?

谢谢

nanfang2000 发表于 2018-3-23 22:43:49

虽然不熟悉Linux,但是一般这种都是操作系统管理的,也许你可以请求到很大的RAM,也许申请不到。还有可能是虚拟内存,放在缓存文件里

lanqilove 发表于 2018-3-23 23:06:40

片内sram类似电脑cpu的一级缓存,应用程序不会直接访问的。关于申请内存,c语言用malloc,c++用new,申请的是sdram划分出的堆内存

barryxiao 发表于 2018-3-24 21:04:11

片内sram在Linux内核开始后是不使用的,这个SRAM用于在uboot阶段加载程序用。
直接在程序里定义一个数组或者malloc的空间就是在SDRAM中了,用fread把文件数据读取到这段空间中即可。new array也可以

leonliu_1128 发表于 2018-3-25 14:02:42

谢谢各位, 有空我试一下, 看看申请的地址是不是在sdram的地址内就知道. 另外问一下有谁知道linxu里面sdram的标准的调用函数吗?

hongfadg 发表于 2018-3-25 14:26:21

肯定sram啊片内内存一般比较小,

hongfadg 发表于 2018-3-25 14:27:12

hongfadg 发表于 2018-3-25 14:26
肯定sram啊片内内存一般比较小,

不好意思,修正一下   是sdram

barryxiao 发表于 2018-3-25 21:29:54

leonliu_1128 发表于 2018-3-25 14:02
谢谢各位, 有空我试一下, 看看申请的地址是不是在sdram的地址内就知道. 另外问一下有谁知道linxu里面sdram ...

Linux中有mmu地址映射,在程序空间内看到的地址都是映射之后的,不是实际的总线空间地址

leonliu_1128 发表于 2018-3-25 22:41:14

感觉有问题, imx283板子上是128MB的sdram. 我在qt里面写的小程序, 用new申请3M数组,返回首地址是0x4111 6008. 283手册sdram首地址是0x4000 0000- 内核首地址, 因此返回的地址是sdram首地址后面17M开始的位置, 应该说明申请的是片外的sdram.
如果我申请4M数组, 结果我写的小程序不能打印输出, 这是为什么? 毕竟还有很多空间没有用.

ddlong123456 发表于 2018-3-26 15:34:29

谢谢!学习到了

jameszxj 发表于 2018-3-27 15:37:49

leonliu_1128 发表于 2018-3-25 22:41
感觉有问题, imx283板子上是128MB的sdram. 我在qt里面写的小程序, 用new申请3M数组,返回首地址是0x4111 600 ...

new出来的是虚地址,和CPU手册里的SDRAM地址的关系是通过MMU映射的,8楼解释过了,
至于new申请内存,一般是不会申请不到的,看看程序有没有其他问题。极端情况你这板子上全是内存碎片,最大的块已经不到4M了,这种可能性理论上存在,可能性极小。

htjgdw 发表于 2018-3-28 16:46:32

我也有楼主这样的疑问。在移植linux到STM32F429的过程中看到429内部有256KB的零等待SRAM(其中还包括64KB的CCM RAM),很想把它加到linux内存池里,但是一直也没找到方法。

xwkm 发表于 2018-3-28 17:08:11

leonliu_1128 发表于 2018-3-25 22:41
感觉有问题, imx283板子上是128MB的sdram. 我在qt里面写的小程序, 用new申请3M数组,返回首地址是0x4111 600 ...

这是虚拟地址。并不是实际地址,不代表任何情况。

ywlzh 发表于 2018-3-28 18:31:24

应用层做应用层的事 别想那么多

页: [1]
查看完整版本: linux里用new申请大内存, 会在sdram里申请还是在片内申请?