Sự khác biệt giữa không gian kernel và không gian người dùng là gì?


Câu trả lời:


116

Các thực sự câu trả lời đơn giản là hạt nhân chạy trong không gian hạt nhân và các chương trình bình thường chạy trong không gian người dùng. Không gian người dùng về cơ bản là một hình thức đấm bốc cát - nó hạn chế các chương trình người dùng để họ không thể gây rối với bộ nhớ (và các tài nguyên khác) thuộc sở hữu của các chương trình khác hoặc bởi nhân hệ điều hành. Giới hạn này (nhưng thường không loại bỏ hoàn toàn) khả năng của họ để làm những điều xấu như làm hỏng máy.

Nhân là lõi của hệ điều hành. Nó thường có toàn quyền truy cập vào tất cả bộ nhớ và phần cứng máy (và mọi thứ khác trên máy). Để giữ cho máy hoạt động ổn định nhất có thể, thông thường bạn chỉ muốn mã được kiểm tra tốt, đáng tin cậy nhất để chạy trong chế độ kernel / không gian kernel.

Ngăn xếp chỉ là một phần khác của bộ nhớ, do đó, tự nhiên nó được tách riêng cùng với phần còn lại của bộ nhớ.


3
Vì vậy, nếu tôi có 10 quy trình trong hệ thống của tôi. Có phải mỗi quy trình có ngăn xếp riêng được chia thành ngăn xếp người dùng và ngăn xếp hạt nhân HOẶC tất cả các quy trình chia sẻ một ngăn xếp hạt nhân?
kc3

10
@ kc3: ít nhất một phần tùy thuộc vào HĐH, nhưng tôi tin rằng hầu hết đều có ngăn xếp chế độ nhân cho mỗi quy trình được sử dụng khi kernel thực hiện mọi việc thay mặt cho một quy trình (ví dụ: I / O) và ít nhất một lần nữa kernel stack dành riêng cho kernel sử dụng (ví dụ, để lập lịch).
Jerry Coffin

2
Có sự tồn tại của các quy trình kernel và mối quan hệ hoặc sự khác biệt với các quy trình không gian người dùng như được hỏi trong câu hỏi không?
Victor Choy

Vì vậy, mỗi lần chạy, để chạy một quy trình không gian người dùng , nó phải được ánh xạ tới không gian kernel ?
roottraveller

@roottraveller: Tôi không chắc điều gì đã cho bạn ý tưởng đó, nhưng không, hoàn toàn không. Đồng thời, một quy trình không gian người dùng thường sẽ có một số bộ nhớ không gian nhân (ít nhiều bị ẩn), vì vậy (ví dụ) quy trình của bạn sẽ có ngăn xếp không gian người dùng và ngăn xếp không gian nhân được sử dụng khi bạn thực hiện các cuộc gọi hệ điều hành cần chạy trong chế độ kernel.
Jerry Coffin

63

Các bộ nhớ truy cập ngẫu nhiên (RAM) có thể được hợp lý chia thành hai khu vực riêng biệt cụ thể là -. Không gian hạt nhân và không gian sử dụng ( các địa chỉ vật lý của RAM không thực sự chia chỉ có địa chỉ ảo , tất cả điều này được thực hiện bởi MMU )

Nhân chạy trong phần bộ nhớ có quyền. Phần này của bộ nhớ không thể được truy cập trực tiếp bởi các quá trình của người dùng thông thường, trong khi hạt nhân có thể truy cập tất cả các phần của bộ nhớ. Để truy cập vào một số phần của hạt nhân, các quá trình sử dụng phải sử dụng hệ thống được xác định trước các cuộc gọi tức là open, read, writevv Ngoài ra, các Cchức năng thư viện như printfgọi các cuộc gọi hệ thống writelần lượt.

Các cuộc gọi hệ thống hoạt động như một giao diện giữa các tiến trình người dùng và các tiến trình kernel. Quyền truy cập được đặt trên không gian kernel để vô tình ngăn chặn người dùng gây rối với kernel.

Vì vậy, khi một cuộc gọi hệ thống xảy ra, một phần mềm bị gián đoạn được gửi đến kernel. CPU có thể tạm thời trao quyền điều khiển cho thói quen xử lý ngắt liên quan. Quá trình kernel đã bị dừng bởi các ngắt tiếp tục sau khi trình xử lý ngắt kết thúc công việc của nó.


2
Phần đầu tiên của câu trả lời này là không chính xác. RAM không được chia thành kernel và không gian người dùng. Bộ nhớ ảo là. Tôi đã thử chỉnh sửa câu trả lời nhưng hàng đợi chỉnh sửa đã đầy trong nhiều ngày. Hãy sửa chữa. Nhìn vào câu trả lời của Varun dưới đây để biết thêm thông tin.
MeLikeyCode

1
@MeLikeyCode Không phải là một sự đơn giản hóa chính đáng trong bối cảnh cố gắng cung cấp một câu trả lời dễ hiểu?
vấn đề

