Assembler och lågnivåprogrammering för x86-system · Lektion

Skyddsringsnivåer och privilegier

Lär dig mer om x86:s privilegienivåer (ringar) och hur de upprätthåller åtskillnad och säkerhet mellan operativsystemet och användarprogram.

Lektion 2 av 412 steg

Skyddsringsnivåer och privilegier är en gratis lektion i Assembler och lågnivåprogrammering för x86-system på CoddyKit. Detta är lektion 2 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Assembler och lågnivåprogrammering för x86-system, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Assembler och lågnivåprogrammering för x86-system innehåller totalt 4 lektioner.

Introduktion: skyddsringsnivåer

Har du någon gång undrat hur dina appar hålls åtskilda från operativsystemet? Eller hur ett skadligt program hindras från att ta över datorn?

Svaret finns i privilegieringsnivåer, en central säkerhetsfunktion i x86-processorer!

Varför ringar? Säkerhet!

Privilegieringsnivåer skapar en hierarkisk struktur för programkörning. Se dem som olika säkerhetsnivåer.

  • Isolering: Hindrar användarprogram från att krascha operativsystemet.
  • Säkerhet: Skyddar viktiga systemresurser.
  • Stabilitet: Säkerställer att systemet körs tillförlitligt.

Ring 0: kärnan

Ring 0 är den mest privilegierade nivån. Det är här operativsystemets kärna finns.

Kärnan har direkt åtkomst till all hårdvara, allt minne och alla processorfunktioner. Den har den högsta behörigheten och hanterar allt utan begränsningar.

Ring 3: användarprogram

Ring 3 är den minst privilegierade nivån. Här körs de flesta av dina vanliga program.

Användarprogram har begränsad åtkomst till hårdvara och minne. De måste begära tjänster från kärnan (Ring 0) för att utföra privilegierade operationer.

x86:s ringhierarki

x86-arkitekturen definierar fyra privilegienivåer: Ring 0, Ring 1, Ring 2 och Ring 3.

Moderna operativsystem som Linux och Windows använder dock vanligtvis bara:

  • Ring 0: För operativsystemets kärna.
  • Ring 3: För användarprogram.

Ring 1 och 2 används vanligtvis inte, vilket förenklar modellen i de flesta system.

CPL: aktuell privilegienivå

Processorn håller reda på Current Privilege Level (CPL) för den kod som körs för närvarande.

CPL lagras i registret Code Segment (CS), närmare bestämt i de två lägsta bitarna. Det talar om för processorn i vilken ring programmet körs.

DPL: segmentets privilegienivå

Varje segmentdeskriptor, som definierar minnessegment, har en Descriptor Privilege Level (DPL).

DPL anger den lägsta privilegienivå som krävs för att komma åt segmentet. Ett kodsegment i Ring 0 skulle till exempel ha DPL 0.

RPL: begärarens privilegienivå

Requestor Privilege Level (RPL) anger privilegienivån för den kod som begärde åtkomst till ett segment.

Processorn använder CPL, DPL och RPL för att upprätthålla säkerhetsregler. Ett program i Ring 3 kan till exempel inte läsa in ett kodsegment i Ring 0, även om det försöker lura systemet.

Ringövergångar: systemanrop

Hur ber ett program i Ring 3 kärnan i Ring 0 att utföra något privilegierat, till exempel att skriva till en fil?

Det använder en kontrollerad mekanism som kallas systemanrop (eller syscall). Systemanrop fungerar som ”grindar” som tillåter säkra och begränsade övergångar till en högre privilegienivå och tillbaka.

IOPL: kontroll av I/O-portar

Direkt maskinvaru-I/O via instruktionerna IN och OUT kräver höga privilegier. Ett användarlägesprogram (Ring 3) som försöker göra detta orsakar vanligtvis ett General Protection Fault.

Processorn kontrollerar I/O Privilege Level (IOPL) i registret EFLAGS. Om Current Privilege Level (CPL) är numeriskt mindre än eller lika med IOPL tillåts direkt I/O. Annars blockeras operationen.

Det här exemplet försöker läsa från en I/O-port. I ett modernt operativsystem kommer detta sannolikt att misslyckas med ett skyddsfel eller leda till att processen avslutas. Det visar begränsningen:

; This example illustrates a privileged I/O attempt.
; It is specific to Linux (using int 0x80 for syscalls).

section .data
  msg db "Attempting privileged I/O...", 0xA
  len equ $ - msg

section .text
  global _start

_start:
  ; Print message using a system call (Ring 3 -> Ring 0 transition)
  mov eax, 4      ; sys_write
  mov ebx, 1      ; stdout file descriptor
  mov ecx, msg    ; address of string
  mov edx, len    ; length of string
  int 0x80        ; Invoke Linux kernel (syscall)

  ; Attempt to read from I/O port 0x60 (e.g., keyboard data)
  ; This instruction requires sufficient privilege (IOPL <= CPL)
  ; In a typical Ring 3 user program, this will cause a fault.
  in al, 0x60     ; !!! PRIVILEGED INSTRUCTION !!!

  ; Exit program using a system call
  mov eax, 1      ; sys_exit
  xor ebx, ebx    ; exit code 0
  int 0x80        ; Invoke Linux kernel (syscall)

Kontroll av privilegieringsnivå

Låt oss testa dina kunskaper om privilegieringsnivåer!

Sammanfattning: ringar och säkerhet

Bra jobbat! Du har lärt dig om x86:s privilegieringsnivåer.

  • Ring 0: Operativsystemets kärna, högsta privilegienivån.
  • Ring 3: Användarprogram, lägsta privilegienivån.
  • CPL, DPL, RPL: Processormekanismer för kontroll av privilegier.
  • Systemanrop: Kontrollerade övergångar till högre privilegienivåer.
  • IOPL: Begränsar direkt åtkomst till I/O.

Dessa ringar är grundläggande för systemsäkerhet och stabilitet eftersom de isolerar olika programkomponenter.

Gratis att börja

Lär dig Assembly med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
12
Lektioner
48

Vanliga frågor

Är lektionen ”Skyddsringsnivåer och privilegier” gratis?

Ja – hela texten till ”Skyddsringsnivåer och privilegier” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Assembler och lågnivåprogrammering för x86-system, kan Ni uppgradera till CoddyKit PRO. Kursen i Assembler och lågnivåprogrammering för x86-system innehåller totalt 4 lektioner.

Vad lär jag mig i ”Skyddsringsnivåer och privilegier”?

Lär dig mer om x86:s privilegienivåer (ringar) och hur de upprätthåller åtskillnad och säkerhet mellan operativsystemet och användarprogram. Ni övar på Assembler och lågnivåprogrammering för x86-system med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Assembler och lågnivåprogrammering för x86-system?

Du behöver inga förkunskaper. Utbildningen i Assembler och lågnivåprogrammering för x86-system på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.

Hur lång tid tar lektionen ”Skyddsringsnivåer och privilegier”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Assembler och lågnivåprogrammering för x86-system-lektionen?

Ja. Varje Assembler och lågnivåprogrammering för x86-system-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Paging och Memory Management Unit (MMU)
  2. Skyddsringsnivåer och privilegier
  3. Grunderna i hypervisorer och virtualisering
  4. Segmentering och Global Descriptor Table (GDT)
← Tillbaka till Assembler och lågnivåprogrammering för x86-system