อะไรคือความแตกต่างระหว่างโหมดผู้ใช้และโหมดเคอร์เนลในระบบปฏิบัติการ?


107

อะไรคือความแตกต่างระหว่างโหมดผู้ใช้และโหมดเคอร์เนลเหตุใดคุณจึงเปิดใช้งานโหมดใดโหมดหนึ่งและกรณีการใช้งานคืออะไร



1
@ CiroSantilli709 大抓捕六四事件法轮功คำถามที่ถามเมื่อ 7 ปีที่แล้วไม่สามารถปิดเป็นคำถามที่ซ้ำกันสำหรับคำถามที่ถามเมื่อ 6 ปีที่แล้ว หากซ้ำกันจริงๆการปิดควรเป็นวิธีอื่น
Salvador Dali

2
@SalvadorDali สวัสดีฉันทามติในปัจจุบันคือการปิดด้วย "คุณภาพ": meta.stackexchange.com/questions/147643/…เนื่องจาก "คุณภาพ" ไม่สามารถวัดผลได้ฉันก็แค่เพิ่มคะแนน ;-) เป็นไปได้ว่าคำถามใดที่มีคำหลัก newb Google ที่ดีที่สุดในชื่อ ฉันขอแนะนำให้คุณคัดลอกคำตอบของคุณที่นั่นโดยเพิ่มข้อจำกัดความรับผิดชอบที่ด้านล่างและเชื่อมโยงจากคำตอบนี้ในกรณีที่คำตอบถูกปิด
Ciro Santilli 郝海东冠状病六四事件法轮功

คำตอบ:


146
  1. โหมดเคอร์เนล

    ในโหมดเคอร์เนลโค้ดการดำเนินการมีการเข้าถึงฮาร์ดแวร์พื้นฐานที่สมบูรณ์และไม่ จำกัด มันสามารถรันคำสั่ง CPU และอ้างอิงที่อยู่หน่วยความจำใดก็ได้ โดยทั่วไปแล้วโหมดเคอร์เนลจะสงวนไว้สำหรับฟังก์ชันระดับต่ำสุดและน่าเชื่อถือที่สุดของระบบปฏิบัติการ การขัดข้องในโหมดเคอร์เนลถือเป็นความหายนะ พวกเขาจะหยุดพีซีทั้งเครื่อง

  2. โหมดผู้ใช้

    ในโหมดผู้ใช้รหัสดำเนินการไม่มีความสามารถในการเข้าถึงฮาร์ดแวร์หรือหน่วยความจำอ้างอิงโดยตรง โค้ดที่ทำงานในโหมดผู้ใช้ต้องมอบสิทธิ์ให้กับ API ระบบเพื่อเข้าถึงฮาร์ดแวร์หรือหน่วยความจำ เนื่องจากการป้องกันที่ได้รับจากการแยกประเภทนี้ข้อขัดข้องในโหมดผู้ใช้จึงสามารถกู้คืนได้เสมอ โค้ดส่วนใหญ่ที่ทำงานบนคอมพิวเตอร์ของคุณจะทำงานในโหมดผู้ใช้

อ่านเพิ่มเติม

การทำความเข้าใจผู้ใช้และโหมดเคอร์เนล


สงสัยเมื่อซีพียูกำลังรันโค้ดระบบปฏิบัติการโปรเซสเซอร์อยู่ในโหมดใด
JackieLam

2
@JackieLam: ควรอยู่ในโหมดเคอร์เนล
kadina

ดังนั้นในการรันกระบวนการพื้นที่ผู้ใช้จะต้องแมปกับพื้นที่เคอร์เนลหรือไม่?
roottraveller

@rahul ฉันสงสัยว่าหน่วยความจำอ้างอิงสามารถรับได้จากโหมดผู้ใช้หรือการจัดการข้อมูลที่ง่ายที่สุดจะส่งผลให้มีการเปลี่ยนโหมดราคาแพงในภาษาเช่น java
maki XIE

48

