标签: memory-management

如何将dma_addr_t转换为linux内核中的虚拟地址?

我正在写一个PCI设备驱动程序,我需要为DMA分配一些内存,我正在使用这个函数:

void *dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, int flag);
Run Code Online (Sandbox Code Playgroud)

我将dma_handle传递给设备.

这个函数的返回值是我可以在内核中使用的虚拟地址,事情是我不想为每个内存分配保存这个地址.

有没有办法将物理地址dma_handle转换为我可以在内核中使用的地址?像这些函数/宏之一的东西:

virt_to_page(kaddr)
page_to_pfn(page)
Run Code Online (Sandbox Code Playgroud)

是否有phy_to_kvirt宏/函数或任何其他方式将物理地址转换为内核虚拟地址?

谢谢

memory-management linux-device-driver linux-kernel dma

0
推荐指数
1
解决办法
2644
查看次数

g ++和gcc 4.8找不到null_ptr?

我在某处读到gcc 4.6实现了c ++ 11 null_ptr.我有4.8但我只能找到std::nullptr_t(似乎没有相同的工作).

null_ptr在g ++ 4.8中我需要做什么/包括什么?

c++ null gcc memory-management g++

0
推荐指数
1
解决办法
409
查看次数

在这种情况下我是否需要释放char

我的代码看起来像这样:

const char *msg = getMessageFromAnObject(); // gets one slot from a char **

return std::string ( msg );
Run Code Online (Sandbox Code Playgroud)

现在,我是否需要释放msg或是否需要谨慎处理.

谢谢.帕文.

c++ memory-management

0
推荐指数
1
解决办法
198
查看次数

C++/C语言独立内存分配

通常的做法是为C语言定义一个转换为new的宏,为C转换为malloc吗?(和等效的删除/免费宏)

c c++ memory-management

0
推荐指数
1
解决办法
200
查看次数

是否可以按位分配动态内存?

我们可以分配动态内存吗?我知道malloc()需要以字节为单位的内存大小.我们可以编写一个以位为单位分配内存的内核模块吗?用户程序应该调用这个模块来分配内存.如果你们说是的话,我会开始研究它.

c linux memory-management dynamic linux-kernel

0
推荐指数
2
解决办法
147
查看次数

编译器是否优化了由"malloc()"函数分配的内存?

我们假设处理器中有200个字节的内存.

这是代码:

#include <stdlib.h>

char * p;
char data;
void test1()
{
    p = (char *)malloc(sizeof(char) * 300);
    p[0] = 1;
}

void test2()
{
    p = (char *)malloc(sizeof(char) * 300);
    data = p[5];
}
Run Code Online (Sandbox Code Playgroud)

当我运行"test1()"时,显然会有内存溢出.但是"test2()"不会.编译器是否优化了"test2()"中的内存?怎么样?

还有一个奇怪的问题:

void test3()
{
    char ele[1000]={0};     
}

void test4()
{
   char ele[1000];
   ele[999] = 10;
}
Run Code Online (Sandbox Code Playgroud)

"test3()"将导致内存溢出,"test4()"将不会.

抱歉我的英语不好,谢谢你的回答.

================================================== ====

最后,我想出来了.我检查了汇编代码,在"test3"中它确实分配了内存.但是在"test4"中,编译器优化了数组,没有为它分配内存.

谢谢@Philipp,谢谢大家.

c memory optimization memory-management

0
推荐指数
1
解决办法
170
查看次数

C:realloc()无法按预期运行

如果我有一个变量,str我想在堆上分配内存,我会使用malloc():

char* str = (char*)malloc(sizeof("Hello"));
Run Code Online (Sandbox Code Playgroud)

malloc()返回一个void*指针,这是我的记忆所在的内存位置.所以现在,我可以给它一些数据

str = "Hello";
Run Code Online (Sandbox Code Playgroud)

所以,内存位置现已满,有6个字节.现在,我想增加它的大小,以包含字符串"Hello World".所以,我用realloc().根据man, void* realloc(void *ptr, size_t size)将:

The realloc() function changes the size of the memory block pointed to by ptr to size bytes. 
The contents will be unchanged in the range from the start of the region up to the minimum of 
the old and new sizes. If  the  newsize is larger than the old size, …
Run Code Online (Sandbox Code Playgroud)

c memory-management realloc dynamic-memory-allocation

0
推荐指数
1
解决办法
199
查看次数

Dealloc和ARC

我读到在Xcode中使用ARC进行Objective-C编程时,dealloc编译器会自动调用该方法.在什么情况下它被称为?

为了避免使用太多的变量名,当我需要重复使用相同的类来执行多个操作(并且每次都重置变量)时,我经常声明变量,将它们设置为nil,然后在我去的时候为它们赋值.最终看起来像这样:

MyClass mc;

mc = [[MyClass alloc] init];
[mc doThis:someOption]

mc = [[MyClass alloc] init];
[mc doThis:someOtherOption];

//etc...
Run Code Online (Sandbox Code Playgroud)

方法名称alloc是"allocate"的缩写,因为它是将内存分配给变量的方法.sc每次为其分配新值时,编译器是否会自动释放内存?我计划在我的一个项目中使用这个方法,并且我不希望在我调用的所有时间分配大量内存alloc来分配新值mc.

memory-management objective-c automatic-ref-counting

0
推荐指数
1
解决办法
457
查看次数

boost :: asio自定义处理程序分配

我只是试图了解boost :: asio处理程序分配示例(http://www.boost.org/doc/libs/1_50_0/doc/html/boost_asio/example/allocation/server.cpp)。

我知道这是出于教育目的的过于简化的示例,但是我无法理解:在任何情况下,由于无法看到类,handler_allocator类使用了堆(in_use_ == true)。

每个会话都有自己的分配器,每次都是这样的:先读取再写入,但是直到写入完成才读。您也可以阅读文档:

该实现保证了释放将在调用关联的处理程序之前发生,这意味着该内存已准备好被处理程序启动的任何新异步操作重用。

我的问题是:您能告诉我一个示例,在该示例中堆发生分配的地方吗?

额外:现在有没有人提供处理程序自定义分配的更完整示例?

c++ memory-management boost-asio

0
推荐指数
1
解决办法
1450
查看次数

由结构向量引起的c ++内存泄漏

由指示的线引起的内存泄漏."pendingSendReqs.push_back(&F);" 在sendreq()方法中.我是c ++的新手所以我似乎无法弄清楚为什么会发生内存泄漏.泄漏的内存大小为16个字节.

class Station {
    struct Frame {
        enum { Token, Data, Ack } type;                  // type of frame
        unsigned int src;                                // source id
        unsigned int dst;                                // destination id
        unsigned int prio;                               // priority
    } frame;

    unsigned int stnId;
    static unsigned int requests;                        // total send requests (if needed)
    void data( Frame frame );                            // pass frame
    void main();                                         // coroutine main
    Station *nextStation;
    vector<Frame*> pendingSendReqs;
  public:
    Station( unsigned int id ) : stnId(id) { }
    ~Station() …
Run Code Online (Sandbox Code Playgroud)

c++ memory-leaks memory-management vector

0
推荐指数
1
解决办法
1044
查看次数