Machine-Specific Register
Aus Lowlevel
Version vom 12. Oktober 2009, 14:11 Uhr von SHyx0rmZ (Diskussion | Beiträge) (→Auswahl einiger MSRs: STAR ><)
| 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
- http://www.intel.com/Assets/PDF/manual/253669.pdf - "Intel Architectures Software Developer's Manual Volume 3B: System Programming Guide" - Anhang B