นี่คือสองโหมดที่แตกต่างกันซึ่งคอมพิวเตอร์ของคุณสามารถทำงานได้ ก่อนหน้านี้เมื่อคอมพิวเตอร์เป็นเหมือนห้องขนาดใหญ่หากมีสิ่งใดขัดข้องคอมพิวเตอร์จะหยุดทำงานทั้งเครื่อง ดังนั้นสถาปนิกคอมพิวเตอร์จึงตัดสินใจที่จะเปลี่ยนมัน ไมโครโปรเซสเซอร์สมัยใหม่ใช้ในฮาร์ดแวร์อย่างน้อย 2 สถานะที่แตกต่างกัน

โหมดผู้ใช้:

  • โหมดที่โปรแกรมผู้ใช้ทั้งหมดดำเนินการ ไม่สามารถเข้าถึง RAM และฮาร์ดแวร์ได้ สาเหตุนี้เป็นเพราะถ้าโปรแกรมทั้งหมดทำงานในโหมดเคอร์เนลโปรแกรมเหล่านี้จะสามารถเขียนทับหน่วยความจำของกันและกันได้ หากจำเป็นต้องเข้าถึงคุณลักษณะเหล่านี้ - จะทำการเรียก API ที่อยู่ภายใต้ แต่ละกระบวนการเริ่มต้นโดย windows ยกเว้นกระบวนการของระบบจะทำงานในโหมดผู้ใช้

โหมดเคอร์เนล:

  • โหมดที่โปรแกรมเคอร์เนลทั้งหมดดำเนินการ (ไดรเวอร์ต่างกัน) มีการเข้าถึงทรัพยากรและฮาร์ดแวร์พื้นฐานทั้งหมด สามารถเรียกใช้คำสั่ง CPU ใด ๆ และสามารถเข้าถึงที่อยู่หน่วยความจำได้ โหมดนี้สงวนไว้สำหรับไดรเวอร์ที่ทำงานในระดับต่ำสุด

สวิตช์เกิดขึ้นได้อย่างไร

การเปลี่ยนจากโหมดผู้ใช้เป็นโหมดเคอร์เนลไม่ได้ดำเนินการโดยอัตโนมัติโดย CPU CPU ถูกขัดจังหวะโดยอินเทอร์รัปต์ (ตัวจับเวลาแป้นพิมพ์ I / O) เมื่อเกิดการขัดจังหวะ CPU จะหยุดการเรียกใช้โปรแกรมที่กำลังทำงานอยู่ในปัจจุบันเปลี่ยนเป็นโหมดเคอร์เนลเรียกใช้ตัวจัดการขัดจังหวะ ตัวจัดการนี้จะบันทึกสถานะของ CPU ดำเนินการเรียกคืนสถานะและกลับสู่โหมดผู้ใช้

http://en.wikibooks.org/wiki/Windows_Programming/User_Mode_vs_Kernel_Mode

http://tldp.org/HOWTO/KernelAnalysis-HOWTO-3.html

http://en.wikipedia.org/wiki/Direct_memory_access

http://en.wikipedia.org/wiki/Interrupt_request


สงสัยเมื่อซีพียูกำลังรันโค้ดระบบปฏิบัติการโปรเซสเซอร์อยู่ในโหมดใด
JackieLam

1
@JackieLam: โหมดเคอร์เนล
Apurv Nerlekar

10

โปรเซสเซอร์ในคอมพิวเตอร์ที่ใช้ Windows มีสองโหมดที่แตกต่างกัน ได้แก่ โหมดผู้ใช้และโหมดเคอร์เนล โปรเซสเซอร์จะสลับไปมาระหว่างสองโหมดขึ้นอยู่กับชนิดของโค้ดที่รันบนโปรเซสเซอร์ แอปพลิเคชันทำงานในโหมดผู้ใช้และส่วนประกอบของระบบปฏิบัติการหลักจะทำงานในโหมดเคอร์เนล ในขณะที่ไดรเวอร์จำนวนมากทำงานในโหมดเคอร์เนลไดรเวอร์บางตัวอาจทำงานในโหมดผู้ใช้

