在计算机科学中,就地执行,或称片内执行(英语:Execute in place,XIP)是指CPU直接从存储器中读取程序代码执行,而不用再读到内存中。好处即是程序代码无需占用内存,减少内存的要求。
为实现就地执行,必须满足几个条件:
NOR Flash和EEPROM通常能满足上述要求。
通常,第一阶段的引导程序是一个XIP程序,它链接时指定从flash芯片上电后的映射地址开始运行,设置系统RAM,把第二阶段的引导程序或操作系统内核加载进RAM。
在这初始化期间,可写存储器可能不可用,所有的计算都必须在处理器寄存器中执行。因此,第一阶段的引导程序通常以汇编语言编写,提供尽量少的功能,只为下一阶段程序的提供正常的执行环境。有些处理器也能通过嵌入少量SRAM或允许将Cache用作RAM来允许用高级语言编写这些程序。
对于内核和引导程序,地址空间通常是内部分配的。为了使用XIP,需要指示链接程序将不可修改的数据和可修改数据放在不同的地址区间,并提供将可修改数据复制到可写内存的机制,使得任何程序正常访问这些数据。
如果地址空间是外部分配的,比如不提供虚拟内存的系统,编译器需要通过向数据区域的私有副本的指针添加偏移量来访问所有可修改的数据。在这种情况下,外部加载程序负责设置实例特定的内存区域。
主内存初始化之前,BIOS 和 UEFI 使用 XIP技术。
文件系统的XIP通常难以满足。在没有页表的系统中,整个文件必须连续存储,不能碎片化,而基于闪存的文件系统通常会将数据分配到擦除周期最小,磨损最少的扇区,以延长生命周期。
复杂性和速度的折中意味着XIP通常仅用于第一阶段引导程序或RAM极度短缺的情况。例如,第二代至第四代的视频游戏机如Atari 2600将ROM卡带的地址和数据总线连接到游戏机的地址和数据总线,,从而能在只有128字节的RAM上。
AXFS (高级XIP文件系统,Advanced XIP File System)是Linux系统上一种较新的文件系统,旨在克服与XIP相关的,特别是在XIP用户空间应用程序方面的某些缺点。例如,可以将可执行的二进制文件拆分为“ XIP区域”,从而避免了上面提到的碎片限制。NetBSD的实现也在开发中