Hoe de pmap-opdracht op Linux te gebruiken

0
135
fatmawati achmad zaenuri/Shutterstock.com

Uitvinden hoeveel RAM een Linux-proces gebruikt, is niet eenvoudig, vooral niet wanneer er rekening moet worden gehouden met gedeeld geheugen. Gelukkig helpt de pmap-opdracht je om alles te begrijpen.

Geheugentoewijzing

Op moderne besturingssystemen leeft elk proces in zijn eigen toegewezen geheugen- of toewijzingsruimte. De grenzen van het toegewezen gebied worden niet rechtstreeks toegewezen aan fysieke hardware-adressen. Het besturingssysteem creëert een virtuele geheugenruimte voor elk proces en fungeert als een abstractielaag die het virtuele geheugen koppelt aan het fysieke geheugen.

De kernel houdt een vertaaltabel bij voor elk proces, en deze is toegankelijk voor de CPU . Wanneer de kernel het proces verandert dat op een bepaalde CPU-kern draait, werkt het de vertaaltabel bij die processen en CPU-kernen met elkaar verbindt.

De voordelen van abstractie

De voordelen van abstractie

h2>

Er zijn voordelen aan deze regeling. Het gebruik van geheugen is enigszins ingekapseld en gesandboxed voor elk proces in het gebruikersland. Een proces “ziet” geheugen in termen van de virtuele geheugenadressen. Dit betekent dat het alleen kan werken met het geheugen dat het door het besturingssysteem is gegeven. Tenzij het toegang heeft tot een of ander gedeeld geheugen, weet het niets van en heeft het geen toegang tot het geheugen dat aan andere processen is toegewezen.

GERELATEERDWat is Swappiness op Linux? (en hoe u dit kunt wijzigen)

De abstractie van het op hardware gebaseerde fysieke geheugen in virtuele geheugenadressen stelt de kernel in staat het fysieke adres te wijzigen waaraan een virtueel geheugen is toegewezen. Het kan het geheugen naar schijf wisselen door het werkelijke adres te wijzigen waarnaar een gebied van virtueel geheugen verwijst. Het kan ook het verstrekken van fysiek geheugen uitstellen totdat het daadwerkelijk nodig is.

Advertentie

Zolang verzoeken om geheugen te lezen of te schrijven worden afgehandeld zoals ze worden gevraagd, is het de kernel vrij om met de toewijzingstabel te jongleren zoals het past goed.

RAM op aanvraag

De mapping-tabel en het concept van "RAM on demand" de mogelijkheid van gedeeld geheugen openen. De kernel zal proberen te voorkomen dat hetzelfde meer dan eens in het geheugen wordt geladen. Het laadt bijvoorbeeld een gedeelde bibliotheek eenmaal in het geheugen en wijst deze toe aan de verschillende processen die deze moeten gebruiken. Elk van de processen heeft zijn eigen unieke adres voor de gedeelde bibliotheek, maar ze zullen allemaal naar dezelfde werkelijke locatie verwijzen.

Als het gedeelde geheugengebied beschrijfbaar is, gebruikt de kernel een schema dat copy-on-write wordt genoemd. Als een proces naar het gedeelde geheugen schrijft en de andere processen die dat geheugen delen de wijzigingen niet mogen zien, wordt er een kopie van het gedeelde geheugen gemaakt op het moment van het schrijfverzoek.

GERELATEERDBeginner Geek: virtuele machines maken en gebruiken

Linux-kernel 2.6.32, uitgebracht in december 2009, gaf Linux een functie genaamd “Kernel SamePage Merging.” Dit betekent dat Linux identieke gegevensgebieden in verschillende adresruimten kan detecteren. Stel je een reeks virtuele machines voor die op een enkele computer draaien, en de virtuele machines draaien allemaal op hetzelfde besturingssysteem. Door een gedeeld geheugenmodel en copy-on-write te gebruiken, kan de overhead op de hostcomputer drastisch worden verminderd.

Dit alles maakt de geheugenverwerking in Linux geavanceerd en zo optimaal mogelijk. Maar die verfijning maakt het moeilijk om naar een proces te kijken en te weten wat het geheugengebruik werkelijk is.

Het pmap-hulpprogramma