เมื่อคุณเริ่มแอปพลิเคชันโหมดผู้ใช้ Windows จะสร้างกระบวนการสำหรับแอปพลิเคชัน กระบวนการจัดเตรียมแอปพลิเคชันด้วยพื้นที่ที่อยู่เสมือนส่วนตัวและตารางจัดการส่วนตัว เนื่องจากพื้นที่ที่อยู่เสมือนของแอปพลิเคชันเป็นแบบส่วนตัวแอปพลิเคชันหนึ่งจึงไม่สามารถเปลี่ยนแปลงข้อมูลที่เป็นของแอปพลิเคชันอื่นได้ แต่ละแอปพลิเคชันจะทำงานแยกกันและหากแอปพลิเคชันขัดข้องข้อขัดข้องจะ จำกัด เฉพาะแอปพลิเคชันนั้นเท่านั้น แอปพลิเคชันอื่น ๆ และระบบปฏิบัติการจะไม่ได้รับผลกระทบจากข้อขัดข้อง

นอกจากความเป็นส่วนตัวแล้วพื้นที่ที่อยู่เสมือนของแอปพลิเคชันโหมดผู้ใช้ยังมี จำกัด โปรเซสเซอร์ที่ทำงานในโหมดผู้ใช้ไม่สามารถเข้าถึงแอดเดรสเสมือนที่สงวนไว้สำหรับระบบปฏิบัติการ การ จำกัด พื้นที่แอดเดรสเสมือนของแอ็พพลิเคชันโหมดผู้ใช้จะป้องกันไม่ให้แอปพลิเคชันเปลี่ยนแปลงและอาจทำให้ข้อมูลระบบปฏิบัติการที่สำคัญเสียหายได้

โค้ดทั้งหมดที่ทำงานในโหมดเคอร์เนลจะแชร์พื้นที่แอดเดรสเสมือนเดียว ซึ่งหมายความว่าไดรเวอร์ในโหมดเคอร์เนลจะไม่แยกออกจากไดรเวอร์อื่นและระบบปฏิบัติการเอง หากโปรแกรมควบคุมโหมดเคอร์เนลเขียนไปยังที่อยู่เสมือนผิดโดยไม่ได้ตั้งใจข้อมูลที่เป็นของระบบปฏิบัติการหรือไดรเวอร์อื่นอาจถูกบุกรุก หากไดรเวอร์ในโหมดเคอร์เนลขัดข้องระบบปฏิบัติการทั้งหมดจะขัดข้อง

หากคุณเป็นผู้ใช้ Windows เมื่อผ่านลิงค์นี้คุณจะได้รับมากขึ้น

การสื่อสารระหว่างโหมดผู้ใช้และโหมดเคอร์เนล


6

วงแหวน CPU เป็นความแตกต่างที่ชัดเจนที่สุด

ในโหมดป้องกัน x86 CPU จะอยู่ในวงแหวน 4 วงเสมอ เคอร์เนล Linux ใช้ 0 และ 3 เท่านั้น:

  • 0 สำหรับเคอร์เนล
  • 3 สำหรับผู้ใช้

นี่คือคำจำกัดความที่ยากและรวดเร็วที่สุดของ kernel vs userland

เหตุใด Linux จึงไม่ใช้วงแหวน 1 และ 2: วงแหวนสิทธิ์ของ CPU: เหตุใดจึงไม่ใช้วงแหวน 1 และ 2

วงแหวนปัจจุบันถูกกำหนดอย่างไร?

วงแหวนปัจจุบันถูกเลือกโดยการรวมกันของ:

  • global descriptor table: ตารางในหน่วยความจำของรายการ GDT และแต่ละรายการจะมีฟิลด์Privlที่เข้ารหัสวงแหวน

    คำสั่ง LGDT ตั้งค่าแอดเดรสเป็นตาราง descriptor ปัจจุบัน

    ดูสิ่งนี้ด้วย: http://wiki.osdev.org/Global_Descriptor_Table

  • กลุ่มจะลงทะเบียน CS, DS ฯลฯ ซึ่งชี้ไปที่ดัชนีของรายการใน GDT

    ตัวอย่างเช่นCS = 0หมายความว่ารายการแรกของ GDT กำลังทำงานอยู่สำหรับโค้ดเรียกใช้งาน

แหวนแต่ละวงทำอะไรได้บ้าง?

