linux系统使用小端内存,linux进程内存管理

1.数据的内部存储

大端:起始地址存放数据的高位

小端:起始地址存放数据的低位

大端小端是由处理器的体系结构决定的,不是操作系统。

测试方法:

点击(此处)折叠或打开

#include

int main()

{

int a=0x12345678;

char *p=NULL;

p=&a;

if(*p = 0x12)

printf("big endian.\n");

else

printf("little endian.\n");

return 0;

}

2.C程序的存储布局--代码段

代码段是用于存放CPU要执行的指令段。代码段只读,任何对代码段的修改,都会造成段错误。

一个程序在多数情况下是不需要修改自身代码的,只有一种情况例外,就是一些长时间运行的升级程序。

可以采用共享库的形式,来修改一个运行中的程序的代码段。

3.C程序的存储布局--数据段和缓冲段

初始化数据段(.data):也称为数据段。包含初始过的全局变量和静态变量。该段的大小在编译时确定。

未初始化数据段(.bss,block start with symbol):这个段中的数据是程序没有明确初始化的静态变量+全局变量。又叫做块缓存段,块存储段

在elf格式的目标文件中,bss段并不占用实际的空间,而只是一个占位符,已告知指定位置上应当预留全局数据的空间。块缓存段存在的原因是为了提供磁盘上存储空间的利用率。

未初始化数据段不会存储在外存上,在程序运行时,由内核将段中的数据初始化成0或NULL。

4.C程序的存储布局--栈

所有的自动变量+函数调用时所需要保存的信息(返回地址,函数调用前各寄存器的值)都保存在栈中。

每个函数都有对应的栈帧。栈帧在一个函数调用时被创建,在函数调用结束时消亡。所有的函数都是基于进程的栈创建的,从全局的角度来看,一个进程只有一个栈(也只有一个堆),但每个函数执行时,都对应一块独立的栈帧。所以不应该在栈帧上传递一个返回值的地址,因为函数调用结束后,该栈帧有可能会被覆盖掉,相应的,对该地址的引用就会是无效的。

注意:不应该将一个指向局部变量的指针作为返回值返回。在linux环境下,这种方法是错误的。但Windows平台下,似乎是可行的。

函数调用结束后,栈帧上的内容还存在,函数返回的是一个局部变量的地址。如果该栈帧被其他函数覆盖,对该指针的引用也就失效了。

5.C程序的存储布局--堆

堆,用于存储用户申请的内存空间,系统通常在堆中进行动态内存分配。

对于小端处理器,栈地址由高-->低,堆地址由低-->高增长。大端处理器正好相反。

6.常量的存储

C语言中常量有两种:简单常量,如1234,‘c';复杂常量,如iloveyou等字符串常量。

在汇编语言中,对于常量参与运算的C语句,如a+1的汇编代码被汇编成如下:

点击(此处)折叠或打开

mov r1, a

add r1, 1

简单常量,它随着指令一起存储,也就是说简单变量存储在程序的代码段里。

对于复杂常量,长度不定,放在代码段里面是不明智的,因此编译器将其存储在一个特殊的数据段,将其存储的首地址转换成一个简单变量随着指令存储。这个段叫做.rodata段。

7.动态内存管理

C语言中只能通过malloc和其他派生函数动态申请内存,malloc作为一个库函数,它的linux版本封装了

sbrk()系统调用,该系统调用负责向操作系统申请内存。malloc函数分配的内存在堆中,全局有效。

文件:malloc.c

点击(此处)折叠或打开

#include

#include

void fenpei1(int **p)

{

*p = (int *)malloc(sizeof(int));

}

void fenpei2(int *p)

{

printf("the heap is %d\n",*p);

}

int main(void)

{

int *p;

fenpei1(&p);

*p=4;

fenpei2(p);

free(p);

fenpei2(p);

return 0;

}

运行:./malloc

the heap 4

the heap 0

做如下改动:

点击(此处)折叠或打开