De kernel onthult veel van wat het doet met RAM door middel van twee pseudo-bestanden in de “/proc” systeeminformatie pseudo-bestandssysteem. Er zijn twee bestanden per proces, genoemd naar de proces-ID of PID van elk proces: “/proc/maps” en “/proc//smaps.”

Advertentie

De pmap-tool leest informatie uit deze bestanden en geeft de resultaten weer in het terminalvenster. Het zal duidelijk zijn dat we de PID moeten opgeven van het proces waarin we geïnteresseerd zijn wanneer we pmap gebruiken.

De proces-ID vinden

Er zijn verschillende manieren om de PID van een proces te vinden. Hier is de broncode voor een triviaal programma dat we in onze voorbeelden zullen gebruiken. Het is geschreven in C. Het enige dat het doet, is een bericht naar het terminalvenster afdrukken en wachten tot de gebruiker op “Enter” sleutel.

#include <stdio.h> int main(int argc, char *argv[]) { printf(“How-To Geek testprogramma.”); getc(stdin); } //end of main

Het programma is gecompileerd tot een uitvoerbaar bestand genaamd pm met behulp van de gcc-compiler:

gcc -o pm pm.c

Omdat het programma wacht tot de gebruiker op “Enter” drukt, blijft het actief zolang we vind ik leuk.

./pm

Het programma wordt gestart, drukt het bericht af en wacht op de toetsaanslag. We kunnen nu zoeken naar zijn PID. De opdracht ps geeft een overzicht van lopende processen. De -e (toon alle processen) optie zorgt ervoor dat ps elk proces weergeeft. We sturen de uitvoer door grep en filteren items uit die “pm” in hun naam.

ps -e | grep pm

Hiermee worden alle vermeldingen weergegeven met “pm' 8221; overal in hun naam.

Advertentie

We kunnen specifieker zijn met het pidof-commando. We geven pidof de naam van het proces waarin we geïnteresseerd zijn op de opdrachtregel en het probeert een overeenkomst te vinden. Als er een overeenkomst wordt gevonden, drukt pidof de PID van het koppelingsproces af.

pidof pm

< /p>

De pidof-methode is netter als je de naam van het proces weet, maar de ps-methode werkt zelfs als je maar een deel van de procesnaam kent.

Met behulp van pmap

Als ons testprogramma draait, en zodra we de PID hebben geïdentificeerd, kunnen we pmap als volgt gebruiken:

pmap 40919

De geheugentoewijzingen voor het proces worden voor ons vermeld.

Hier is de volledige uitvoer van de opdracht:

40919: ./pm 000056059f06c000 4K r—- pm 000056059f06d000 4K r-x– pm 000056059f06e000 4K r—- pm 000056059f06f000 4K r—- pm 000056059f070000 4K rw–c pm 0000 13259f ] 00007f97a3edb000 8K rw— [ anon ] 00007f97a3edd000 160K r—- libc.so.6 00007f97a3f05000 1616K r-x– libc.so.6 00007f97a4099000 352K r—- 1000 libc.so.6 – libc.so.6 00007f97a40f2000 16K r —- libc.so.6 00007f97a40f6000 8K rw — libc.so.6 00007f97a40f8000 60K rw — [ anon ] 00007f97a4116000 4K r —- 86 ld-linux -64.so.2 00007f97a4117000 160K r-x– ld-linux-x86-64.so.2 00007f97a413f000 40K r—- ld-linux-x86-64.so.2 00007f97a4149000 8K r—- ld-linux -x86-64.so.2 00007f97a414b000 8K rw— ld-linux-x86-64.so.2 00007ffca0e7e000 132K rw— [stack] 00007ffca0fe1000 16K r—- [ anon] 00007ffca0fe5000 8K r-x- anon ] ffffffffff600000 4K –x– [ anon ] totaal 2756K

De eerste regel is de procesnaam en zijn PID. Elk van de andere regels toont een toegewezen geheugenadres en de hoeveelheid geheugen op dat adres, uitgedrukt in kilobytes. De volgende vijf tekens van elke regel worden virtuele geheugenrechten genoemd. Geldige machtigingen zijn:

  • r: Het toegewezen geheugen kan worden gelezen door het proces.
  • w: De toegewezen geheugen kan door het proces worden geschreven.
  • x: het proces kan alle instructies in het toegewezen geheugen uitvoeren.
  • s: het toegewezen geheugen wordt gedeeld en wijzigingen die in het gedeelde geheugen worden aangebracht, zijn zichtbaar voor alle processen die het geheugen delen.
  • R: Er is geen reservering voor wisselruimte voor dit toegewezen geheugen.