ชิป CPU ถูกสร้างขึ้นทางกายภาพเพื่อให้:

  • แหวน 0 สามารถทำอะไรก็ได้

  • วงแหวน 3 ไม่สามารถเรียกใช้คำสั่งหลาย ๆ คำสั่งและเขียนไปยังการลงทะเบียนหลายรายการโดยเฉพาะอย่างยิ่ง:

    • ไม่สามารถเปลี่ยนแหวนของตัวเองได้! มิฉะนั้นมันสามารถตั้งค่าตัวเองเป็นแหวน 0 และแหวนจะไร้ประโยชน์

      กล่าวอีกนัยหนึ่งคือไม่สามารถแก้ไขตัวบอกเซ็กเมนต์ปัจจุบันซึ่งกำหนดวงแหวนปัจจุบัน

    • ไม่สามารถแก้ไขตารางเพจได้: x86 เพจจิ้งทำงานอย่างไร?

      กล่าวอีกนัยหนึ่งคือไม่สามารถแก้ไขการลงทะเบียน CR3 และการเพจเองจะป้องกันการแก้ไขตารางเพจ

      ซึ่งจะป้องกันไม่ให้กระบวนการหนึ่งเห็นหน่วยความจำของกระบวนการอื่น ๆ เพื่อความปลอดภัย / เหตุผลในการเขียนโปรแกรมที่ง่าย

    • ไม่สามารถลงทะเบียนตัวจัดการขัดจังหวะ สิ่งเหล่านี้ได้รับการกำหนดค่าโดยการเขียนไปยังตำแหน่งหน่วยความจำซึ่งป้องกันด้วยการเพจ

      ตัวจัดการทำงานในวงแหวน 0 และจะทำลายโมเดลความปลอดภัย

      กล่าวอีกนัยหนึ่งคือไม่สามารถใช้คำแนะนำ LGDT และ LIDT

    • ไม่สามารถทำคำสั่ง IO เช่นinและoutและทำให้มีการเข้าถึงฮาร์ดแวร์โดยพลการ

      มิฉะนั้นเช่นสิทธิ์ของไฟล์จะไม่มีประโยชน์หากโปรแกรมใด ๆ สามารถอ่านจากดิสก์ได้โดยตรง

      ต้องขอบคุณMichael Petchอย่างแม่นยำยิ่งขึ้น: เป็นไปได้จริงที่ระบบปฏิบัติการจะอนุญาตคำแนะนำ IO บนวงแหวน 3 ซึ่งจริง ๆ แล้วจะถูกควบคุมโดยส่วนสถานะงานส่วนงานรัฐ

      สิ่งที่เป็นไปไม่ได้คือวงแหวน 3 จะอนุญาตให้ตัวเองทำเช่นนั้นหากไม่มีตั้งแต่แรก

      Linux ปิดการใช้งานเสมอ ดูเพิ่มเติม: เหตุใด Linux จึงไม่ใช้สวิตช์บริบทฮาร์ดแวร์ผ่าน TSS

