假设32位的,linux应用程序的线性地址的范围是0-3G,如果一个应用程序代码段长度为5G,那么线性地址怎么分配??

解决方案 »

  1.   

    32位系统最大寻址地址为4G空间,其中内核寻址1G,应用寻址2G,这个可以在通过内核配置改变。你说的5G的应用程序这个和上面的虚拟地址没有关系,能不能启动由你物理内存决定,启动这个进程时,虚拟内存转换为物理内存交给内核。
      

  2.   

    cs:ip指向当前执行的指令,那请问5g的代码段怎么找到的下一条指令的?ip寄存器是32位,请问怎么找大于4g的代码指令,怎么找,怎么找?
      

  3.   

    根据《深入理解Linux内核》的解释,当RAM容量大于4GB时,Linux映射一个896MB的RAM窗口到内核线性地址空间,剩余的RAM留着不映射,并由动态重映射来处理。
    也就是说,线性地址和物理地址之间的映射是会变化的。
      

  4.   

    32位系统中,linux代码段描述符中段限长4G。我想的问题是:代码段长度如果是4G大小,5G大小,这个应用程序能不能运行。不是来问的4G的RAM怎么运行5G的程序。我说的是代码段长度,代码段长度,代码段长度。。
      

  5.   

    每一条指令都有有一地址吧,3G的线程地址,怎么分配给4G的代码段呢?cs:ip中,ip中存的下条指令的地址,虽然是最近的,那也得有地址吧?
      

  6.   

    elf文件执行过程中需要把文件的代码段通过elf_map映射到内存,
    一、网文看到这个elf_map通过mmap映射的,按照mmap直接映射代码段,逻辑地址空间是不够的。
    二、我是没有自己看代码的。建议你看看elf_map的代码,看看是怎么实现的;是不是直接把elf执行文件mmap直接映射进内存的。就能确认问题了。
      

  7.   

    32位系统寻址空间是4GB, 每个进程的虚拟地址空间都是各自独立的4GB, linux内核默认配置是用户态空间0-->3GB,内核态3GB-->4GB.  程序在被编译成可执行文件之后,它的各条指令地址就被确定下来,如果程序大小超过能分配的地址空间,编译器就会报错。因此代码段超过4GB的大小,在32位系统根本就编译不出来。
      

  8.   

    在32位系统中,用户地址空间为0-3G,因此,你能用到最多的虚拟地址空间也就3GB;
    你说一个应用程序代码段长度为5G,首先用32位编译器根本就编译不出来这样的应用程序;
    在32位系统上的应用程序,那些代码段、数据段、堆栈段等等,首先不能超过3GB,另外还要留出一部分空间供你程序中malloc分配,如果3GB地址空间用完了,你程序中在malloc内存就会报错,或者执行程序会导致堆栈溢出等等问题。