2
@pro Hiệuofficer, tôi nghĩ rằng một sự đơn giản hóa lớn có thể cung cấp một sự hiểu biết cơ bản sai. Mỗi người nên chỉ ra rằng bộ nhớ vật lý không được chia thành không gian người dùng và không gian kernel, nhưng kernel cung cấp một sự trừu tượng hóa của bộ nhớ ảo, được chia thành kernel và không gian người dùng và sau đó được ánh xạ trên bộ nhớ vật lý.
dshil

22

Không gian hạt nhân & không gian ảo là các khái niệm về bộ nhớ ảo .... điều đó không có nghĩa là Ram (bộ nhớ thực của bạn) được chia thành kernel & không gian người dùng. Mỗi tiến trình được cung cấp bộ nhớ ảo được chia thành kernel & không gian người dùng.

Vì vậy, nói "Bộ nhớ truy cập ngẫu nhiên (RAM) có thể được chia thành hai vùng riêng biệt là - không gian nhân và không gian người dùng." sai.

& liên quan đến điều "không gian nhân so với không gian người dùng"

Khi một quy trình được tạo và bộ nhớ ảo của nó được chia thành không gian người dùng và không gian nhân, trong đó vùng không gian người dùng chứa dữ liệu, mã, ngăn xếp, đống của quy trình & không gian nhân chứa các thứ như bảng trang cho quy trình , cấu trúc dữ liệu kernel và mã kernel, v.v. Để chạy mã không gian kernel, điều khiển phải chuyển sang chế độ kernel (sử dụng ngắt phần mềm 0x80 cho các cuộc gọi hệ thống) & stack kernel về cơ bản được chia sẻ giữa tất cả các tiến trình hiện đang thực thi trong không gian kernel.


1
Một quy trình chung có không gian kernel và không gian người dùng riêng?
Victor Choy

@VictorChoy, một quá trình thực thi thành hai chế độ: người dùng và kernel. Bộ nhớ, mà quá trình nhìn thấy là duy nhất cho nó. Nhưng đối với mọi quy trình đang chạy trong chế độ kernel (thực thi mã kernel) thì chỉ có một không gian - không gian kernel.
dshil

Ngoài ra, lưu ý rằng khi một quá trình được tạo, bộ nhớ ảo của nó được chia thành 2 phần (người dùng và kernel), trong đó một phần của địa chỉ ảo được dành riêng cho chế độ người dùng và phần khác cho chế độ kernel.
dshil

19

Các vòng CPU là sự phân biệt rõ ràng nhất

Trong chế độ được bảo vệ x86, CPU luôn ở một trong 4 vòng. Nhân Linux chỉ sử dụng 0 và 3:

  • 0 cho nhân
  • 3 cho người dùng

Đây là định nghĩa khó nhất và nhanh nhất của kernel vs userland.

Tại sao Linux không sử dụng vòng 1 và 2: Nhẫn đặc quyền CPU: Tại sao nhẫn 1 và 2 không được sử dụng?

Làm thế nào là vòng hiện tại được xác định?

Vòng hiện tại được chọn bởi sự kết hợp của:

  • bảng mô tả toàn cầu: một bảng trong bộ nhớ của các mục GDT và mỗi mục có một trường Privlmã hóa vòng.

    Lệnh LGDT đặt địa chỉ cho bảng mô tả hiện tại.

    Xem thêm: http://wiki.osdev.org/Global_Descriptor_Table

  • phân đoạn đăng ký CS, DS, v.v., trỏ đến chỉ mục của một mục trong GDT.

    Ví dụ: CS = 0có nghĩa là mục đầu tiên của GDT hiện đang hoạt động cho mã thực thi.

Mỗi chiếc nhẫn có thể làm gì?

Chip CPU được chế tạo vật lý sao cho:

  • vòng 0 có thể làm bất cứ điều gì

  • vòng 3 không thể chạy một số hướng dẫn và ghi vào một số thanh ghi, đáng chú ý nhất là:

    • không thể thay đổi chiếc nhẫn của riêng mình! Nếu không, nó có thể tự đặt thành số 0 và nhẫn sẽ vô dụng.

      Nói cách khác, không thể sửa đổi bộ mô tả phân đoạn hiện tại , xác định vòng hiện tại.

    • không thể sửa đổi các bảng trang: Làm thế nào để phân trang x86 hoạt động?

      Nói cách khác, không thể sửa đổi thanh ghi CR3 và chính việc phân trang ngăn không cho sửa đổi các bảng trang.

      Điều này ngăn một tiến trình nhìn thấy bộ nhớ của các tiến trình khác vì lý do bảo mật / dễ dàng cho các lý do lập trình.

    • không thể đăng ký xử lý ngắt. Chúng được cấu hình bằng cách ghi vào các vị trí bộ nhớ, điều này cũng được ngăn chặn bằng cách phân trang.

      Trình xử lý chạy trong vòng 0 và sẽ phá vỡ mô hình bảo mật.

      Nói cách khác, không thể sử dụng các hướng dẫn LGDT và LIDT.

    • không thể thực hiện các lệnh IO như inout, do đó có quyền truy cập phần cứng tùy ý.

      Mặt khác, ví dụ, quyền truy cập tệp sẽ vô dụng nếu bất kỳ chương trình nào có thể đọc trực tiếp từ đĩa.

      Chính xác hơn là nhờ Michael Petch : HĐH thực sự có thể cho phép các hướng dẫn IO trên vòng 3, điều này thực sự được kiểm soát bởi phân đoạn trạng thái Nhiệm vụ .

      Điều không thể xảy ra là vòng 3 sẽ tự cho phép làm như vậy nếu nó không có nó ở vị trí đầu tiên.

      Linux luôn không cho phép nó. Xem thêm: Tại sao Linux không sử dụng chuyển đổi ngữ cảnh phần cứng thông qua TSS?