โปรแกรมและระบบปฏิบัติการเปลี่ยนไปมาระหว่างวงแหวนได้อย่างไร?

  • เมื่อ CPU เปิดอยู่มันจะเริ่มรันโปรแกรมเริ่มต้นในวงแหวน 0 (เป็นแบบที่ดี แต่ก็เป็นค่าประมาณที่ดี) คุณสามารถคิดว่าโปรแกรมเริ่มต้นนี้เป็นเคอร์เนล (แต่โดยปกติแล้วจะเป็น bootloader ที่เรียกเคอร์เนลที่ยังคงอยู่ในวงแหวน 0 )

  • เมื่อกระบวนการของผู้ใช้ต้องการให้เคอร์เนลทำอะไรบางอย่างเช่นเขียนลงไฟล์จะใช้คำสั่งที่สร้างการขัดจังหวะเช่นint 0x80หรือsyscallเพื่อส่งสัญญาณเคอร์เนล x86-64 Linux syscall hello world ตัวอย่าง:

    .data
    hello_world:
        .ascii "hello world\n"
        hello_world_len = . - hello_world
    .text
    .global _start
    _start:
        /* write */
        mov $1, %rax
        mov $1, %rdi
        mov $hello_world, %rsi
        mov $hello_world_len, %rdx
        syscall
    
        /* exit */
        mov $60, %rax
        mov $0, %rdi
        syscall
    

    รวบรวมและเรียกใช้:

    as -o hello_world.o hello_world.S
    ld -o hello_world.out hello_world.o
    ./hello_world.out
    

    GitHub อัปสตรีม

    เมื่อสิ่งนี้เกิดขึ้น CPU จะเรียกตัวจัดการการเรียกกลับขัดจังหวะซึ่งเคอร์เนลลงทะเบียนในเวลาบูต นี่คือตัวอย่างที่เป็นรูปธรรมที่ BareMetal ลงทะเบียนจัดการและการใช้งานมัน

    ตัวจัดการนี้ทำงานในวงแหวน 0 ซึ่งจะตัดสินใจว่าเคอร์เนลจะอนุญาตการดำเนินการนี้หรือไม่ดำเนินการและรีสตาร์ทโปรแกรม userland ในวงแหวน 3 x86_64

  • เมื่อมีการexecใช้การเรียกระบบ (หรือเมื่อเคอร์เนลจะเริ่มทำงาน/init ) เคอร์เนลจะเตรียมรีจิสเตอร์และหน่วยความจำของกระบวนการยูสเซอร์แลนด์ใหม่จากนั้นจะข้ามไปที่จุดเริ่มต้นและเปลี่ยนซีพียูเป็นวงแหวน 3

  • หากโปรแกรมพยายามทำบางสิ่งที่ซุกซนเช่นเขียนลงทะเบียนต้องห้ามหรือที่อยู่หน่วยความจำ (เนื่องจากการเพจ) CPU จะเรียกตัวจัดการการเรียกกลับเคอร์เนลบางตัวในวงแหวน 0

    แต่เนื่องจาก userland นั้นซุกซนเคอร์เนลอาจฆ่ากระบวนการในครั้งนี้หรือแจ้งเตือนด้วยสัญญาณ

  • เมื่อเคอร์เนลบู๊ตระบบจะตั้งค่านาฬิกาฮาร์ดแวร์ด้วยความถี่คงที่ซึ่งจะสร้างการขัดจังหวะเป็นระยะ

    นาฬิกาฮาร์ดแวร์นี้สร้างอินเทอร์รัปต์ที่รันเสียงเรียกเข้า 0 และอนุญาตให้กำหนดเวลาที่กระบวนการของผู้ใช้จะเริ่มทำงาน

    ด้วยวิธีนี้การตั้งเวลาสามารถเกิดขึ้นได้แม้ว่ากระบวนการต่างๆจะไม่ได้ทำการเรียกระบบใด ๆ ก็ตาม

อะไรคือจุดที่มีวงแหวนหลายวง?

มีข้อดีสองประการในการแยกเคอร์เนลและยูสเซอร์แลนด์:

  • การสร้างโปรแกรมจะง่ายกว่าเนื่องจากคุณมั่นใจมากขึ้นว่าจะไม่มีการรบกวนโปรแกรมอื่น ๆ เช่นกระบวนการ userland หนึ่งไม่ต้องกังวลเกี่ยวกับการเขียนทับหน่วยความจำของโปรแกรมอื่นเนื่องจากการเพจหรือการวางฮาร์ดแวร์ในสถานะที่ไม่ถูกต้องสำหรับกระบวนการอื่น
  • มีความปลอดภัยมากขึ้น เช่นการอนุญาตไฟล์และการแยกหน่วยความจำอาจป้องกันไม่ให้แอปแฮ็กอ่านข้อมูลธนาคารของคุณ แน่นอนว่าสิ่งนี้ถือว่าคุณเชื่อถือเคอร์เนล

จะเล่นกับมันได้อย่างไร?

ฉันได้สร้างการตั้งค่าโลหะเปล่าที่น่าจะเป็นวิธีที่ดีในการจัดการแหวนโดยตรง: https://github.com/cirosantilli/x86-bare-metal-examples

ฉันไม่มีความอดทนในการสร้างตัวอย่าง userland แต่ฉันทำไปได้ไกลถึงการตั้งค่าเพจดังนั้น userland ควรจะเป็นไปได้ ฉันชอบที่จะเห็นคำขอดึง

