Warum ist sie denn vorher nicht bekannt?
du hast ein programm, das programm hat eine variable x.
für die variable x wird das programm speicher benötigen.
um x anzusprechen musst du wissen wo im speicher x liegt (brauchst also die adresse von x).
aber wo liegt x jetzt eigentlich? schreibst du dein programm einfach so dass x immer an der adresse 0x1234 liegt? dann kann aber kein anderes programm was an stelle 0x1234 ablegen. wenn du mehrere programme laufen lassen willst is das also keine option.
frage: wie legst du dann aber beim programmieren fest wo jetzt x liegen soll, ohne angst haben zu müssen dass dir wer in die quere kommt und ohne zu wissen was für andere programme da so noch laufen werden?
antwort: gar nicht, du hast keine chance das zu wissen
lösung: du tust so als gäbe es keine anderen programme und legst x an die stelle 0x1234. das betriebssystem kümmert sich drum, deinem programm einen teil des speichers zu geben und dein x im speicher abzulegen. die logische adresse 0x1234 muss es dazu irgendwie in eine tatsächliche (physikalische) adresse umwandeln. natürlich könnte es beim laden hergehen und dein komplettes programm nach x durchsuchen und alles durch die "richtige" adresse ersetzen.
das ist aber nicht unbedingt einfach, effizient und elegant und das problem hast du nicht nur mit variablen, du hast es überall wo speicher verwendet wird (relokationsproblem). auch z.b. beim code. dein code liegt ja auch im speicher an irgendeiner adresse. wenn du in deinem programm einen sprungbefehl hast musst du dem die adresse angeben wo er hinspringen soll. wenn mehrere programme am laufen sind kannst du nicht einfach zu adresse 0x100000 springen. du hast ja keine ahnung ob da nicht ein anderes programm liegt. also, wieder durchsuchen und 0x100000 durch das richtige ersetzen? und das für jede programm anweisung, alle sprungmarken finden und die sprungbefehle die sich drauf referenzieren? bräuchtest du in deiner exe eine riesige tabelle oder was ähnliches um das zu bewerkstelligen... -> vergiss es
lösung: du tust so als gäbe es keine anderen programme und gehöre der ganze speicher dir. das betriebssystem kümmert sich dann drum dir einen speicherbereich zu geben und aus deinen logischen adressen (durch diese rumrechnerei, die glücklicherweise von der hardware erledigt wird und damit außer ein paar transistoren nix kostet) die wirklichen adresse zu machen.
fazit: relokationsproblem gelöst und programme können sich nicht mehr gegenseitig beeinflussen...