Làm thế nào để các chương trình và hệ điều hành chuyển tiếp giữa các vòng?

  • khi CPU được bật, nó bắt đầu chạy chương trình ban đầu ở vòng 0 (cũng khá tốt, nhưng đó là một xấp xỉ tốt). Bạn có thể nghĩ chương trình ban đầu này là kernel (nhưng thông thường nó là bootloader sau đó gọi kernel vẫn ở vòng 0 ).

  • khi một tiến trình userland muốn kernel thực hiện một cái gì đó cho nó như ghi vào một tệp, nó sử dụng một lệnh tạo ra một ngắt như int 0x80hoặcsyscall để báo hiệu kernel. x86-64 Linux tòa nhà xin chào ví dụ thế giới:

    .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
    

    biên dịch và chạy:

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

    GitHub ngược dòng .

    Khi điều này xảy ra, CPU gọi một trình xử lý gọi lại ngắt mà kernel đã đăng ký khi khởi động. Dưới đây là một ví dụ cụ thể về thanh ghi đăng ký một trình xử lý và sử dụng nó .

    Trình xử lý này chạy trong vòng 0, quyết định xem kernel có cho phép hành động này không, thực hiện hành động đó và khởi động lại chương trình userland trong vòng 3. x86_64

  • khi execcuộc gọi hệ thống được sử dụng (hoặc khi kernel sẽ bắt đầu/init ), kernel sẽ chuẩn bị các thanh ghi và bộ nhớ của tiến trình người dùng mới, sau đó nó nhảy đến điểm vào và chuyển CPU sang vòng 3

  • Nếu chương trình cố gắng làm một cái gì đó nghịch ngợm như ghi vào một thanh ghi bị cấm hoặc địa chỉ bộ nhớ (vì phân trang), CPU cũng gọi một số trình xử lý gọi lại kernel trong vòng 0.

    Nhưng vì vùng người dùng nghịch ngợm, hạt nhân có thể giết quá trình lần này hoặc đưa ra cảnh báo bằng tín hiệu.

  • Khi kernel khởi động, nó sẽ thiết lập đồng hồ phần cứng với một số tần số cố định, tạo ra các ngắt theo định kỳ.

    Đồng hồ phần cứng này tạo ra các ngắt chạy vòng 0 và cho phép nó lập lịch trình quá trình người dùng nào thức dậy.

    Bằng cách này, lập lịch có thể xảy ra ngay cả khi các quy trình không thực hiện bất kỳ cuộc gọi hệ thống nào.

Điểm có nhiều vòng là gì?

Có hai ưu điểm chính của việc tách kernel và userland:

  • việc tạo ra các chương trình sẽ dễ dàng hơn vì bạn chắc chắn sẽ không can thiệp vào chương trình kia. Ví dụ, một quy trình người dùng không phải lo lắng về việc ghi đè bộ nhớ của chương trình khác vì phân trang, cũng như không đặt phần cứng ở trạng thái không hợp lệ cho quy trình khác.
  • nó an toàn hơn Ví dụ: quyền truy cập tệp và phân tách bộ nhớ có thể ngăn ứng dụng hack đọc dữ liệu ngân hàng của bạn. Tất nhiên, điều này cho rằng bạn tin tưởng hạt nhân.

Làm thế nào để chơi xung quanh nó?

Tôi đã tạo một thiết lập kim loại trần nên là cách tốt để thao tác trực tiếp với nhẫn: https://github.com/cirosantilli/x86-bare-metal-examples

Thật không may, tôi đã không đủ kiên nhẫn để làm một ví dụ về vùng người dùng, nhưng tôi đã đi xa như thiết lập phân trang, vì vậy vùng sử dụng nên khả thi. Tôi muốn thấy một yêu cầu kéo.