หรืออีกวิธีหนึ่งโมดูลเคอร์เนลของลินุกซ์จะทำงานในวงแหวน 0 ดังนั้นคุณสามารถใช้มันเพื่อทดลองใช้การดำเนินการที่มีสิทธิพิเศษเช่นอ่านรีจิสเตอร์ควบคุม: จะเข้าถึงรีจิสเตอร์คอนโทรล cr0, cr2, cr3 จากโปรแกรมได้อย่างไร? รับข้อผิดพลาดในการแบ่งส่วน

นี่คือการตั้งค่า QEMU + Buildroot ที่สะดวกเพื่อทดลองใช้โดยไม่ต้องฆ่าโฮสต์ของคุณ

ข้อเสียของโมดูลเคอร์เนลคือ kthreads อื่น ๆ กำลังทำงานอยู่และอาจรบกวนการทดลองของคุณ แต่ในทางทฤษฎีคุณสามารถควบคุมตัวจัดการขัดจังหวะทั้งหมดด้วยโมดูลเคอร์เนลของคุณและเป็นเจ้าของระบบนั่นจะเป็นโครงการที่น่าสนใจจริงๆ

วงแหวนเชิงลบ

แม้ว่าวงแหวนเชิงลบจะไม่ได้อ้างอิงในคู่มือของ Intel แต่ก็มีโหมด CPU ที่มีความสามารถมากกว่าวงแหวน 0 เองดังนั้นจึงเหมาะกับชื่อ "แหวนลบ"

ตัวอย่างหนึ่งคือโหมดไฮเปอร์ไวเซอร์ที่ใช้ในการจำลองเสมือน

สำหรับรายละเอียดเพิ่มเติมโปรดดู:

แขน

ใน ARM วงแหวนจะเรียกว่า Exception Levels แทน แต่แนวคิดหลักยังคงเหมือนเดิม

มีข้อยกเว้น 4 ระดับใน ARMv8 ซึ่งมักใช้เป็น:

  • EL0: userland

  • EL1: เคอร์เนล ("ผู้ควบคุม" ในคำศัพท์ ARM)

    ป้อนด้วยsvcคำสั่ง (SuperVisor Call) ซึ่งก่อนหน้านี้รู้จักกันในชื่อswi ก่อนแอสเซมบลีแบบรวมซึ่งเป็นคำสั่งที่ใช้ในการเรียกระบบ Linux สวัสดีชาวโลก ARMv8 ตัวอย่าง:

    สวัสดีส

    .text
    .global _start
    _start:
        /* write */
        mov x0, 1
        ldr x1, =msg
        ldr x2, =len
        mov x8, 64
        svc 0
    
        /* exit */
        mov x0, 0
        mov x8, 93
        svc 0
    msg:
        .ascii "hello syscall v8\n"
    len = . - msg
    

    GitHub อัปสตรี

    ทดสอบกับ QEMU บน Ubuntu 16.04:

    sudo apt-get install qemu-user gcc-arm-linux-gnueabihf
    arm-linux-gnueabihf-as -o hello.o hello.S
    arm-linux-gnueabihf-ld -o hello hello.o
    qemu-arm hello
    

    นี่เป็นตัวอย่างที่เป็นรูปธรรมที่ BareMetal ลงทะเบียนการจัดการ SVC และไม่รับสายเรียก

  • EL2: hypervisorsเช่นXen

    ป้อนhvcคำสั่ง (HyperVisor Call)

    ไฮเปอร์ไวเซอร์คือระบบปฏิบัติการระบบปฏิบัติการคืออะไรสำหรับผู้ใช้

    ตัวอย่างเช่น Xen ช่วยให้คุณสามารถเรียกใช้ระบบปฏิบัติการหลายระบบเช่น Linux หรือ Windows บนระบบเดียวกันในเวลาเดียวกันและแยกระบบปฏิบัติการออกจากกันเพื่อความปลอดภัยและง่ายต่อการดีบักเช่นเดียวกับที่ Linux ทำกับโปรแกรมของผู้ใช้

    ไฮเปอร์ไวเซอร์เป็นส่วนสำคัญของโครงสร้างพื้นฐานระบบคลาวด์ในปัจจุบัน: อนุญาตให้เซิร์ฟเวอร์หลายเครื่องทำงานบนฮาร์ดแวร์ตัวเดียวทำให้การใช้ฮาร์ดแวร์ใกล้เคียง 100% เสมอและประหยัดเงินได้มาก

    AWS เช่นใช้ Xen จนกระทั่ง 2017 เมื่อย้ายไป KVM ทำข่าว

  • EL3: อีกระดับ ตัวอย่างสิ่งที่ต้องทำ

    ป้อนsmcคำแนะนำ (การโทรโหมดปลอดภัย)

