Studsmatta (dator)

Inom datorprogrammering har ordet studsmatta ett antal betydelser, och är generellt förknippat med hoppinstruktioner (dvs. att flytta till olika kodbanor).

Programmering på låg nivå

Studsmattor (ibland kallade indirekta hoppvektorer ) är minnesplatser som innehåller adresser som pekar på att avbryta servicerutiner, I/O -rutiner etc. Utförande hoppar in i studsmattan och hoppar sedan omedelbart ut, eller studsar, därav termen studsmatta . De har många användningsområden:

  • Studsmatta kan användas för att övervinna de begränsningar som ställs av en central processing unit (CPU) arkitektur som förväntar sig att alltid hitta vektorer på fasta platser.
  • När ett operativsystem startas på en symmetrisk multiprocessing (SMP)-maskin, kommer endast en processor, bootstrap-processorn, att vara aktiv. Efter att operativsystemet har konfigurerat sig själv kommer det att instruera de andra processorerna att hoppa till en bit studsmattakod som kommer att initiera processorerna och vänta på att operativsystemet börjar schemalägga trådar på dem.

Programmering på hög nivå

Fortsättningspasserande stil är ett populärt mellanformat för kompilatorer av funktionella språk, eftersom många kontrollflödeskonstruktioner kan uttryckas elegant och optimering av slutanrop är lätt. När man kompilerar till ett språk utan optimerade svansanrop kan man undvika stacktillväxt via en teknik som kallas trampolin. Tanken är att inte göra det sista fortsättningsanropet inne i funktionen, utan att gå ut och återföra fortsättningen till en studsmatta. Den studsmattan är helt enkelt en slinga som åberopar de returnerade fortsättningarna. Därför finns det inga kapslade funktionsanrop och stacken kommer inte att växa.

  • I Java hänvisar studsmatta till att använda reflektion för att undvika att använda inre klasser , till exempel hos evenemangslyssnare. Tidskostnaden för ett reflektionssamtal växlas mot utrymmet för en inre klass. Trampoliner i Java involverar vanligtvis skapandet av en GenericListener för att skicka händelser till en yttre klass.
  • I Mono Runtime är studsmattor små, handskrivna bitar av monteringskod som används för att utföra olika uppgifter.
  • När kodbitar kopplas till inkompatibla samtalskonventioner används en studsmatta för att konvertera den som ringer till samtalskonventionen.
    • I inbyggda system är studsmattor korta kodavsnitt som startar andra kodavsnitt. Till exempel, snarare än att skriva avbrottshanterare helt i assemblerspråk, är ett annat alternativ att skriva avbrottshanterare mestadels i C, och använda en kort studsmatta för att konvertera assembly-språket avbrottsanropskonventionen till C-anropskonventionen.
    • När man skickar en återuppringning till ett system som förväntar sig att anropa en C- funktion, men man vill att den ska utföra metoden för en viss instans av en klass skriven i C++ , använder man en kort studsmatta för att konvertera C-funktionsanropskonventionen till C++ metodkallande konvention. Ett sätt att skriva en sådan studsmatta är att använda en thunk . En annan metod är att använda en generisk lyssnare .
  • I Objective-C är en studsmatta ett objekt som returneras av en metod som fångar och återskapar alla meddelanden som skickas till den och sedan "studsar" dessa meddelanden vidare till ett annat objekt, till exempel i högre ordningsmeddelanden .
  • I GCC- kompilatorn hänvisar trampolin till en teknik för att implementera pekare till kapslade funktioner . Studsmattan är en liten bit kod som konstrueras i farten på traven när adressen till en kapslad funktion tas. Trampolinen ställer in den statiska länkpekaren, vilket gör att den kapslade funktionen kan komma åt lokala variabler för den omslutande funktionen. Funktionspekaren är då helt enkelt adressen till studsmattan. Detta undviker att behöva använda "feta" funktionspekare för kapslade funktioner som bär både kodadressen och den statiska länken. Detta strider dock mot önskan att göra stacken icke-körbar av säkerhetsskäl.
  • I det esoteriska programmeringsspråket Befunge är en studsmatta en instruktion att hoppa över nästa cell i kontrollflödet .

Inga stackar

Vissa implementeringar av studsmattor orsakar en förlust av stackar utan exekvering ( NX stack). I synnerhet i GNU Compiler Collection (GCC) bygger en kapslad funktion en studsmatta på stacken vid körning och anropar sedan den kapslade funktionen genom data på stacken. Trampolinen kräver att stapeln är körbar.

No-execute stackar och kapslade funktioner är ömsesidigt uteslutande under GCC. Om en kapslad funktion används i utvecklingen av ett program, förloras NX-stacken tyst. GCC erbjuder -Wtrampoliner varning för att varna om tillståndet.

Programvara konstruerad med säker utvecklingslivscykel tillåter ofta inte användning av kapslade funktioner på grund av förlusten av NX-stackar.

Se även