XIP ( eng. execute-in-place - execution in place ) er en teknologi, der giver mulighed for at eksekvere programkode direkte fra den persistente lagerenhed, hvorpå den er placeret, uden først at indlæse i RAM . Det er meget brugt til indledende indlæsning af computere, i indlejrede systemer på grund af behovet for at spare RAM-ressourcer, i nogle tilfælde bruges det også til store systemer . Siden 2010'erne til brug i server Linux-systemer med byte-adresserbar ikke-flygtig hukommelseerstattes af en mere generel teknologi - DAX .
For at teknologien kan fungere, skal dens understøttelse implementeres på tre niveauer: lagring , i operativsystemet og selve de eksekverbare programmer .
For første gang er eksplicit understøttelse af teknologien på lagerenhedssiden, såvel som dens forkortelse og afkodning, beskrevet i 1990 PCMCIA -specifikationen og er mere rettet mod brug med ikke-skrivbare enheder [1] . Oprindeligt var teknologien kun forbundet med PCMCIA og dens specielle specifikation, som definerede reglerne for placering af en binær kode og den rækkefølge, hvori den blev læst og eksekveret [2] , men som sådan blev en teknik implementeret for andre grænseflader og drev, den blev stærkere for alle lagerenheder.
For at XIP-tilstanden skal fungere på det drev, hvorpå programmet er placeret, skal der implementeres en grænseflade svarende til den, der bruges af den centrale processor til at få adgang til RAM. Understøttelse af dette implementeres enten på middleware-niveau eller ved hjælp af filsystemet . Blandt de mellemliggende værktøjer, der giver arbejde i XIP-tilstand, er MTD ( Memory Technology Device ) undersystemet , henholdsvis filsystemer, der arbejder på MTD forbi blokniveauet, skal understøtte de passende opkald for at XIP kan fungere. Samtidig understøtter ikke alle filsystemer, der arbejder gennem MTD, XIP, da mange af dem, oprindeligt fokuseret på bærbar teknologi, implementerede komprimering , i denne henseende er implementeringen af XIP i dem ikke-triviel, sådanne filsystemer inkluderer JFFS2 , YAFFS2 , LogFS , UBIFS [3] . Der er dog XIP-aktiverede komprimeringsfilsystemer, der arbejder på MTD, såsom AXFS , som fremhæver driften af XIP-tilstand som en definerende funktion ( avanceret XIP-filsystem ) [3] . De store blok-niveau komprimering filsystemer til vedvarende lagring, cramfs og squashfs , understøtter ikke XIP, men der er en patch til cramfs til at understøtte ukomprimeret XIP, og de fleste Linux-baserede mobiltelefoner brugte denne variant af cramfs [3] .
Blandt filsystemer til generelle formål, der kører oven på blokniveauet, tilbydes support i Ext2 og Ext3 ; Ext4 begyndte at portere XIP-understøttelse, men i 2014 blev det erstattet af mere generelle direkte adgangsmetoder - DAX [ [4] .
På trods af at teknologien blev brugt i indlejrede systemer, firmware og en række real-time operativsystemer længe før 2000'erne [5] , på siden af generelle operativsystemer, blev support først implementeret i Linux-kernen version 2.6 i 2005 [6] .
I 2006 blev teknologien understøttet til IBM zSeries mainframes , hvor der var behov for at køre mange forskellige forekomster af z/Linux fra et z/VM miljø med en fælles kerne og delte biblioteker , men med forskellige dataområder [7 ] . Hvis en lignende funktion til z/OS eksisterede før, ville dens direkte implementering for Linux kræve betydelige ændringer i kernekoden for operativsystemet, så XIP-understøttelse blev flyttet til kernegrenen for s390 -arkitekturen og en række yderligere funktioner blev understøttet, herunder støtte til på Ext2-siden [8] . Desuden menes IBM's behov for at understøtte mainframe-teknologien at have været drivkraften bag implementeringen af XIP på Linux [9] .
I 2010 blev teknologien understøttet i NetBSD [5] , hvor implementeringen viste sig at være relativt enkel på grund af funktionerne i det virtuelle hukommelsesadministrationsundersystem og buffercachen, desuden er den gennemsigtig for filsystemer (det vil sige kræver ikke særlig støtte fra deres side).
For at programmet kan fungere i XIP-tilstand, er det påkrævet på kompileringsstadiet at informere om muligheden for at adskille områder for datasegmenter og kodesegment (da datasegmentet skal oprettes i RAM, og kodesegmentet skal forblive i filsystemet). GCC bruger muligheden -msep-data til dette , og derudover kræver XIP-programmer normalt muligheden -mid-shared-library for at generere kode, der tillader biblioteker at blive kaldt af identifikator [10] . Indstilling af en af disse indstillinger bevirker, at -fPIC- flaget , som står for positionsuafhængig kompilering, indstilles.
Hovedformålet med teknologien er at gemme enhedens RAM. Den mest markante effekt af at spare RAM opnås, når det er nødvendigt at køre flere forekomster af programmet, i hvilket tilfælde den samme plads på den skrivebeskyttede hukommelsesenhed bruges til at servicere alle lanceringer, i stedet for at allokere et område i RAM for hver eksempel. En anden effekt er at reducere enhedens strømforbrug ved at reducere antallet af adgange til flygtigt RAM [11] .
En anden hyppigt brugt effekt er en hurtig opstart fra vedvarende lagring, især for en tilstrækkelig stor monolitisk Linux-kerne, som på traditionelle måder først skal kopieres til RAM, i XIP kan den udføres direkte fra drevet.
Når du bruger flashdrev , opnås den største effekt af XIP med byte-adresserede enheder såsom NOR flash [5] (hvorimod NAND flash , ligesom harddiske , er blokadresseret , og adgang til en enkelt instruktion betyder læsning normalt 4 KB, kl. mindst 512 bytes). Dette forklarer også brugen af NOR-flash til opstarts-skrivebeskyttede hukommelser og indlejrede systemer, på trods af dets højere omkostninger og lavere optagetæthed (under betingelserne i 2010'erne).
En anden effekt er evnen til at bruge persistente lagringsenheder som delt hukommelse til at udføre programmer uden at bruge værtens hovedhukommelsesressourcer og adskille program- og datasegmenter, som implementeret i mainframes .
I 2014, baseret på XIP-koden i Linux-kernen (siden version 3.14), blev en mere generel teknologi implementeret - DAX ( direkte adgang ), som kombinerer begge XIP-funktioner og giver de nødvendige opkald til direkte dataadgang uden om sidecachen [9] . Af filsystemerne blev teknologien først implementeret til Ext4 , senere dukkede understøttelse af XFS op .
Hovedmotivet for en sådan generalisering var fremkomsten i midten af 2010'erne af rummelige byte-adresserbare, ikke-flygtige NVDIMM og 3D XPoint- enheder til serversystemer, i forbindelse med hvilken relevansen af både kørende programkode uden overførsel til hoved hukommelse og direkte adgang til data uden mellemliggende kopiering til RAM. I filsystemer fokuseret på sådanne enheder, såsom NOVA , PMFS , SCMFS , Aerie [12] , er DAX-understøttelse implementeret helt fra begyndelsen, og denne funktion betragtes som en af deres nøglefunktioner.