Ngoài ra, các mô-đun hạt nhân Linux chạy trong vòng 0, vì vậy bạn có thể sử dụng chúng để thử các hoạt động đặc quyền, ví dụ: đọc các thanh ghi điều khiển: Làm thế nào để truy cập các thanh ghi điều khiển cr0, cr2, cr3 từ một chương trình? Bắt lỗi phân khúc

Đây là một thiết lập QEMU + Buildroot thuận tiện để dùng thử mà không làm chết máy chủ của bạn.

Nhược điểm của các mô-đun hạt nhân là các kthread khác đang chạy và có thể can thiệp vào các thử nghiệm của bạn. Nhưng trên lý thuyết, bạn có thể tiếp quản tất cả các trình xử lý ngắt với mô-đun hạt nhân của mình và sở hữu hệ thống, đó thực sự là một dự án thú vị.

Vòng âm

Mặc dù các vòng âm không thực sự được tham chiếu trong hướng dẫn sử dụng Intel, nhưng thực tế có các chế độ CPU có khả năng xa hơn so với vòng 0 và do đó rất phù hợp với tên "vòng âm".

Một ví dụ là chế độ hypanneror được sử dụng trong ảo hóa.

Để biết thêm chi tiết, xem:

CÁNH TAY

Trong ARM, các vòng được gọi là Cấp độ ngoại lệ thay vào đó, nhưng các ý tưởng chính vẫn giữ nguyên.

Có 4 cấp độ ngoại lệ trong ARMv8, thường được sử dụng là:

  • EL0: vùng người dùng

  • EL1: kernel ("người giám sát" theo thuật ngữ ARM).

    Được nhập với svchướng dẫn (SuperVisor Call), trước đây được biết đến như swi trước khi hợp nhất , là hướng dẫn được sử dụng để thực hiện các cuộc gọi hệ thống Linux. Xin chào thế giới ví dụ ARMv8:

    xin chào

    .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 ngược dòng .

    Kiểm tra nó với QEMU trên 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
    

    Dưới đây là một ví dụ cụ thể về thanh ghi đăng ký trình xử lý SVC và thực hiện cuộc gọi SVC .

  • EL2: hypannerors , ví dụ Xen .

    Được nhập với hvchướng dẫn (Cuộc gọi HyperVisor).

    Một trình ảo hóa là cho một hệ điều hành, một hệ điều hành là gì đối với người dùng.

    Ví dụ, Xen cho phép bạn chạy nhiều HĐH như Linux hoặc Windows trên cùng một hệ thống cùng một lúc và nó cách ly các HĐH với nhau để bảo mật và dễ gỡ lỗi, giống như Linux đối với các chương trình người dùng.

    Hypervisor là một phần quan trọng của cơ sở hạ tầng đám mây ngày nay: chúng cho phép nhiều máy chủ chạy trên một phần cứng duy nhất, giữ mức sử dụng phần cứng luôn ở mức gần 100% và tiết kiệm rất nhiều tiền.

    AWS đã sử dụng Xen cho đến năm 2017 khi việc chuyển sang KVM đưa ra tin tức .

  • EL3: một cấp độ khác. Ví dụ TODO.

    Được nhập với smchướng dẫn (Cuộc gọi Chế độ Bảo mật)

Các ARMv8 Kiến trúc mô hình tham chiếu DDI 0487C.a - Chương D1 - Mô hình Hệ thống AArch64 Cấp Programmer của - Hình D1-1 minh họa này đẹp:

nhập mô tả hình ảnh ở đây

Tình hình ARM đã thay đổi một chút với sự ra đời của Phần mở rộng máy chủ ảo hóa ARMv8.1 (VHE) . Phần mở rộng này cho phép kernel chạy trong EL2 một cách hiệu quả:

nhập mô tả hình ảnh ở đây

VHE được tạo ra bởi vì các giải pháp ảo hóa trong nhân Linux như KVM đã đạt được thành công so với Xen (xem ví dụ AWS chuyển sang KVM đã đề cập ở trên), vì hầu hết các máy khách chỉ cần máy ảo Linux, và như bạn có thể tưởng tượng, tất cả chỉ trong một dự án, KVM đơn giản và có khả năng hiệu quả hơn Xen. Vì vậy, bây giờ nhân Linux lưu trữ đóng vai trò là trình ảo hóa trong các trường hợp đó.

Lưu ý cách ARM, có thể do lợi ích của nhận thức muộn, có quy ước đặt tên tốt hơn cho các cấp đặc quyền so với x86, mà không cần mức âm: 0 là thấp hơn và cao nhất 3. Mức cao hơn có xu hướng được tạo ra thường xuyên hơn so với mức thấp hơn.

EL hiện tại có thể được truy vấn theo MRShướng dẫn: chế độ thực hiện / mức độ ngoại lệ hiện tại, v.v. là gì?