void fenpei1(int *p)

{

p = (int *)malloc(sizeof(int));

}

将fenpei1函数修改为如上形式。传递给fenpei1函数的是int *p的一份拷贝,p在函数返回后就消失了。

这时,p所指向的还是一块未知区域,再对p进行解引用赋值就出错了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/554224.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

internet explorer浏览器市场份额仍超Chrome和Firefox

internet explorer浏览器市场份额仍超Chrome和Firefox 很多人并不知道 Microsoft Edge 是个什么浏览器,原因很简单,目前该浏览器仅支持 Windows 10 操作系统,而且 Edge 也是随 Windows 10 的发布才首次出现在人们的视野当中。微软对其寄予厚…

linux如何挂载nfs目录,linux – NFS导出已经挂载NFS的目录(在服务器上)

我有一个NFS服务器,A,共享一个文件夹. B正在安装文件夹. B也在分享该文件夹.但是C无法安装它. C上的错误是:mount.nfs: 192.168.0.1:/export/myfolder Failed,reason given by server: Permission denied在B上,/ var / log / messages中的错误是Aug 17 15:21:21 B m…

chrome浏览器无法加载百度网页启动组件怎么办

chrome浏览器无法加载百度网页启动组件怎么办 chrome浏览器无法加载百度网页启动组件怎么办?chrome浏览器百度打不开提示无法加载百度网页启动组件怎么办?使用chrome浏览器打开百度的时候总是无法访问,提示“无法加载百度网页启动组件”,该怎么解决这…

linux线程同步教程,多线程同步

1.linux使用多线程同步的方法1)互斥锁:当线程A锁定了互斥变量时,线程B再去锁定时就会被挂起,直到A解锁。注意:当线程要不断的去轮询检查某个条件以判断是否可以操作需同步的数据时,可使用条件变量提高效率。demo如下&a…

为什么谷歌浏览器打不开 Google Chrome打不开解决方法

核心提示:很多用户反映有谷歌浏览器打不开状况,下面小编就为大家分享一个解决方法。 谷歌浏览器它是又Google(谷歌)公司开发的免费网页浏览器。它在全球拥有大量用户群体。很多用户反映有谷歌浏览器打不开状况,下面小编就为大家分享一个解决…

linux 串口信息记到日志,[linux学习笔记]之一:ubuntu ch340调试备忘

[linux学习笔记]之一:ubuntu ch340调试备忘已有 2183 次阅读2016-11-8 21:52|个人分类:linux最近迷上了Linux,入了一块板。电脑使用win7ubuntu 双系统,可是调试的时候就麻烦了,ubuntu下写好sd卡镜像,调试的时候还要切换…

Chrome 69正式版浏览器遭批 恢复完整显示域名

Chrome 69正式版浏览器遭批 恢复完整显示域名 日前,谷歌发布了全新的Chrome 69正式版浏览器,带来了全新的材料设计等特性,也算是庆祝chrome浏览器10周年。不过,新版Chrome隐藏域名中的“www”遭到了用户批评,并认为会…

微软协助谷歌开发ARM平台Chrome浏览器

微软协助谷歌开发ARM平台chrome浏览器 美国科技博客9to5xx发现,,近日,微软的一些工程师正在为谷歌Chrome浏览器贡献代码,帮助其成为ARM平台上的原生Windows应用。 此外,高通高管上月表示,高通也正努力将原…

嵌入式linux 配置usb otg,嵌入式linux系统环境下USB设备的驱动实现

0 引言嵌入式linux系统环境以其易于移植裁减、内核小、效率高、完整、原代码开放及性能优异等特点,在嵌入式领域得到了非常广泛的应用。Linux的USB设备端的源代码中主要有USB device的海量存储设备、串口设备、网络设备等设备驱动程序及各种USB device控制器芯片的…

android Chrome浏览器快捷键