ARMv8 สถาปัตยกรรมแบบอ้างอิง DDI 0487C.a - บท D1 - ระดับ AArch64 ระบบโปรแกรมเมอร์รุ่น - รูปที่แสดงให้เห็นถึง D1-1 นี้สวยงาม:

ป้อนคำอธิบายภาพที่นี่

สถานการณ์การเปลี่ยนแปลง ARM bit กับการถือกำเนิดของARMv8.1 Virtualization ส่วนขยายโฮสต์ (VHE) ส่วนขยายนี้ช่วยให้เคอร์เนลทำงานใน EL2 ได้อย่างมีประสิทธิภาพ:

ป้อนคำอธิบายภาพที่นี่

VHE ถูกสร้างขึ้นเนื่องจากโซลูชันการจำลองเสมือนในเคอร์เนลในลินุกซ์เช่น KVM มีพื้นฐานเหนือ Xen (ดูเช่นการย้าย AWS ไปยัง KVM ที่กล่าวถึงข้างต้น) เนื่องจากไคลเอนต์ส่วนใหญ่ต้องการเพียง Linux VMs และอย่างที่คุณสามารถจินตนาการได้ว่าทั้งหมดอยู่ในเครื่องเดียว โครงการ KVM นั้นง่ายกว่าและอาจมีประสิทธิภาพมากกว่า Xen ตอนนี้เคอร์เนลของโฮสต์ Linux ทำหน้าที่เป็นไฮเปอร์ไวเซอร์ในกรณีเหล่านั้น

สังเกตว่า ARM อาจเป็นเพราะประโยชน์ของการมองย้อนกลับมีรูปแบบการตั้งชื่อที่ดีกว่าสำหรับระดับสิทธิ์มากกว่า x86 โดยไม่จำเป็นต้องใช้ระดับลบ: 0 คือต่ำกว่าและ 3 สูงสุด ระดับที่สูงขึ้นมักจะถูกสร้างขึ้นบ่อยกว่าระดับที่ต่ำกว่า

EL ปัจจุบันสามารถสอบถามได้ด้วยMRSคำสั่ง: โหมดการดำเนินการปัจจุบัน / ระดับข้อยกเว้นคืออะไร ฯลฯ ?

ARM ไม่จำเป็นต้องมีระดับข้อยกเว้นทั้งหมดเพื่อให้สามารถนำไปใช้งานที่ไม่ต้องการคุณสมบัติเพื่อประหยัดพื้นที่ชิปได้ ARMv8 "ระดับข้อยกเว้น" กล่าวว่า:

การใช้งานอาจไม่รวมถึงระดับข้อยกเว้นทั้งหมด การใช้งานทั้งหมดต้องมี EL0 และ EL1 EL2 และ EL3 เป็นอุปกรณ์เสริม

QEMU เช่นค่าเริ่มต้นเป็น EL1 แต่ EL2 และ EL3 สามารถเปิดใช้งานได้ด้วยตัวเลือกบรรทัดคำสั่ง: qemu-system-aarch64 ป้อน el1 เมื่อจำลองการเปิดเครื่อง a53

ตัวอย่างโค้ดทดสอบบน Ubuntu 18.10


1
เนื่องจากคำถามนี้ไม่เฉพาะเจาะจงสำหรับระบบปฏิบัติการใด ๆinและoutพร้อมใช้งานสำหรับ Ring 3 TSS สามารถชี้ไปที่ตารางการอนุญาต IO ในงานปัจจุบันที่ให้สิทธิ์ในการอ่าน / เขียนพอร์ตทั้งหมดหรือเฉพาะ
Michael Petch

แน่นอนคุณตั้งค่าบิต IOPL เป็นค่า 3 จากนั้นโปรแกรมวงแหวน 3 มีการเข้าถึงพอร์ตเต็มรูปแบบและไม่ใช้สิทธิ์ TSS IO
Michael Petch

