当前位置:  技术问答>linux和unix

Linux程序内存管理问题请教

    来源: 互联网  发布时间:2016-04-22

    本文导语:  现在脑子里一塌糊涂。 (1)先讲根源: 我在测试两个段错误的程序: code1: int main(void) {     int a[4];     printf("a[4]=%dn",a[4]);     printf("a[10000]=%dn",a[10000]);     a[4]=5;     printf("a[4]=%dn",a[4]);     a[10000]=5;   ...

现在脑子里一塌糊涂。
(1)先讲根源:
我在测试两个段错误的程序:
code1:
int main(void)
{
    int a[4];
    printf("a[4]=%dn",a[4]);
    printf("a[10000]=%dn",a[10000]);
    a[4]=5;
    printf("a[4]=%dn",a[4]);
    a[10000]=5;
    printf("a[10000]=%dn",a[10000]);
    return 0;
}

code2:
int main(void)
{
    int a[4];
    printf("a[4]=%dn",a[4]);
    printf("a[1000]=%dn",a[1000]);
    a[4]=5;
    printf("a[4]=%dn",a[4]);
    a[10000]=5;
    printf("a[1000]=%dn",a[1000]);
    return 0;
}

code1的执行结果是:
    a[4]=-1078954782
    Segmentation fault(core dump)
code2的执行结果是:
    a[4]=-1078954782
    a[1000]=0
    a[4]=5
    Segmentation fault(core dump)

再讲我的迷惑
我根据上面的现象将内存划分为一下使用情况:
    1。可读写的区域 -----a[4]
    2。只读不可写的区域--- a[1000]
    3。不可读不可些的区域-- a[10000]
根据我的底子很薄的汇编知识,我妄加推断: 
    1。a[4]虽然数组地址边界越界,但仍在堆栈中,属于可读写区域
    2。a[1000]在只读数据段中(本程序的也不知道别的程序的?)
    3。a[10000]在代码段中(本程序的也不知道别的程序的?)
后来google了一下,发现代码段是只读的属性,所以a[1000]也可能指向代码段。

请高手帮我解释一下
(1)内存中什么区域是不可读写的?有没有可写不可读的区域?
(2)Linux对程序的空间是怎么管理的?是给内核分配一个固定的内存空间,给其他应用程序分配指定大小的空间还是其他方式?


|
1 对用户程序来说,内核空间应该是不可读写的
可写的区域一定可读
2 看看 understanding linux kernel 中进程地址空间一章吧

|


每个进程中,都会有4G的进程空间,3g在用户空间,1G在内核空间,在程序中定义的变量,编译后就是进程的逻辑空间内给分配了一个地址,注意,这时候仅仅是个虚拟的地址而已,并没有实际的物理的对应空间.当程序运行时,并不一定就给就给这个地址影射真实的物理空间,当程序内要使用这个变量是,系统就会为它分配真实的物理空间,可能会多分配一些,它是按固定块分配的.这样,你使用时,按固定地址读写,没有问题,有时候多读写一点虽然已经溢出,但也没有问题.但超过实际的物理空间后要求后,系统就会住址你的物理要求了.

根据进程空间布局,代码段,数据区是只读型的,当你的过分的要求是他们时,就只能读不能写了.

有点乱,讲不清了.

|


回楼上的,

1,研究了这些问题后,才有可能实现定义数组越界的地方。比如某个大量引用的数组越界了,为了不更改大量代码,就必须找到具体的越界地址而更改程序的错误。

2,另外也可以帮助自己在写代码的时候时刻保持警惕!

|
对上面的问题作出如下看法:
一:完全是非法访问导致的结果,结果具有不可预知性
二:由一可以知道,非法访问包括读和写,楼主的代码一里面的第二个printf: printf("a[10000]=%dn",a[10000]);
将数组的数值改小为6000或者4000等,会出现同样的结果:段错误!只有更小的时候才会出现“随机”的结果,因此,根据程序一里面的数组a[10000])的数值10000来做的任何判断都是错误的。
三:根据一和二可以知道是非法访问,那么我们将数组改为int a[40000],系统会为你分配相应的栈,只要在范围以内,都是不会报错误的。
四:根据以上的结果,可以得出楼主的关于
“ 1。a[4]虽然数组地址边界越界,但仍在堆栈中,属于可读写区域 
    2。a[1000]在只读数据段中(本程序的也不知道别的程序的?) 
    3。a[10000]在代码段中(本程序的也不知道别的程序的?) 

等的看法都是没有依据的,只是建立在非法访问的基础上的。但是!问题是,为什么会出现怎样的错误呢?...看上面的解释。。。

|
1.
数组访问越界的结果是不可预料的,LZ的试验,只能说是某台机器某个系统在某个特定的时间运行的结果。
2.
printf和Segmentation fault的先后顺序不一定可靠。就是说,有可能先执行了某个printf然后出错,但是这个printf该打出来的东西可能在缓冲区里来不及打印,给人一种错觉就是这个printf没执行。
3.
不可写的地方不见得就是代码段。比如,函数的返回地址也在栈上,如果数组越界改写了返回地址,也会挂掉。
http://blog.csdn.net/k2eats/archive/2008/07/04/2610433.aspx