Advertentie

De laatste informatie op elke regel is de naam van de bron van de toewijzing. Dit kan een procesnaam, bibliotheeknaam of een systeemnaam zoals stack of heap zijn.

The Extended Display

The -x ( extended) optie biedt twee extra kolommen.

pmap -x 40919

De kolommen krijgen titels. We hebben de “Address”, “Kbytes”, “Mode” en “Mapping” kolommen. De nieuwe kolommen heten “RSS” en “Dirty.”

Hier is de volledige uitvoer:

40919: ./pm Adres Kbytes RSS Dirty Mode Mapping 000056059f06c000 4 4 0 r—- pm 000056059f06d000 4 4 0 r-x– pm 000056059f06e000 4 4 0 r—- pm 000056059f06f000 4 4 4 r—- pm 000056059f070000 4 4 4 rw– pm 000056059fc39000 132 4 4 rw— [ anon ] 00007f97a3edb000 8 4 4 rw— [ anon ] 00007f97a3edd000 160 160 0 r—- libc.so.6 00007f97a3f05000 16x-88 0 r – libc.so.6 00007f97a4099000 352 64 0 r—- libc.so.6 00007f97a40f1000 4 0 0 —– libc.so.6 00007f97a40f2000 16 16 16 r—- libc.so.6 00007f97a40f6000 8 8 8 rw— libc.so.6 00007f97a40f8000 60 28 28 rw— [ anon ] 00007f97a4116000 4 4 0 r—- ld-linux-x86-64.so.2 00007f97a4117000 160 160 0 r-x– ld -linux-x86-64.so.2 00007f97a413f000 40 40 0 ​​r—- ld-linux-x86-64.so.2 00007f97a4149000 8 8 8 r—- ld-linux-x86-64.so.2 00007f97a414b000 8 8 8 rw— ld-linux-x86-64.so.2 00007ffca0e7e000 132 12 12 rw— [ stack] 00007ffca0fe1000 16 0 0 r—- [ anon] 00007ffca0fe5000 8 4 0 r-x– [ anon ] ffffffffff600000 4 0 0 –x– [ anon ] ——– ——– ——- ——- ——- totaal kB 2756 1328 96

  • RSS: dit is de grootte van de set. Dat wil zeggen, de hoeveelheid geheugen die momenteel in het RAM zit en niet is uitgewisseld.
  • Dirty: “Dirty” geheugen is gewijzigd sinds het proces—en het in kaart brengen is begonnen.

Laat me alles zien

De – X (zelfs meer dan uitgebreid) voegt extra kolommen toe aan de uitvoer. Let op de hoofdletter “X.” Een andere optie genaamd -XX (zelfs meer dan -X ) laat je alles zien wat pmap uit de kernel kan halen. Aangezien -X een subset is van -XX, zullen we de uitvoer van -XX beschrijven.

pmap -XX 40919

De uitvoer wikkelt zich vreselijk in een terminalvenster en is praktisch niet te ontcijferen. Hier is de volledige output:

