草庐IT

c - 64 位平台上 GCC 中的基本堆使用统计信息

我需要从GCC为Linux编译的C程序中回答一个基本问题:当前有多少进程堆正在使用(由malloc分配),如果有空闲堆block,还有多少驻留.标准库的GNU实现具有mallinfo函数,它准确地报告了我需要的内容,但它只能用于32位配置,而且据我所知,没有64位等效的功能(顺便说一句,谁知道为什么?)。我在Linux上使用GCC,所以我需要这个用于Linux。但我假设堆对系统是不透明的,所以回答这个问题的唯一方法是使用标准库的实现提供的手段。在Windows平台上的MSVC实现中,没有与mallinfo功能等效的功能,但有所谓的heap-walk功能,它允许通过遍历所有信息来计算必要

c - 将用户空间代码移植到内核空间

我有一个主要用C语言编写的大型系统,到目前为止一直在用户空间中运行。现在我需要将代码编译为内核模块。为此,afaik,我至少应该重写代码并将函数替换为malloc、calloc、free、printf与它们的内核等价物,因为它们完全是用户空间函数。然而,问题是我没有系统中使用的一些定制库的源代码,而这些库在它们的函数中调用了malloc等。所以,基本上,我可能需要重新实现整个库。现在的问题是:如果我编写自己的malloc实现作为kmalloc的包装器,它会是一个非常肮脏的hack,如下所示:void*malloc(size_tsize){returnkmalloc(size,GFP_U

c - 将用户空间代码移植到内核空间

我有一个主要用C语言编写的大型系统,到目前为止一直在用户空间中运行。现在我需要将代码编译为内核模块。为此,afaik,我至少应该重写代码并将函数替换为malloc、calloc、free、printf与它们的内核等价物,因为它们完全是用户空间函数。然而,问题是我没有系统中使用的一些定制库的源代码,而这些库在它们的函数中调用了malloc等。所以,基本上,我可能需要重新实现整个库。现在的问题是:如果我编写自己的malloc实现作为kmalloc的包装器,它会是一个非常肮脏的hack,如下所示:void*malloc(size_tsize){returnkmalloc(size,GFP_U

c - 没有 dlsym 的 Linux 中的函数插入

我目前正在做一个项目,我需要跟踪几个系统调用和低级函数的使用情况,比如mmap、brk、sbrk。到目前为止,我一直在使用函数插入来执行此操作:我编写了一个与我要替换的函数同名的包装函数(例如mmap),然后将它加载到程序中设置LD_PRELOAD环境变量。我通过使用dlsym加载的指针调用实际函数。不幸的是,我想要包装的函数之一sbrk被dlsym内部使用,所以当我尝试加载符号时程序崩溃了。sbrk在Linux中不是系统调用,所以我不能简单地使用syscall来间接调用它。所以我的问题是,如何在不使用dlsym的情况下从同名包装函数调用库函数?是否有任何编译器技巧(使用gcc)可以让

c - 没有 dlsym 的 Linux 中的函数插入

我目前正在做一个项目,我需要跟踪几个系统调用和低级函数的使用情况,比如mmap、brk、sbrk。到目前为止,我一直在使用函数插入来执行此操作:我编写了一个与我要替换的函数同名的包装函数(例如mmap),然后将它加载到程序中设置LD_PRELOAD环境变量。我通过使用dlsym加载的指针调用实际函数。不幸的是,我想要包装的函数之一sbrk被dlsym内部使用,所以当我尝试加载符号时程序崩溃了。sbrk在Linux中不是系统调用,所以我不能简单地使用syscall来间接调用它。所以我的问题是,如何在不使用dlsym的情况下从同名包装函数调用库函数?是否有任何编译器技巧(使用gcc)可以让

c++ - 从 malloc() 进行的 Windows 和 Linux native 操作系统/系统调用是什么?

我最近看到了下面的帖子:Amemoryallocatorisn'tlowerlevelthanmalloc.(Thedefaultallocatortypicallycallsmallocdirectlyorindirectly)Anallocatorjustallowsyoutospecifydifferentallocationstrategies.Forexample,youmightuseanallocatorwhichcallsmalloconcetoretrievealargepoolofmemory,andthenforsubsequentallocationreques

c++ - 从 malloc() 进行的 Windows 和 Linux native 操作系统/系统调用是什么?

我最近看到了下面的帖子:Amemoryallocatorisn'tlowerlevelthanmalloc.(Thedefaultallocatortypicallycallsmallocdirectlyorindirectly)Anallocatorjustallowsyoutospecifydifferentallocationstrategies.Forexample,youmightuseanallocatorwhichcallsmalloconcetoretrievealargepoolofmemory,andthenforsubsequentallocationreques

c - 使用 mmap 和 munmap 实现你自己的 malloc/free

我使用mmap实现了自己的ma​​lloc和free。现在由于与free不同,munmap也将长度作为参数,因此我将长度作为附加信息放在映射内存中。我的ma​​lloc和free的代码如下所示。我想问一下,如果这段代码很好,或者我是否仍然遗漏任何东西或以错误的方式做某事。void*malloc(size_tsize){int*plen;intlen=size+sizeof(size);//Addsizeof(size)forholdinglength.plen=mmap(0,len,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS,0,0);

c - 使用 mmap 和 munmap 实现你自己的 malloc/free

我使用mmap实现了自己的ma​​lloc和free。现在由于与free不同,munmap也将长度作为参数,因此我将长度作为附加信息放在映射内存中。我的ma​​lloc和free的代码如下所示。我想问一下,如果这段代码很好,或者我是否仍然遗漏任何东西或以错误的方式做某事。void*malloc(size_tsize){int*plen;intlen=size+sizeof(size);//Addsizeof(size)forholdinglength.plen=mmap(0,len,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS,0,0);

linux - 有些分配器是懒惰的吗?

我在Linux中写了一个C程序,它malloc内存,循环运行,TOP没有显示任何内存消耗。然后我对该内存做了一些处理,TOP确实显示了内存消耗。当我malloc时,我是真的“获得内存”,还是有一个“惰性”内存管理,它只在我使用它时/当我使用它时才给我内存?(还有一个选项,TOP只有在我使用的时候才知道内存消耗,所以我不确定这个..)谢谢 最佳答案 在Linux上,malloc使用sbrk()或mmap()请求内存-无论哪种方式,您的地址空间都会立即扩展,但Linux不会分配实际的物理内存页面,直到第一次写入有问题的页面。您可以在VI