<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>内存空间 on nayun blog</title><link>https://wang-xu-97.github.io/nayun.github.io/tags/%E5%86%85%E5%AD%98%E7%A9%BA%E9%97%B4/</link><description>Recent content in 内存空间 on nayun blog</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>© 2026 nayun</copyright><lastBuildDate>Mon, 14 Jul 2025 15:39:03 +0800</lastBuildDate><atom:link href="https://wang-xu-97.github.io/nayun.github.io/tags/%E5%86%85%E5%AD%98%E7%A9%BA%E9%97%B4/index.xml" rel="self" type="application/rss+xml"/><item><title>用户态、内核态内存空间</title><link>https://wang-xu-97.github.io/nayun.github.io/tech/backend/linux/%E7%94%A8%E6%88%B7%E6%80%81%E5%86%85%E6%A0%B8%E6%80%81%E5%86%85%E5%AD%98%E7%A9%BA%E9%97%B4/</link><pubDate>Mon, 14 Jul 2025 15:39:03 +0800</pubDate><guid>https://wang-xu-97.github.io/nayun.github.io/tech/backend/linux/%E7%94%A8%E6%88%B7%E6%80%81%E5%86%85%E6%A0%B8%E6%80%81%E5%86%85%E5%AD%98%E7%A9%BA%E9%97%B4/</guid><description>&lt;p&gt;用户态、内核态指内存空间，CPU的各寄存器则是CPU硬件，不属于内存部分，仅在需要存档备份数据时保存至（用户态/内核态）内存&lt;br&gt;
1、 进程内核栈&lt;br&gt;
每个进程都有自己独立的位于内核空间的内核栈，保存进程在内核态执行的函数调用栈、局部变量、寄存器状态等数据&lt;/p&gt;
&lt;p&gt;linux系统切换进程时会切换&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;内核栈&lt;br&gt;
将 CPU 的栈指针寄存器 (SP/ESP/RSP, x86架构) 从指向进程 A 的内核栈顶部，修改为指向进程 B 的内核栈顶部&lt;/li&gt;
&lt;li&gt;页目录&lt;br&gt;
系统切换进程时找到进程的页目录的物理基地址（mm-&amp;gt;pgd指针），写入CR3(x86)/TTBR0(ARM)寄存&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;2、进程页目录&lt;br&gt;
存储在物理内存中，进程在创建时，系统创建mm_struct结构，用mm-&amp;gt;pgd指针保存页目录物理基地址（用来在系统切换进程时找到进程的页目录的物理基地址，写入CR3(x86)/TTBR0(ARM)寄存器，完成进程上下文切换）&lt;br&gt;
页目录包含进程使用的全部内存的虚拟内存地址-&amp;gt;物理内存地址的映射关系&lt;br&gt;
3、进程硬件上下文&lt;br&gt;
运行时各寄存器的中间结果、比如PC程序计数器（下一条指令地址）、SP栈指针寄存器（当前调用栈顶）&lt;br&gt;
切换时，这些数据被保存到进程内核栈中&lt;/p&gt;
&lt;p&gt;4、线程切换总是发生在同一个进程（同一个虚拟地址空间）内的线程之间。不同进程的线程之间的切换，本质上是通过上层的进程切换完成的&lt;br&gt;
5、切换线程时只切换线程内核栈，同样CPU栈指针寄存器从指向线程A的内核栈顶-&amp;gt;B的内核栈顶。因为同属一个进程，所以不切换页目录，也即使用同一虚拟内存空间&lt;/p&gt;
&lt;p&gt;6、进程、线程切换都依赖内核调度器，抢占式调度（时间片、中断）&lt;br&gt;
7、协程切换只在用户态通过程序本身调度切换，主动让出，显式让出控制权&lt;br&gt;
8、&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;进程&lt;/th&gt;
&lt;th&gt;线程&lt;/th&gt;
&lt;th&gt;协程&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;切换内核栈、页目录&lt;/td&gt;
&lt;td&gt;切换内核栈&lt;/td&gt;
&lt;td&gt;仅切换寄存器状态&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;9、用户态进程与内核态进程 全双工通信 -&amp;gt; Netlink Socket&lt;/p&gt;
&lt;p&gt;相比传统 IPC (syscall, ioctl, procfs)，Netlink 具有显著优势：易于扩展、异步通信、完美支持内核模块、强大的组播能力、真正的全双工通信、开发者友好的标准 Socket API。&lt;/p&gt;
&lt;p&gt;单播回显: 用户请求-&amp;gt;内核处理-&amp;gt;内核响应的双向通信模式&lt;br&gt;
内核主动组播: 内核主动向多个订阅进程广播事件的能力&lt;/p&gt;
&lt;p&gt;netlink属于无连接协议（无连接协议是一种通信协议，其中每个数据包的处理都是独立的，不需要在发送数据之前建立连接）&lt;/p&gt;</description></item></channel></rss>