40919: ./pm Adres Perm Offset Apparaat Inode Grootte KernelPageSize MMUPageSize Rss Pss Shared_Clean Shared_Dirty Private_Clean Private_Dirty waarnaar verwezen wordt Anoniem LazyFree AnonHugePages ShmemPmdMapped FilePmdMapped Shared_Hugetlb Private_Hugetlb Swap THPPes 4 0 4 0 0 0 0 0 0 0 0 0 0 0 rd mr mw me dw sd pm 56059f06d000 r-xp 00001000 08:03 393304 4 4 4 4 4 0 0 4 0 4 0 0 0 0 0 0 0 0 0 0 0 rd ex mr mw me dw sd pm 56059f06e000 r–p 00002000 08:03 393304 4 4 4 4 4 0 0 4 0 4 0 0 0 0 0 0 0 0 0 0 0 rd mr mw me dw sd pm 56059f06f000 r- -p 00002000 08:03 393304 4 4 4 4 4 0 0 0 4 4 4 0 0 0 0 0 0 0 0 0 0 rd mr mw me dw ac sd pm 56059f070000 rw-p 00003000 08:03 393304 4 4 4 4 4 0 0 0 4 4 4 0 0 0 0 0 0 0 0 0 0 rd wr mr mw me dw ac sd pm 56059fc39000 rw-p 00000000 00:00 0 132 4 4 4 4 0 0 0 4 4 4 0 0 0 0 0 0 0 0 0 0 rd wr mr mw me ac sd [heap] 7f97a3edb000 rw-p 00000000 00:00 0 8 4 4 4 4 0 0 0 4 4 4 0 0 0 0 0 0 0 0 0 0 rd wr mr mw me ac sd 7f97a3edd000 r–p 00000000 08:03 264328 160 4 4 160 4 160 0 0 0 160 0 0 0 0 0 0 0 0 0 0 0 rd mr mw me sd libc.so.6 7f97a3f05000 r-xp 00028000 08:03 264328 1616 4 4 788 32 788 0 0 0 788 0 0 0 0 0 0 0 0 0 0 0 rd ex mr mw me sd libc.so.6 7f97a4099000 r–p 001bc000 08:03 264328 352 4 4 64 1 64 0 0 0 64 0 0 0 0 0 0 0 0 0 0 0 rd mr mw me sd libc.so.6 7f97a40f1000 —p 00214000 08:03 264328 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 mr mw me sd libc.so.6 7f97a40f2000 r–p 00214000 08:03 264328 16 4 4 16 16 0 0 0 16 16 16 0 0 0 0 0 0 0 0 0 0 rd mr mw me ac sd libc.so.6 7f97a40f6000 rw-p 00218000 08:03 264328 8 4 4 8 8 0 0 0 8 8 8 0 0 0 0 0 0 0 0 0 0 rd wr mr mw me ac sd libc.so.6 7f97a40f8000 rw-p 00000000 00:00 0 60 4 4 28 28 0 0 0 28 28 28 0 0 0 0 0 0 0 0 0 0 rd wr mr mw me ac sd 7f97a4116000 r–p 00000000 08: 03 264305 4 4 4 4 0 4 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 rd mr mw me dw sd ld-linux-x86-64.so.2 7f97a4117000 r-xp 00001000 08:03 264305 160 4 4 160 11 160 0 0 0 160 0 0 0 0 0 0 0 0 0 0 0 rd ex mr mw me dw sd ld-linux-x86-64.so.2 7f97a413f000 r–p 00029000 08:03 264305 40 4 4 40 1 40 0 ​​0 0 40 0 ​​0 0 0 0 0 0 0 0 0 0 rd mr mw me dw sd ld-linux-x86-64.so.2 7f97a4149000 r–p 00032000 08:03 264305 8 4 4 8 8 0 0 0 8 8 8 0 0 0 0 0 0 0 0 0 0 rd mr mw me dw ac sd ld-linux-x86-64.so.2 7f97a414b000 rw-p 00034000 08:03 264305 8 4 4 8 8 0 0 0 8 8 8 0 0 0 0 0 0 0 0 0 0 rd wr mr mw me dw ac sd ld-linux-x86-64.so.2 7ffca0e7e000 rw-p 00000000 00:00 0 132 4 4 12 12 0 0 0 12 12 12 0 0 0 0 0 0 0 0 0 0 rd wr mr mw me gd ac [stack] 7ffca0fe1000 r–p 00000000 00:00 0 16 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 rd mr pf io de dd sd [vvar] 7ffca0fe5000 r-xp 00000000 00:00 0 8 4 4 4 0 4 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 rd ex mr mw me de sd [vdso] ffffffffff600000 –xp 00000000 00 :00 0 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ex [vsyscall] ==== ============== ==== ======= ==== === ============ ============ ============ = ============= ========== ========= ======== ========= ==== ===== ========= ============= ============== ============== = ==== ======= ====== =========== 2756 92 92 1328 157 1220 0 12 96 1328 96 0 0 0 0 0 0 0 0 0 0 KB

