linux 环境编程学习笔记 第三天 虚拟内存的分配


寒假学习 第三天 (linux 高级编程) 笔记 小结

晚上刷了笔记本的BIOS ,尽然刷坏了,折腾了一个晚上还没好,我勒个去快哭了。只能在自己的台式机上搞了。

一、虚拟内存的分配

 int brk(void *addr);                           分配空间,释放空间                        
 void *sbrk(intptr_t increment);          返回空间地址
#include<stdio.h>
#include<unistd.h>

int main()
{
    int *p = sbrk(0);
    *p = 222;
    
    return 0;
}

会出现 段错误
 
如果输出 p 的地址 在 maps 文件中看不到  有它的地址,说明p没有映射。
 
#include<stdio.h>
#include<unistd.h>

int main()
{
    int *p = sbrk(0);
    brk(p+1)
    *p = 222;
    
    return 0;
}

运行正常

这时看 p 地址 可以看到  有一个  1页区间的地址,p为这个的第一个地址。
sbrk 和 brk 相当于 在后台维护一个指针
sbrk(int)         先返回 再映射地址 在移动指针
                      如果是第一次用sbrk且参数是0  就返回一个没有映射过的地址。
                     如果已经有映射的内存,数是0就返回第一个映射过的,但不合法的地址。(因为不是上面的情况sbrk()会至少产生1页的地址)
                     sbrk(size)   返回  第一个映射过的 ,把后台管理的指针(追后一个映射过的地址)移动 size。
brk(地址)      直接把后台管理的指针移动到 指定的位置

int *p;
int *r;
p = sbrk(0);
r = p;
for(int i=0;i<10;++i)
{
    brk(r+1);
    *r = i;
    r++;
}

r = p; 
while(r!=sbrk(0))
{
    printf("%d\n",*r);
    r++;
}

保存0到9  再输出0 到9
 
sbrk和brk的异常处理
int brk(void* )            成功返回0  失败返回 -1
void *sbrk(int )          成功返回-1   失败反回 (void*)-1
 

二、其他知识点

linux/unix  错误函数
errno.h头文件
输出错误 三种方式:
perror();
printf("%m\n");
printf("%s\n",strerror(errno));