Closed. This question needs to be more focused。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题。
                        
                        2年前关闭。
                                                                                            
                
        
我写了一段代码,在其中我将内存分配给变量Bextradata(它是结构的成员,也使用malloc分配了该结构),如下所示:

 Bextradata = (U8_WMC *) malloc(Size);
 memset(Bextradata, 0,Size);
 memcpy(BextraData,pdata + 18,Size);


然后再尝试一次在其他文件中读取此变量,那么该变量将如何从内存中读取,会将其放置在缓存中还是从主内存中读取。

提前致谢

最佳答案

在您了解CPU的工作原理之前,您需要了解一些术语。 CPU由ALU(用于算术和逻辑运算),控制单元和一堆寄存器组成。 CPU中的寄存器数量取决于体系结构并有所不同。当前存在的寄存器类型为通用寄存器,专用寄存器指令指针和其他一些寄存器。您可以阅读有关它们的信息。现在,当我们通常说32位处理器或64位处理器时,我们指的是CPU寄存器的大小。

现在让我们看下面的代码:

int a = 10;
int b = 20;
a = a + b;


加载上述程序后,其指令将存储在主存储器中。程序中的每条指令都存储在主存储器中的某个位置。每个位置都有一个特定的大小(再次取决于体系结构,但是我们假设它是一个字节)。每个位置都有一个地址。 RAM中特定位置的地址大小等于指令指针的大小。在64位系统中,指令指针的大小为64位。这意味着它可以寻址多达2 ^ 64-1个位置。而且由于1个位置通常为1个字节,因此理论上对于64位系统,总RAM可能为16艾字节。 (对于32位系统是2 ^ 32-1〜4 GB)

现在让我们看一下第一条指令a =10。这是一个存储操作。计算机可以执行以下基本操作-加,乘,减,除,存储,跳转等。您可以阅读任何处理器的指令集,以获取更多信息。指令集又因系统而异。回来,当程序加载到内存中时,指令指针指向第一个地址或基址。在这种情况下,它是a =10。该位置的内容被带到CPU的通用寄存器之一。由此,将其带到ALU,该ALU知道这是一个存储操作(添加了其他位以将其表示为存储操作)。然后,ALU将其存储到RAM以及高速缓存中的位置之一。将其存储在缓存中的决定取决于编译器和一个称为硬件预取的概念。当编译器解析程序时,它会看到常用变量并将其存储在缓存中。在这种情况下,我们可以看到将再次使用变量“ a”,以便编译器向程序添加其他中间指令,并将其也存储在高速缓存中。为什么?快速访问。 (关于速度,请始终记住寄存器>缓存> RAM>光盘)

在执行第一条指令之后,指令指针将递增,并且现在指向第二条指令,即b =20。这同样发生。

第三个是a = a + b。为此,实际上有四个操作(如果您从汇编级别看),分别是:1)获取a,2)获取b,3)添加a和b,4)将结果存储在a中。现在,由于变量a和b存在于高速缓存中,因此它们是从那些位置带来的。然后将它们相加并将结果存储回a。

希望您了解它的工作原理。

您还需要知道,当程序被加载到主存储器中时,它会占用一定的空间。该空间称为段。它具有一个基本地址和一个最终地址。您可以将基地址假定为第一条指令,将最终地址假定为最后一条指令。如果从程序中尝试取消引用从该段外部指向的指针,则会出现著名的错误-分段错误。例如 :

int *ptr = NULL;
printf(*ptr);


这将给我带来分段错误,因为我正试图取消对存储一个值为NULL的地址的指针的引用,并且由于NULL不在分段中,因此会出现段错误。

10-08 12:32