@MichaelPetch ขอบคุณฉันไม่รู้เรื่องนี้ ฉันได้อัปเดตคำตอบแล้ว
Ciro Santilli 郝海东冠状病六四事件法轮功

5

ฉันจะแทงในความมืดและเดาว่าคุณกำลังพูดถึง Windows สรุปได้ว่าโหมดเคอร์เนลสามารถเข้าถึงฮาร์ดแวร์ได้เต็มรูปแบบ แต่โหมดผู้ใช้ไม่มี ตัวอย่างเช่นหลายคนหากไม่ใช่ไดรเวอร์อุปกรณ์ส่วนใหญ่จะเขียนในโหมดเคอร์เนลเนื่องจากต้องการควบคุมรายละเอียดปลีกย่อยของฮาร์ดแวร์

ดูวิกิตำรานี้ด้วย


2
นี่เป็นสิ่งสำคัญสำหรับคุณในฐานะโปรแกรมเมอร์เพราะจุดบกพร่องของเคอร์เนลมีแนวโน้มที่จะสร้างความหายนะที่เลวร้ายยิ่งกว่าที่คุณเคยชิน เหตุผลหนึ่งสำหรับความแตกต่างของเคอร์เนล / ผู้ใช้คือเพื่อให้เคอร์เนลสามารถตรวจสอบ / ควบคุมทรัพยากรระบบที่สำคัญและปกป้องผู้ใช้แต่ละรายจากผู้อื่น มันง่ายไปหน่อย แต่ก็ยังมีประโยชน์เพื่อเตือนตัวเองว่าบั๊กของผู้ใช้มักจะน่ารำคาญ แต่จุดบกพร่องของเคอร์เนลมักจะทำให้ทั้งเครื่องพัง
Adam Liss

3

คำตอบอื่น ๆ ได้อธิบายความแตกต่างระหว่างโหมดผู้ใช้และโหมดเคอร์เนลแล้ว หากคุณต้องการลงรายละเอียดจริงๆคุณควรได้รับสำเนาของ Windows Internalsซึ่งเป็นหนังสือที่ยอดเยี่ยมที่เขียนโดย Mark Russinovich และ David Solomon ซึ่งอธิบายถึงสถาปัตยกรรมและรายละเอียดภายในของระบบปฏิบัติการ Windows ต่างๆ


2

อะไร

โดยทั่วไปความแตกต่างระหว่างโหมดเคอร์เนลและโหมดผู้ใช้ไม่ได้ขึ้นอยู่กับระบบปฏิบัติการและทำได้โดยการ จำกัด คำสั่งบางคำสั่งให้ทำงานในโหมดเคอร์เนลโดยการออกแบบฮาร์ดแวร์เท่านั้น วัตถุประสงค์อื่น ๆ ทั้งหมดเช่นการป้องกันหน่วยความจำสามารถทำได้โดยข้อ จำกัด นั้นเท่านั้น

อย่างไร

หมายความว่าโปรเซสเซอร์มีชีวิตอยู่ในโหมดเคอร์เนลหรือในโหมดผู้ใช้ การใช้กลไกบางอย่างสถาปัตยกรรมสามารถรับประกันได้ว่าเมื่อใดก็ตามที่เปลี่ยนเป็นโหมดเคอร์เนลโค้ด OS จะถูกดึงมาเพื่อเรียกใช้

ทำไม

การมีโครงสร้างพื้นฐานฮาร์ดแวร์นี้สามารถทำได้ในระบบปฏิบัติการทั่วไป:

  • การป้องกันโปรแกรมผู้ใช้จากการเข้าถึงหน่วยความจำทั้งหมดเพื่อไม่ให้โปรแกรมเขียนทับระบบปฏิบัติการเช่น
  • การป้องกันไม่ให้โปรแกรมของผู้ใช้ดำเนินการตามคำสั่งที่ละเอียดอ่อนเช่นโปรแกรมที่เปลี่ยนขอบเขตของตัวชี้หน่วยความจำ CPU เพื่อไม่ให้โปรแกรมทำลายขอบเขตหน่วยความจำเป็นต้น
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.