Hallo,
aber die Adresse ist bekannt und konstant.
Ja, zur Laufzeit auf jeden Fall.
Die Frage ist nur ab wann, also schon zur Compilezeit (dann könnte diese Adresse bereits vom Linker fest im Call-Befehl eingebaut werden) oder erst zur Ladezeit (dann muss der Executable-Loader passend Relozieren). Ich persönlich würde mich für die zweite Variante entscheiden (um dem Kernel etwas mehr Flexibilität zu geben) aber für die Performance macht das absolut keinen Unterschied.
Ein Call oder Jump dessen Zieladresse bereits der Decoder ermitteln kann (das trifft auch auf relative Sprünge zu da der Decoder ja die Adresse das Sprungs selber kennt und demzufolge auch das relative Ziel errechnen kann) kostet fast gar nichts, im Optimum kostet der wirklich 0 Takte. Call-Befehle die ihre Zieladresse erst während der Ausführung ermitteln müssen sind dagegen auf jeden Fall ziemlich teuer. Intel und AMD geben sich da zwar viel Mühe um das zu bessern, diese Calls werden auch für virtuelle Methoden benötigt, aber ganz kostenlos sind diese indirekten Sprünge auf jeden Fall nicht.
Das besondere an der hier diskutierten Situation ist natürlich das der angesprungene Code in einer speziellen extra Page liegt so das eben doch ab und an mal ein TLB-Miss oder auch ein normaler Code-Cache-Miss auftreten kann aber das dürfte wohl ziemlich selten sein.
Grüße
Erik