ARM không yêu cầu tất cả các cấp ngoại lệ phải có mặt để cho phép các triển khai không cần tính năng này để tiết kiệm diện tích chip. ARMv8 "Cấp độ ngoại lệ" cho biết:

Việc triển khai có thể không bao gồm tất cả các cấp độ Ngoại lệ. Tất cả các triển khai phải bao gồm EL0 và EL1. EL2 và EL3 là tùy chọn.

Ví dụ, QEMU mặc định cho EL1, nhưng EL2 và EL3 có thể được bật bằng các tùy chọn dòng lệnh: qemu-system-aarch64 nhập el1 khi mô phỏng a53 bật nguồn

Đoạn mã được thử nghiệm trên Ubuntu 18.10.


11

Không gian hạt nhân và không gian người dùng là sự tách biệt của các chức năng hệ điều hành đặc quyền và các ứng dụng người dùng bị hạn chế. Việc tách biệt là cần thiết để ngăn chặn các ứng dụng người dùng lục soát máy tính của bạn. Sẽ là một điều tồi tệ nếu bất kỳ chương trình người dùng cũ nào có thể bắt đầu ghi dữ liệu ngẫu nhiên vào ổ cứng của bạn hoặc đọc bộ nhớ từ không gian bộ nhớ của chương trình người dùng khác.

Các chương trình không gian người dùng không thể truy cập trực tiếp vào tài nguyên hệ thống để quyền truy cập được xử lý thay mặt cho chương trình bởi nhân hệ điều hành. Các chương trình không gian người dùng thường thực hiện các yêu cầu như vậy của hệ điều hành thông qua các cuộc gọi hệ thống.

Chủ đề hạt nhân, quy trình, ngăn xếp không có nghĩa là điều tương tự. Chúng là các cấu trúc tương tự cho không gian kernel như các đối tác của chúng trong không gian người dùng.


8

Mỗi tiến trình có 4GB bộ nhớ ảo riêng để ánh xạ tới bộ nhớ vật lý thông qua các bảng trang. Bộ nhớ ảo chủ yếu được chia thành hai phần: 3 GB cho việc sử dụng quy trình và 1 GB cho việc sử dụng Kernel. Hầu hết các biến bạn tạo nằm ở phần đầu tiên của không gian địa chỉ. Phần đó được gọi là không gian người dùng. Phần cuối cùng là nơi kernel cư trú và phổ biến cho tất cả các quy trình. Đây được gọi là không gian Kernel và hầu hết không gian này được ánh xạ tới các vị trí bắt đầu của bộ nhớ vật lý nơi hình ảnh kernel được tải khi khởi động.


1
câu trả lời của bạn là dành riêng cho Windows; bạn nên làm rõ điều đó
Matthew

1
Bạn nói rằng đối với mọi tiến trình trong bộ nhớ ảo 4GB, 1 GB là không gian Kernel giống nhau cho mọi tiến trình và chỉ giữ ánh xạ .. Tôi không thể hiểu tại sao !!, tại sao chỉ cần 1GB để ánh xạ đến vị trí bắt đầu?
VISHAL DAGA

5

Kích thước tối đa của không gian địa chỉ phụ thuộc vào độ dài của thanh ghi địa chỉ trên CPU.

Trên các hệ thống có thanh ghi địa chỉ 32 bit, kích thước tối đa của không gian địa chỉ là 2 32 byte hoặc 4 GiB. Tương tự, trên các hệ thống 64 bit, có thể xử lý 2 64 byte.

Không gian địa chỉ như vậy được gọi là bộ nhớ ảo hoặc không gian địa chỉ ảo . Nó không thực sự liên quan đến kích thước RAM vật lý.

Trên nền tảng Linux, không gian địa chỉ ảo được chia thành không gian kernel và không gian người dùng.

Một hằng số đặc trưng cho kiến ​​trúc được gọi là giới hạn kích thước tác vụ , hoặc TASK_SIZE, đánh dấu vị trí xảy ra sự phân tách:

  • phạm vi địa chỉ từ 0 đến TASK_SIZE-1 được phân bổ cho không gian người dùng;

  • phần còn lại từ TASK_SIZEtối đa 2 32 -1 (hoặc 2 64 -1) được phân bổ cho không gian kernel.

Ví dụ, trên một hệ thống 32 bit cụ thể, 3 GiB có thể bị chiếm dụng cho không gian người dùng và 1 GiB cho không gian kernel.

Mỗi ứng dụng / chương trình trong một hệ điều hành giống Unix là một quá trình; mỗi cái có một mã định danh duy nhất được gọi là Mã định danh quy trình (hoặc đơn giản là ID tiến trình , tức là PID). Linux cung cấp hai cơ chế để tạo một quy trình: 1. fork()cuộc gọi hệ thống hoặc 2.exec() cuộc gọi.