|
code1的
读a[10000]出错。原因1. 该地址没有分配内存;2. 即使分配了内存也没有范围权限。

code2的
写a[10000]出错。原因同上。

可读、写的情况是,该地址已分配了内存(无论是谁分配的)并有读写权限。


    
 
 

您可能感兴趣的文章:

  • 请教Linux下pgadmin3-1.0.2的编译和安装!!高分请教!
  • 各位大虾,请教装了REDHAT9操作系统后,启动时无法引导到LINUX,请教该如何解决啊
  • 向linux达人请教linux下5.1声道测试工具
  • 请教一下,如果想在linux下开发java,选哪个版本的linux好一点
  • 小弟想请教,如果现在不像装linux了怎样把linux的分区改回ntfs格式的?
  • 请教:linux启动盘和一张盘的linux有何区别?
  • 请教linux高手,在Linux
  • 在linux下面怎么安程序啊?我刚裝了一个 linux,下了一个迅雷安装程序,可是不知道怎么安装啊?真心请教。
  • 初次接触linux,关于linux 用户权限问题请教!
  • 请教linux 下的adsl拨号问题.
  • 【请教】LINUX 下SNMP的MIB开发
  • 请教象我这样的硬盘应如何安装Linux,我昨天试装了,但有问题。(老问题了,也看了前面的帖子,但还是来请教,请多指教)
  • 各位大狭!小弟初学Linux,请各位列举学Linux的网站,留下QQ,Email以向各位请教!!!多谢了!!!
  • 菜鸟请教Linux
  • 高手看过来:请教如何在移动硬盘上安装Linux?
  • 请教:如何在Linux下获得EDID信息
  • 请教风河 linux内核 如何配置使之支持xwindows?
  • 请教大家一下,linux运维方面的书应该读什么?
  • 请教:如何直接使用RedHat Linux 9的ISO文件安装Linux?
  • 我的linux装不上啊???请教高手
  • linux下free命令显示的内存使用情况分析
  • 哪位前辈给解释下linux下虚拟内存和物理内存的关系!
  • Linux内存文件系统(ramdisk)的三种实现方式
  • linux下内存泄露检测工具 mtrace 如果记录.so文件中的内存信息
  • linux内存文件系统ramfs实现原理
  • 有人熟悉DMA吗?我要实现内存中的内存的“搬动”。(LINUX)
  • linux下进程占用内存空间详解
  • 如何让linux没有到达内存瓶颈时回收内存页并占用最少资源
  • Linux 共享内存介绍及实现代码
  • 请教关于linux内存管理问题,如何给定义的变量指定固定内存段
  • Linux/Centos/Ubuntu清除系统缓存释放内存命令介绍
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux下通过crond实现自动执行程序
  • 为什么linux下的C++程序这么少见? 请问那里有linux下的C++程序?什么类型的程序都可以.
  • Linux下指定运行时加载动态库路径及shell下执行程序默认路径
  • linux上的程序怎样远程启动另一个linux系统上的某个程序
  • 如何使用linux下gdb来调试python程序
  • 请指点: 在windows下能否通过程序来获取linux下的用户列表,甚至通过自己写的windows程序界面增加修改linux的用户
  • Linux下c/c++开发之程序崩溃(Segment fault)时内核转储文件(core dump)生成设置方法
  • Linux程序员在公司里做什么程序?(Linux程序员请进)
  • 我的linux程序 如何 在pc机器上运行。现在我用arm-linux-g++ 编译后的程序在我的嵌入设备上运行。
  • Linux 编程怎么样在程序开启一个程序,和关闭一个程序?
  • Linux下的程序是在内存中运行的吗?为什么在程序运行的时候可以删除程序文件?
  • 请指点: 在windows下能否通过程序来获取linux下的用户列表,甚至通过自己写的windows程序界面增加修改linux的用户 100分相赠
  • linux初学者一简单问题!在线送分!linux设备驱动程序一书的第一个程序.
  • 最进想学习LINUX程序设计,想了解一下在LINUX下的C++程序开发工具有哪些?有快速做界面的那种吗?
  • 我写了个linux下的网络程序,程序在多个电脑间通信,但是我没有多个电脑,怎么调试这样的程序啊?
  • linux下,一个程序如何向另一个程序发送消息,另一个程序如何接收
  • 请问载linux下如何调试汇编程序,有没有像debug的程序。
  • linux的程序员是不是比windows程序员的薪水高啊?
  • 菜鸟求助:Linux 应用程序后台启动后关闭窗口程序退出
  • 请教:如何在linux服务器上实现一个程序,该程序可启动远程linux客户端上的一个脚本(sh后缀)的执行
  • 学了linux程序设计后能不能编写出应用程序
  • 请教象我这样的硬盘应如何安装Linux,我昨天试装了,但有问题。(老问题了,也看了前面的帖子,但还是来请教,请多指教) iis7站长之家
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3