Machine-Specific Register

Aus Lowlevel
Version vom 12. Oktober 2009, 14:11 Uhr von SHyx0rmZ (Diskussion | Beiträge) (→‎Auswahl einiger MSRs: STAR ><)
Wechseln zu:Navigation,
Diese Seite ist ein Artikel, welcher mehr haben könnte..

Wenn du mehr darüber weißt oder recherchieren willst, bist du aufgerufen, dies zu tun. Wenn du dir in einer Sache nicht sicher bist, dann stell es auf die Diskussionsseite.

Die Machine-Specific Registers bzw. Model-Specific Registers (MSR) sind Prozessorregister. Sie können im Gegensatz zu anderen Registern nur mit den Instruktionen rdmsr und wrmsr (x86 und x86-64) angesprochen werden. Außerdem sind diese Register spezifisch für eine bestimmte Prozessorfamilie/-generation, d.h. sie müssen von folgenden Prozessoren nicht bzw. nicht genauso implementiert werden.

WRMSR/RDMSR

Mit folgendem Code kann man auf die MSRs zugreifen: <c>uint64_t rdmsr(uint32_t msr) {

  uint32_t lomsr, himsr;
  uint64_t content;
  __asm__ __volatile__ ("rdmsr":"=a"(lomsr),"=d"(himsr):"c"(msr));
  content = himsr;
  content <<= 32;
  content |= lomsr;
  return content;

}

void wrmsr(uint32_t msr, uint64_t value) {

  uint32_t lomsr, himsr;
  lomsr = value & 0xFFFFFFFF;
  himsr = value >> 32;
  __asm__ __volatile__ ("wrmsr"::"a"(lomsr),"c"(msr),"d"(himsr));

}</c>

Auswahl einiger MSRs

Nummer Name Inhalt
0x174 IA32_SYSENTER_CS CS für SYSENTER
0x175 IA32_SYSENTER_ESP ESP für SYSENTER
0x176 IA32_SYSENTER_EIP EIP für SYSENTER
0xC0000080 IA32_EFER Erweiterte Features. Beispiel: Bit 0 - Aktiviert syscall/sysret im 64-Bit-Modus
0xC0000081 STAR EIP für SYSCALL im Protected Mode
0xC0000082 LSTAR RIP für SYSCALL im Long Mode
0xC0000083 CSTAR RIP für SYSCALL im Compability Mode

Weblinks