Một luồng nhân là một quá trình nhẹ và cũng là một chương trình được thực thi. Một quy trình có thể bao gồm một số luồng chia sẻ cùng một dữ liệu và tài nguyên nhưng thực hiện các đường dẫn khác nhau thông qua mã chương trình. Linux cung cấp một clone()cuộc gọi hệ thống để tạo chủ đề.

Ví dụ sử dụng các luồng nhân là: đồng bộ hóa dữ liệu của RAM, giúp bộ lập lịch phân phối các tiến trình giữa các CPU, v.v.


4

Tóm lại: Kernel chạy trong Kernel Space, không gian kernel có toàn quyền truy cập vào tất cả bộ nhớ và tài nguyên, bạn có thể nói bộ nhớ chia thành hai phần, một phần cho kernel và một phần cho quá trình riêng của người dùng, (không gian người dùng) chạy các chương trình bình thường, người dùng không gian không thể truy cập trực tiếp vào không gian kernel để nó yêu cầu từ kernel sử dụng tài nguyên. bởi syscall (cuộc gọi hệ thống được xác định trước trong glibc)

có một tuyên bố đơn giản hóa " Không gian người dùng chỉ là tải thử nghiệm cho hạt nhân " ...

Rất rõ ràng: kiến ​​trúc bộ xử lý cho phép CPU hoạt động ở hai chế độ, Chế độ hạt nhân và Chế độ người dùng , hướng dẫn Phần cứng cho phép chuyển từ chế độ này sang chế độ khác.

bộ nhớ có thể được đánh dấu là một phần của không gian người dùng hoặc không gian kernel.

Khi CPU chạy ở Chế độ người dùng, CPU chỉ có thể truy cập bộ nhớ trong không gian người dùng, trong khi cpu cố gắng truy cập bộ nhớ trong không gian Kernel, kết quả là "ngoại lệ phần cứng", khi CPU chạy ở chế độ Kernel, CPU có thể truy cập trực tiếp đến cả không gian kernel và không gian người dùng ...


2

Không gian kernel có nghĩa là không gian bộ nhớ chỉ có thể được chạm bởi kernel. Trên linux 32 bit, nó là 1G (từ 0xC0000000 đến 0xffffffff dưới dạng địa chỉ bộ nhớ ảo). Quá trình được tạo bởi kernel cũng là một luồng nhân, vì vậy, trong một tiến trình, có hai ngăn xếp: một ngăn xếp trong không gian người dùng cho quá trình này và một ngăn xếp khác trong kernel không gian cho chủ đề kernel.

ngăn xếp kernel chiếm 2 trang (8k trong linux 32 bit), bao gồm task_struct (khoảng 1k) và ngăn xếp thực (khoảng 7k). Cái sau được sử dụng để lưu trữ một số biến tự động hoặc tham số gọi hàm hoặc địa chỉ hàm trong các hàm kernel. Đây là mã (Processor.h (linux \ include \ asm-i386)):

#define THREAD_SIZE (2*PAGE_SIZE)
#define alloc_task_struct() ((struct task_struct *) __get_free_pages(GFP_KERNEL,1))
#define free_task_struct(p) free_pages((unsigned long) (p), 1)

__get_free_pages (GFP_KERNEL, 1)) có nghĩa là phân bổ bộ nhớ dưới dạng 2 ^ 1 = 2 trang.

Nhưng ngăn xếp quá trình là một điều khác, địa chỉ của nó chỉ là 0xC0000000 (linux 32 bit), kích thước của nó có thể khá lớn hơn, được sử dụng cho các cuộc gọi chức năng không gian người dùng.

Vì vậy, đây là một câu hỏi cho cuộc gọi hệ thống, nó đang chạy trong không gian kernel nhưng được gọi bởi quá trình trong không gian người dùng, làm thế nào nó hoạt động? Linux sẽ đặt params và địa chỉ hàm của nó trong kernel stack hay process stack? Giải pháp của Linux: tất cả các cuộc gọi hệ thống được kích hoạt bởi sự gián đoạn phần mềm INT 0x80. Được xác định trong mục.S (linux \ arch \ i386 \ kernel), đây là một số dòng chẳng hạn:

ENTRY(sys_call_table)
.long SYMBOL_NAME(sys_ni_syscall)   /* 0  -  old "setup()" system call*/
.long SYMBOL_NAME(sys_exit)
.long SYMBOL_NAME(sys_fork)
.long SYMBOL_NAME(sys_read)
.long SYMBOL_NAME(sys_write)
.long SYMBOL_NAME(sys_open)     /* 5 */
.long SYMBOL_NAME(sys_close)

Câu hỏi cuối cùng là rất tốt bạn đưa ra. Nhưng chỉ cần gián đoạn phần mềm INT 0x80 thì sao? Nó không phải là một lời giải thích tốt cho tôi. Bạn có thể giải thích chi tiết cách giải pháp hoạt động cho câu hỏi bạn tự đưa ra không?
Victor Choy

2

Bởi Sunil Yadav, trên Quora:

