我想知道如何malloc和free工作.
int main() {
unsigned char *p = (unsigned char*)malloc(4*sizeof(unsigned char));
memset(p,0,4);
strcpy((char*)p,"abcdabcd"); // **deliberately storing 8bytes**
cout << p;
free(p); // Obvious Crash, but I need how it works and why crash.
cout << p;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果答案在记忆水平上是深入的,如果可能的话,我将非常感激.
我做了一个关于"匿名inode"的谷歌搜索,它似乎与epoll有关......但究竟是什么呢?
我试图了解标题中提到的两个文件.我抬头看了些什么东西; 但是,我无法理解如何从中提取有用的信息(或者我只是以错误的方式接近它).
让我解释一下:页面映射是一个相当新的"特征"伪文件,它包含分配给当前[pid]的虚拟页面的物理帧信息.也就是说,给定一个从地址x开始的虚拟页面,比如用于虚拟地址开始的'vas',我可以使用vas索引页面映射文件以获得映射的物理页面帧的64位.这些位包含有关该虚拟页面的信息.然而,当我提取位并进行一些移动时,我迷失了我所看到的东西.
这些位表示如下:0-54是页面帧号,55-60是页面移位,第63位是当前位,还有其他位对我不感兴趣.在我使用/ proc/[pid]/maps中的vas地址进行一些映射之后,似乎几乎每个进程的页面都被交换,即第63位始终为零.:(
我想问题是,如何有效地使用页面地图获取/ proc/[pid]/maps给出的地址的等效物理地址
公平地说,我发布了一个类似的问题,但几天前的方法有点不同.
如果有人能够对这个问题有所了解,我将非常感激.
===编辑===
要解决以下评论:我正在从/ proc/[pid]/maps读取一行,其行如下所示:
00400000-00401000 r-xp 00000000 08:01 8915461/home/janjust/my_programs/shared_mem 7ffffef1b000-7ffffef3c000 rw -p 00000000 00:00 0 [stack]
然后我将提取它接触的虚拟页面的数量并索引二进制文件/ proc/[pid]/pagemaps,并且对于每个虚拟页面,我可以提取它分配给它的物理页面.
输出如下:
00400000-00401000 r-xp 00000000 08:01 8915461/home/janjust/my_programs/shared_mem num_pages:1:86000000001464C6
虚拟范围中每个虚拟页面的一个物理地址.
读取行和提取物理地址的代码是:
74 /* process /proc/pid/maps, by line*/
75 while(fgets(line, 256, in_map) != NULL){
76 unsigned long vas;
77 unsigned long vae;
78 int num_pages;
79
80 //print line
81 printf("%s", line);
82
83 /*scan for the virtual addresses*/
84 n = sscanf(line, "%lX-%lX", &vas, &vae);
85 …Run Code Online (Sandbox Code Playgroud) 我在应用程序中有一些安全密钥.我想要安全地存储它.我喜欢将它存储在本机共享库中(可能是从某些代码生成的).之后,我希望它通过一种方法返回,该方法将检查原始APK的签名.所以没有人可以使用此文件,除了可信应用程序.我知道,ndk库也可以反编译,但是对本机代码进行逆向工程甚至比java .class文件更难.
题:
我试图抓住784 MiB的内存.是的,我知道这对32位手机来说很重要,但以下调用在Android 5.0之前有效:
mmap(0, 0x31000000, PROT_NONE, MAP_ANON | MAP_SHARED, -1, 0);
Run Code Online (Sandbox Code Playgroud)
但是,在不同制造商的三种不同设备上,升级到Android 5.0已经打破了这一局面.我假设这是5.0中内存分配功能的一些变化; 也许需要传递不同的标志?
这是logcat中返回的错误消息:
E/libc? mmap fail (pid 9994, tid 10125, size 822083584, flags 0x21, errno 12(Out of memory))
Run Code Online (Sandbox Code Playgroud) 我想要做的事情我觉得非常简单,我只是不确定如何做到这一点.
具体来说,我只想获得一个在另一个进程中加载的模块列表(共享/动态库).以及获取该模块在给定进程中的起始地址.
通过GDB获取此信息非常简单.您只需连接到该流程,然后键入"info shared".这是我想要的确切信息类型.如:
Num Basename
类型地址原因| | 来源| |
| | | | | |
1 Adium
- 0x1000 exec YY /Applications/Adium.app/Contents/MacOS/Adium(offset 0x0)2 dyld
- 0x8fe00000 dyld YY/usr/lib/dyld,位于0x8fe00000(偏移量0x0),前缀为"__dyld_"3 WebCore F 0x95b6a000 dyld YY /System/Library/Frameworks/WebKit.framework/Versions/A/Frameworks/WebCore.framework/Versions/A/WebCore位于0x95b6a000(偏移量0x95b6a000)
有没有人知道如何以编程方式执行此操作?显然,模块负载是动态的,所以我需要确定它的位置.
我正在尝试一个不断分配内存的简单C程序:
for ( i = 0; i < 10000; i ++ )
{
array[i] = malloc( 1024*1024 );
if ( array[i] == NULL )
{
break;
}
printf("Sleeping...%d\n", i);
sleep( 60 );
}
Run Code Online (Sandbox Code Playgroud)
完整代码粘贴在这里:http://tny.cz/2d9cb3df
但是,当我cat /proc/pid/maps,我没有任何[heap]部分.为什么?
08048000-08049000 r-xp 00000000 08:11 17 /data/a.out
08049000-0804a000 r--p 00000000 08:11 17 /data/a.out
0804a000-0804b000 rw-p 00001000 08:11 17 /data/a.out
0804b000-0805e000 rw-p 00000000 00:00 0
b74c6000-b75c8000 rw-p 00000000 00:00 0
b75c8000-b7775000 r-xp 00000000 08:01 3539272 /lib/i386-linux-gnu/libc-2.17.so
b7775000-b7777000 r--p 001ad000 …Run Code Online (Sandbox Code Playgroud) 我到处寻找答案,但我想我已经达到了我能找到的极限.我的问题似乎与此有点相关:升级到Lollipop后,32位设备上的Android NDK mmap调用被破坏但没有提供答案.
我的问题是我尝试通过mmap调用从文件中存储映射457232384字节.在Android 5.1.1的两个不同的设备(三星Galaxy Note 3和OnePlus One,每个3GB RAM)上,该调用失败,错误12"内存不足".实际上,当我尝试分配超过300MB的内存时,调用失败.313524224字节(299MB)工作,314572800(300MB)不会.
事情是,同样的调用适用于第四台仍在Android 4.4.2上的设备.更奇怪的是,这个调用适用于带有SDK 21(Android 5.0)的Android ARM模拟器.不用说,可以毫无问题地加载相同数量的数据(不是mmap').
dmesg向我报告:
<3>[ 1137.488411] [0:Thread-298: 4267] arch_get_unmapped_area (TASK_SIZE - len < addr) len=457232384 task size=3204448256 pid=4267 do_align=0 addr=3034054656 mmap_base=3069939712
Run Code Online (Sandbox Code Playgroud)
尝试映射文件的函数(来自openfst)如下:
MappedFile* MappedFile::Map(istream* s, const FstReadOptions &opts,
size_t size) {
size_t pos = s->tellg();
if (opts.mode == FstReadOptions::MAP && pos >= 0 &&
pos % kArchAlignment == 0) {
int fd = open(opts.source.c_str(), O_RDONLY);
if (fd != -1) {
int pagesize = getpagesize();
off_t offset = …Run Code Online (Sandbox Code Playgroud) 是否可以获取 Linux 中特定文件描述符上的内存映射总量?为了清楚起见,我制作了一个如何打开/创建内存映射的小示例代码:
int fileDescriptor = open(mapname, O_RDWR | O_CREAT | O_EXCL, 0666);
if(fileDescriptor < 0)
return false;
//Map Semaphore
memorymap = mmap(NULL, sizeof(mapObject), PROT_READ | PROT_WRITE, MAP_SHARED, fileDescriptor, 0);
close(fileDescriptor);
Run Code Online (Sandbox Code Playgroud)
内存映射由多个进程使用。我可以访问将使用此内存映射的其他进程的代码库。如何以 100% 正确的方式获取 fileDescriptor 上有多少个映射?
我有一个程序,在初始化时查询时,立即使用> 2 GB的RAM.基本上代码是这样的:
#include <blah>
int main() {
cout << get_mem_usage() << endl;
//Lots of things happen, but no significant memory usage
return 0;
}
Run Code Online (Sandbox Code Playgroud)
产量:[2013-02-15 18:38:05.865283] 2147.71 Mb
但是,我链接到许多不同的共享对象文件:我检查了ldd,我链接到58个库,组合的.so大小为66 MB.
我很确定get_mem_usage程序返回正确的值:这些与top和massif输出一致.
我还要提一下,我正在与高能物理分析的ROOT框架联系起来.
我使用的是Linux x86_64,而get_mem_usage()函数是自行开发的.
如果可能的话,我想减少程序的内存使用量.
我可以识别 /proc/$PID/maps 文件中的 text、ds 和 bss 段(通过猜测或在特定段的访问说明符的帮助下)。但是堆和堆栈段是依次给出的。有没有办法确定哪个段属于堆栈,哪个属于堆?
----- 本例中如何识别堆和栈的分界 ---------- 0a8a0000-0ab2e000 rw-p 0a8a0000 00:00 0 [heap]
< b648e000-b648f000 ---p b648e000 00:00 0
<b648f000-b6496000 RW-p 00:00 b648f000 0
<b6496000-b6497000 --- p b6496000 00:00 0
<b6497000-b649e000 RW-p 00:00 b6497000 0
<b649e000-b649f000 --- p b649e000 00:00 0
< b649f000-b64a6000 rw-p b649f000 00:00 0
< b64a6000-b64a7000 ---p b64a6000 00:00 0
< b64a7000-00600000000-
p60000000000000000000000000004 00:00 0
< b64af000-b657a000 rw-p b64af000 00:00 0
< b657a000-b657b000 ---p b657a000 00:00 0
< b657b000-b065a0p-065000-b065a000
< b65a5000-b65a6000 ---p b65a5000 00:00 …