Er is hier veel informatie. Dit is wat de kolommen bevatten:

  • Adres: het startadres van deze toewijzing. Dit maakt gebruik van virtuele geheugenadressering.
  • Perm: De rechten van het geheugen.
  • Offset: Als het geheugen bestand- gebaseerd, de offset van deze toewijzing in het bestand.
  • Apparaat: Het Linux-apparaatnummer, gegeven in grote en kleine getallen. U kunt de apparaatnummers op uw computer zien door de opdracht lsblk uit te voeren.
  • Inode: De inode van het bestand waaraan de toewijzing is gekoppeld. In ons voorbeeld zou dit bijvoorbeeld de inode kunnen zijn die informatie over het pm-programma bevat.
  • Grootte: De grootte van het aan het geheugen toegewezen gebied.
  • < li>KernelPageSize: de paginagrootte die door de kernel wordt gebruikt.

  • MMUPageSize: de paginagrootte die wordt gebruikt door de geheugenbeheereenheid.
  • < li>Rss: dit is de grootte van de set. Dat wil zeggen, de hoeveelheid geheugen die zich momenteel in het RAM-geheugen bevindt en niet is uitgewisseld.

  • Pss: dit is de proportionele gedeelde grootte. Dit is de privé gedeelde grootte toegevoegd aan de (gedeelde grootte gedeeld door het aantal gedeelde mappen.)
  • Shared_Clean: de hoeveelheid geheugen gedeeld met andere processen die niet is gewijzigd sinds de kaart is gemaakt. Merk op dat zelfs als geheugen deelbaar is, als het niet daadwerkelijk is gedeeld, het nog steeds als privégeheugen wordt beschouwd.
  • Shared_Dirty: De hoeveelheid geheugen die met andere processen wordt gedeeld en die is gewijzigd sinds de toewijzing is gemaakt.
  • Private_Clean: de hoeveelheid privégeheugen—niet gedeeld met andere processen&#8212 ;die niet is gewijzigd sinds de toewijzing is gemaakt.
  • Private_Dirty: de hoeveelheid privégeheugen die is gewijzigd sinds de toewijzing is gemaakt.
  • Referentie: de hoeveelheid geheugen die momenteel is gemarkeerd als waarnaar wordt verwezen of waartoe toegang wordt verleend.
  • Anoniem: geheugen dat geen apparaat heeft om naar uit te wisselen. Dat wil zeggen, het wordt niet ondersteund door bestanden.
  • LazyFree: pagina's die zijn gemarkeerd als MADV_FREE. Deze pagina's zijn gemarkeerd als beschikbaar om te worden vrijgegeven en teruggevorderd, ook al bevatten ze mogelijk ongeschreven wijzigingen. Als er echter wijzigingen optreden nadat de MADV_FREE is ingesteld op de geheugentoewijzing, wordt de vlag MADV_FREE verwijderd en worden de pagina's niet teruggevorderd totdat de wijzigingen zijn geschreven.
  • AnonHugePages: dit zijn “huge” geheugenpagina's (groter dan 4 KB).
  • ShmemPmdMapped: gedeeld geheugen geassocieerd met grote pagina's. Ze kunnen ook worden gebruikt door bestandssystemen die zich volledig in het geheugen bevinden.
  • FilePmdMapped: De Page Middle Directory is een van de pagineringsschema's die beschikbaar zijn voor de kernel. Dit is het aantal door bestanden ondersteunde pagina's waarnaar wordt verwezen door PMD-items.
  • Shared_Hugetlb: Translation Lookaside Tables, of TLB's, zijn geheugencaches die worden gebruikt om de tijd te optimaliseren die nodig is om toegang te krijgen tot geheugenlocaties van gebruikersruimten. Dit cijfer is de hoeveelheid RAM die wordt gebruikt in TLB's die zijn gekoppeld aan grote gedeelde geheugenpagina's.
  • Private_Hugetlb: dit cijfer is de hoeveelheid RAM die wordt gebruikt in TLB's die zijn gekoppeld aan privé enorme geheugenpagina's.
  • Swap: de hoeveelheid swap die wordt gebruikt.
  • SwapPss: de proportionele grootte van het aandeel. Dit is de hoeveelheid swap die bestaat uit verwisselde privégeheugenpagina's die zijn toegevoegd aan de (gedeelde grootte gedeeld door het aantal gedeelde mappen.)
  • Vergrendeld: geheugentoewijzingen kunnen worden vergrendeld om te voorkomen dat het besturingssysteem kan geen heap- of off-heap-geheugen oproepen.
  • THPeligible: dit is een vlag die aangeeft of de toewijzing in aanmerking komt voor het toewijzen van transparante grote pagina's. 1 betekent waar, 0 betekent onwaar. Transparante grote pagina's is een geheugenbeheersysteem dat de overhead van het opzoeken van TLB-pagina's op computers met een grote hoeveelheid RAM vermindert.
  • VmFlags: zie de lijst met vlaggen hieronder.
  • VmFlags: zie de lijst met vlaggen hieronder. li>
  • Mapping: de naam van de bron van de mapping. Dit kan een procesnaam, bibliotheeknaam of systeemnamen zoals stapel of heap zijn.