Hạt nhân Linux đề cập đến mọi thứ chạy trong chế độ Kernel và được tạo thành từ nhiều lớp riêng biệt. Ở lớp thấp nhất, Kernel tương tác với phần cứng thông qua HAL. Ở cấp độ trung bình, Hạt nhân UNIX được chia thành 4 khu vực riêng biệt. Khu vực đầu tiên trong bốn khu vực xử lý các thiết bị nhân vật, TTY thô và nấu chín và xử lý thiết bị đầu cuối. Khu vực thứ hai xử lý trình điều khiển thiết bị mạng, giao thức định tuyến và ổ cắm. Vùng thứ ba xử lý trình điều khiển thiết bị đĩa, bộ đệm trang và bộ đệm, hệ thống tệp, bộ nhớ ảo, đặt tên tệp và ánh xạ. Khu vực thứ tư và cuối cùng xử lý quá trình gửi, lập kế hoạch, tạo và chấm dứt cũng như xử lý tín hiệu. Trên tất cả, chúng ta có lớp Kernel trên cùng bao gồm các cuộc gọi hệ thống, ngắt và bẫy. Cấp độ này đóng vai trò là giao diện cho từng chức năng cấp thấp hơn. Một lập trình viên sử dụng các cuộc gọi và ngắt hệ thống khác nhau để tương tác với các tính năng của hệ điều hành.



1

Cố gắng đưa ra một lời giải thích rất đơn giản

Bộ nhớ ảo được chia thành không gian kernel và không gian người dùng. Không gian hạt nhân là khu vực của bộ nhớ ảo nơi các tiến trình kernel sẽ chạy và không gian người dùng là khu vực của bộ nhớ ảo nơi các tiến trình người dùng sẽ chạy.

Sự phân chia này là cần thiết để bảo vệ truy cập bộ nhớ.

Bất cứ khi nào bộ tải khởi động khởi động kernel sau khi tải nó vào một vị trí trong RAM, (thông thường trên bộ điều khiển dựa trên ARM), nó cần đảm bảo rằng bộ điều khiển ở chế độ giám sát với vô hiệu hóa FIQ và IRQ.


1

Không gian hạt nhân và không gian người dùng là không gian logic.

Hầu hết các bộ xử lý hiện đại được thiết kế để chạy ở chế độ đặc quyền khác nhau. Máy x86 có thể chạy ở 4 chế độ đặc quyền khác nhau. nhập mô tả hình ảnh ở đây

Và một lệnh máy cụ thể có thể được thực thi khi ở / trên chế độ đặc quyền cụ thể.

Bởi vì thiết kế này, bạn đang cung cấp cho một hệ thống bảo vệ hoặc đấm bốc cát môi trường thực thi.

Kernel là một đoạn mã, quản lý phần cứng của bạn và cung cấp sự trừu tượng hóa hệ thống. Vì vậy, nó cần phải có quyền truy cập cho tất cả các hướng dẫn máy. Và nó là phần mềm đáng tin cậy nhất. Vì vậy, tôi nên được thực hiện với đặc quyền cao nhất. Và Ring level 0 là chế độ đặc quyền nhất. Vì vậy, Cấp độ 0 cũng được gọi là Chế độ hạt nhân .

Ứng dụng người dùng là một phần mềm đến từ bất kỳ nhà cung cấp bên thứ ba nào và bạn không thể hoàn toàn tin tưởng vào họ. Ai đó có ý định độc hại có thể viết mã để đánh sập hệ thống của bạn nếu anh ta có quyền truy cập hoàn toàn vào tất cả các hướng dẫn máy. Vì vậy, ứng dụng nên được cung cấp quyền truy cập vào bộ hướng dẫn giới hạn. Và Ring Level 3 là chế độ ít đặc quyền nhất. Vì vậy, tất cả các ứng dụng của bạn chạy trong chế độ đó. Do đó, Ring Level 3 còn được gọi là Chế độ người dùng .

Lưu ý: Tôi không nhận được Cấp độ 1 và 2. Về cơ bản, chúng là các chế độ với đặc quyền trung gian. Vì vậy, có thể mã trình điều khiển thiết bị được thực thi với đặc quyền này. AFAIK, linux chỉ sử dụng Ring Ring 0 và 3 để thực thi mã hạt nhân và ứng dụng người dùng.

Vì vậy, bất kỳ hoạt động xảy ra trong chế độ kernel có thể được coi là không gian kernel. Và bất kỳ hoạt động xảy ra trong chế độ người dùng có thể được coi là không gian người dùng.


0

Câu trả lời đúng là: Không có thứ gọi là không gian kernel và không gian người dùng. Bộ hướng dẫn bộ xử lý có các quyền đặc biệt để đặt những thứ phá hoại như gốc của sơ đồ bảng trang hoặc truy cập bộ nhớ thiết bị phần cứng, v.v.