核心提示:在本教程中将为你介绍android Chrome浏览器快捷键! 众所周知,Google Android系统中内置的网页浏览器是桌面版Chrome浏览器的简化版本Chrome Lite,同样采用了开源的Webkit核心,安卓中文网整理了适用于搭载实体键盘G1的Ch…

linux 裸设备使用,linux裸设备使用

一、配置:RHAS4:1,将硬盘分区:#fdisk -l#fdisk /dev/sdb2,绑定:方式一:#raw /dev/raw/rawN /dev/sdbN#raw -qa#vi /etc/rc.localraw /dev/raw/rawN /dev/sdbN方式二:#vi /etc/sysconfig/rawdevi…

在iOS设备上如何使用Chrome浏览器的书签

核心提示:谷歌Chrome浏览器iOS版正式登陆AppStore。不过有很多人安装以后没有找到书签工具,以为没有。其实不然。iOS设备上的Chrome浏览器是内置有书签工具的,和Safari相比,不是很明显。只有搭配相应的App时,才能体现出…

linux p7zip密码,linux下7zip使用方法

现在流行的压缩软件有WIN平台下的winrar, winzip。Linux下则是bzip2, gzip等等。现在有一个叫做7z的压缩软件,号称是目前压缩比最大的软件。WIN平台下使用的是图形界面,使用方法和winrar差不了多少。但是在Linux下,7z可以使用的是命令行方式。…

下载腾讯视频里的视频_手机腾讯视频如何升级新版本

软件是否好用,还得大家下载腾讯视频安装才知道。本文分享怎么下载腾讯视频里的视频_手机腾讯视频如何升级新版本腾讯视频升级新版本。腾讯视频电影频道拥有大量高清在线电影资源,热门高清电影、好评电影、电影预告都可以在线观看,不去电影院也…

linux 上下文切换监控,[Linux] 查看进程的上下文切换pidstat

各个进程之间是共享 CPU 资源的,在不同的时候进程之间需要切换,让不同的进程可以在 CPU 执行,那么这个一个进程切换到另一个进程运行,称为进程的上下文切换。进程是由内核管理和调度的,所以进程的切换只能发生在内核态…

爱奇艺怎么看不了电视剧和视频

不管这个爱奇艺好用与否,都有一大批用户,本文小编分享“爱奇艺怎么看不了电视剧和视频”。爱奇艺客户端为您推荐更多精选热门视频,通过多条件筛选快速定位匹配结果,提供多种画质、多种语言切换播放和下载,支持边下载边…

linux arm9视频哪个好,谈谈ARM7与ARM9的区别

本文是写给准备学习ARM技术,而又没想好要学ARM7还是ARM9或者对ARM7与ARM9的区别不是很了解的初学者。希望本文对你们有点用处。由于职业的关系,经常会回答一些ARM初学者的问题,虽然问题千奇百怪,但以下两个问题绝对很有代表性。AR…

腾讯视频如何退出登陆

本文给大家整理了腾讯视频如何退出登陆方面的内容。腾讯视频支持在线进行加载,离线观看。 有时候我们要用一下别人的腾讯账号,这个时候就需要我们退出当前的账号,那么腾讯视频如何退出登陆呢?接下来我告诉大家~ 1、首先找到腾讯视频并打开…

linux通过yum安装nginx,Linux系统使用yum安装nginx教程

首先执行以下命令安装2个软件包:yum install epel-releaseyum install yum-utils然后新增yum源:vim /etc/yum.repos.d/nginx.repo写入以下内容:[nginx-stable]namenginx stable repobaseurlhttp://nginx.org/packages/centos/$releasever/$ba…

Chrome谷歌浏览器私密浏览自动开启功能获批专利

Chrome谷歌浏览器私密浏览自动开启功能获批专利 谷歌近日被授予一项新的专利:在桌面和移动浏览器中自动启用匿名浏览功能。谷歌这项美国专利号是8935798 B1,专利描述为用户使用浏览器上网,自动阻止浏览器存储浏览历史记录/用户输入文字&#…