Linux kernel 内核空间和用户空间之间的区别是什么?

Linux kernel 内核空间和用户空间之间的区别是什么?,linux-kernel,operating-system,kernel,terminology,Linux Kernel,Operating System,Kernel,Terminology,内核空间和用户空间之间的区别是什么?内核空间、内核线程、内核进程和内核堆栈的含义是否相同?还有,为什么我们需要这种区别呢?真正简单的答案是内核在内核空间中运行,而普通程序在用户空间中运行。用户空间基本上是沙盒的一种形式——它限制用户程序,这样它们就不会弄乱其他程序或操作系统内核拥有的内存(和其他资源)。这限制了(但通常不会完全消除)他们做诸如撞坏机器之类坏事的能力 内核是操作系统的核心。它通常可以完全访问所有内存和机器硬件(以及机器上的所有其他内容)。为了使机器尽可能稳定,您通常只希望最可信、经

内核空间和用户空间之间的区别是什么?内核空间、内核线程、内核进程和内核堆栈的含义是否相同?还有,为什么我们需要这种区别呢?

真正简单的答案是内核在内核空间中运行,而普通程序在用户空间中运行。用户空间基本上是沙盒的一种形式——它限制用户程序,这样它们就不会弄乱其他程序或操作系统内核拥有的内存(和其他资源)。这限制了(但通常不会完全消除)他们做诸如撞坏机器之类坏事的能力

内核是操作系统的核心。它通常可以完全访问所有内存和机器硬件(以及机器上的所有其他内容)。为了使机器尽可能稳定,您通常只希望最可信、经过良好测试的代码在内核模式/内核空间中运行


堆栈只是内存的另一部分,因此它自然与内存的其余部分分离。

内核空间和用户空间是特权操作系统功能和受限用户应用程序的分离。分离是必要的,以防止用户应用程序洗劫您的计算机。如果任何旧的用户程序开始向硬盘写入随机数据或从另一个用户程序的内存空间读取内存,那将是一件坏事

用户空间程序无法直接访问系统资源,因此访问由操作系统内核代表程序处理。用户空间程序通常通过系统调用向操作系统发出此类请求


内核线程、进程、堆栈的含义并不相同。它们是内核空间的类似结构,就像它们在用户空间中的对应结构一样。

每个进程都有自己的4GB虚拟内存,通过页表映射到物理内存。虚拟内存主要分为两部分:3GB用于进程,1GB用于内核。您创建的大多数变量位于地址空间的第一部分。这部分称为用户空间。最后一部分是内核所在的位置,对所有进程都是通用的。这称为内核空间,其中大部分空间映射到物理内存的起始位置,在启动时加载内核映像。

随机存取内存(RAM)在逻辑上可分为两个不同的区域,即内核空间和用户空间。(,所有这一切由

内核在有权使用它的内存中运行。这部分内存不能被普通用户的进程直接访问,而as内核可以访问内存的所有部分。要访问内核的某些部分,用户进程必须使用预定义的系统调用,即
open
read
write
等。此外,
C
库函数如
printf
依次调用系统调用
write

系统调用充当用户进程和内核进程之间的接口。访问权限放在内核空间上,以防止用户在不知情的情况下弄乱内核


因此,当系统调用发生时,软件中断被发送到内核。CPU可以暂时将控制权移交给相关的中断处理程序例程。被中断中断停止的内核进程在中断处理程序例程完成其工作后恢复。

在Linux中,有两个空间,第一个是用户空间,另一个是内核空间。用户空间仅包含您要运行的用户应用程序。作为核心服务,有进程管理、文件管理、信号处理、内存管理、线程管理等许多服务。如果从用户空间运行应用程序,则应用程序仅与内核服务交互。该服务与硬件和内核之间的设备驱动程序进行交互。 内核空间和用户空间分离的主要好处是,我们可以通过用户空间中存在的所有用户应用程序的virus.bcaz以及内核空间中存在的服务来获得安全性。这就是为什么linux不会受到病毒的影响

Linux内核指的是在内核模式下运行的所有东西,并且是 由几个不同的层组成。在最底层,内核 通过HAL与硬件交互。在中层 UNIX内核分为4个不同的区域。四个中的第一个 区域处理字符设备、生的和熟的TTY和终端 处理。第二个区域处理网络设备驱动程序、路由 协议和套接字。第三个区域处理磁盘设备驱动程序, 页面和缓冲区缓存、文件系统、虚拟内存、文件命名和 映射。第四个也是最后一个区域负责工艺调度, 调度、创建和终止以及信号处理。 最重要的是,我们有内核的顶层,其中包括 系统调用、中断和陷阱。这一级别作为 与每个较低级别功能的接口。程序员使用 各种系统调用和中断以与功能交互 操作系统的安全性


简而言之:内核运行在内核空间,内核空间可以完全访问所有内存和资源,可以说内存分为两部分,一部分用于内核,一部分用于用户自己的进程,(用户空间)运行正常的程序,用户空间不能直接访问内核空间,因此它请求内核使用资源。按系统调用(glibc中预定义的系统调用)

有一条语句简化了不同的“用户空间只是内核的测试负载”

非常清楚:处理器架构允许CPU在两种模式下运行,内核模式和用户模式,,即硬件指令
#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)
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)
.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
.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
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