Mã hạt nhân có các đặc quyền cấp cao nhất và mã người dùng thấp nhất. Điều này ngăn mã người dùng làm sập hệ thống, sửa đổi các chương trình khác, v.v.

Nói chung mã hạt nhân được giữ trong một bản đồ bộ nhớ khác với mã người dùng (giống như không gian người dùng được giữ trong các bản đồ bộ nhớ khác nhau). Đây là nơi xuất phát từ thuật ngữ "không gian nhân" và "không gian người dùng". Nhưng đó không phải là một quy tắc khó khăn và nhanh chóng. Ví dụ, vì x86 gián tiếp yêu cầu các trình xử lý ngắt / bẫy của nó phải được ánh xạ mọi lúc, một phần (hoặc một số hệ điều hành) của hạt nhân phải được ánh xạ vào không gian người dùng. Một lần nữa, điều này không có nghĩa là mã đó có đặc quyền người dùng.

Tại sao phân chia hạt nhân / người dùng cần thiết? Một số nhà thiết kế không đồng ý rằng trên thực tế, nó là cần thiết. Kiến trúc vi hạt dựa trên ý tưởng rằng các phần mã đặc quyền cao nhất phải càng nhỏ càng tốt, với tất cả các hoạt động quan trọng được thực hiện trong mã đặc quyền người dùng. Bạn sẽ cần nghiên cứu tại sao điều này có thể là một ý tưởng tốt, nó không phải là một khái niệm đơn giản (và nổi tiếng vì có cả ưu điểm và nhược điểm).


0

Bộ nhớ được chia thành hai khu vực riêng biệt:

  • Không gian người dùng, là một tập hợp các vị trí nơi các tiến trình người dùng bình thường chạy (tức là mọi thứ khác ngoài kernel). Vai trò của kernel là quản lý các ứng dụng đang chạy trong không gian này khỏi sự lộn xộn với nhau và máy.
  • Không gian kernel, là vị trí lưu trữ mã của kernel và thực thi bên dưới.

Các tiến trình chạy trong không gian người dùng chỉ có quyền truy cập vào một phần bộ nhớ hạn chế, trong khi đó kernel có quyền truy cập vào tất cả bộ nhớ. Các tiến trình đang chạy trong không gian người dùng cũng không có quyền truy cập vào không gian kernel. Các tiến trình không gian người dùng chỉ có thể truy cập một phần nhỏ của kernel thông qua một giao diện được hiển thị bởi kernel - hệ thống gọi. Nếu một tiến trình thực hiện một cuộc gọi hệ thống, một ngắt phần mềm được gửi đến kernel, sau đó gửi trình xử lý ngắt thích hợp và tiếp tục công việc của nó sau khi xử lý xong.


-7

Trong Linux có hai không gian thứ nhất là không gian người dùng và một không gian khác là không gian kernal. không gian người dùng chỉ bao gồm ứng dụng người dùng mà bạn muốn chạy. vì dịch vụ kernal có quản lý quy trình, quản lý tệp, xử lý tín hiệu, quản lý bộ nhớ, quản lý luồng và rất nhiều dịch vụ có mặt ở đó. nếu bạn chạy ứng dụng từ không gian người dùng thì ứng dụng chỉ tương tác với dịch vụ kernal. và dịch vụ đó tương tác với trình điều khiển thiết bị có mặt giữa phần cứng và hạt nhân. lợi ích chính của không gian hạt nhân và phân tách không gian người dùng là chúng ta có thể tạo ra sự bảo mật bằng virus.bcaz của tất cả các ứng dụng người dùng có trong không gian người dùng và dịch vụ có mặt trong không gian của hạt nhân. đó là lý do tại sao linux không, ảnh hưởng từ virus.


5
Bên cạnh thực tế đó là "hạt nhân" chứ không phải "hạt nhân", câu trả lời của bạn không hoàn toàn chính xác. Các virus hiện đại (và với hiện đại, ý tôi là mọi thứ sau Windows 98) hoàn toàn không tương tác với "dịch vụ kernel", mọi thứ đều được thực hiện trong không gian người dùng. Thực tế là Linux không có nhiều vi-rút (dĩ nhiên có vi-rút cho Linux) là nó có quản lý cấp phép khá tốt và - thực tế quan trọng nhất - hầu hết người dùng Linux không phải là những người đó: "omaigosh JustinBieber.NewSong.exe! Tôi PHẢI nghe nó NAO !!! 1111 "người dùng nhấp và cài đặt mọi thứ mà không có bất kỳ manh mối nào.
alexclooze

3
Ngoài ra, Linux không được sử dụng nhiều như Windows - virus viết cho nó sẽ không gây ra nhiều thiệt hại như các tác giả của virus muốn đạt được. Các ứng dụng không gian người dùng không giao tiếp với dịch vụ kernel, chúng gọi các hàm đặc biệt được cung cấp bởi kernel được gọi là tòa nhà chọc trời.
alexclooze
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.