De VmFlags'virtuele geheugenvlaggen' zullen een subset zijn van de volgende lijst.

  • rd: leesbaar.
  • wr: beschrijfbaar.
  • ex : Uitvoerbaar.
  • sh: Gedeeld.
  • mr: Mag gelezen worden.
  • mw: Mag schrijven.
  • ik: Mag uitvoeren.
  • ms: Mag delen.
  • gd: stapelsegment wordt kleiner.
  • pf: puur paginaframenummerbereik. Paginaframenummers zijn een lijst van de fysieke geheugenpagina's.
  • dw: Schrijven naar het toegewezen bestand is uitgeschakeld.
  • lo: Pagina's zijn vergrendeld in het geheugen.
  • io: aan geheugen toegewezen I/O-gebied.
  • sr: sequentieel leesadvies geleverd (door de madvis()-functie.)
  • rr: willekeurig leesadvies verstrekt.
  • dc: niet kopiëren dit geheugengebied als het proces is gevorkt.
  • de: Breid dit geheugengebied niet uit bij het opnieuw toewijzen.
  • ac: Gebied is verantwoordelijk.
  • nr: Ruilruimte is niet gereserveerd voor het gebied.
  • ht: Area gebruikt enorme TLB-pagina's.
  • sf: Synchrone paginafout.
  • ar : Architectuurspecifieke vlag.
  • wf: Wis dit geheugengebied als het proces is gevorkt.
  • dd: Niet doen neem dit geheugengebied op in kerndumps.
  • sd: Zacht vuile vlag.
  • mm: Gemengd kaartgebied.
  • hg: enorme vlag voor pagina-advies.
  • nh: Geen grote pagina-aanbevelingsvlag.
  • mg: Samenvoegbare adviesvlag.
  • bt: ARM64 bias temperatuurinstabiliteit bewaakte pagina.
  • mt: ARM64-geheugentag-extensietags zijn ingeschakeld.
  • um: Userfaultfd ontbreekt tracking.
  • uw: Userfaultfd wr-protect tracking.

Geheugenbeheer is ingewikkeld

En achteruit werken vanuit tabellen met gegevens om te begrijpen wat er werkelijk aan de hand is, is moeilijk. Maar pmap geeft je in ieder geval het volledige beeld, zodat je de beste kans hebt om erachter te komen wat je moet weten.

Advertentie

Het is interessant om op te merken dat ons voorbeeldprogramma is gecompileerd tot een 16 KB binair uitvoerbaar bestand, en toch gebruikt (of deelt het) zo'n 2756 KB geheugen, bijna volledig vanwege runtime-bibliotheken.

Een laatste handige truc is dat je pmap en de pidof-opdrachten samen kunt gebruiken, het combineren van de acties van het vinden van de PID van het proces en het doorgeven aan pmap in één commando:

pmap $(pidof pm) READ NEXT

  • › Draadloos opladen toevoegen aan elke telefoon
  • › Heb je een slimme luidspreker? Gebruik het om uw rookmelders slim te maken
  • › De 5 belachelijk dure telefoons aller tijden
  • › Elk Microsoft Windows-logo van 1985 tot 2022
  • › Roborock Q5+ Review: een solide zelfledigende robotstofzuiger
  • › Wat doet “Ras aanraken” Gemiddeld?