一份完整的 Windows 学习笔记。学多少记多少,重点讲"为什么这么设计"(费曼式 📌 讲解),配 draw.io 图。
图表在
/Windows学习笔记/diagrams/目录。图注名即原图文件名(如图注"图 1 · Windows 架构分层"对应图1_Windows架构分层.d2/图1_Windows架构分层.d2.svg),改图请编辑同名.d2源文件后运行scripts/build-d2.ps1重新渲染。
| Windows NT | Linux | |
|---|---|---|
| 许可证 | 闭源商业 | 开源 GPL |
| 内核类型 | 混合内核 | 宏内核 |
| 用户空间 | Win32 API / COM / .NET | GNU 工具 / POSIX API |
| 默认 Shell | CMD / PowerShell | bash / sh |
| 包管理 | winget / Store(较新) | apt / dnf(历史悠久) |
📌 什么是"混合内核"?Linux 是宏内核——文件系统、驱动、网络协议栈全在内核态,性能好但耦合度高。Windows NT 是混合内核——核心功能在内核态,但部分子系统在用户态隔离运行,牺牲少量性能换取更好的隔离性。
打个比方:宏内核像"全包式公司"——所有部门在同一栋楼,沟通快但一个部门着火可能烧全楼。混合内核像"分散办公"——核心部门在总部,其他部门在独立楼层,一个部门出问题不波及全局,但跨部门沟通多走几步路。
| 层 | 作用 | 你能看到的例子 |
|---|---|---|
| 用户应用程序 | 最顶层,用户直接交互 | 浏览器、Office、PowerShell |
| 子系统 | 兼容不同 API 的适配层 | Win32 子系统、WSL(Linux 子系统) |
| Native API | 内核对外暴露的底层 API | NtCreateFile()、NtReadFile() |
| Windows NT 内核 | 核心执行体 + 微内核 | 进程/线程调度、内存管理、I/O 管理 |
| 硬件 | 物理资源 | CPU、RAM、磁盘、网卡 |
📌 Windows 也有用户态/内核态隔离,原理和 Linux 一样:CPU 分 Ring 0(内核态)和 Ring 3(用户态)。但 Windows 的 Native API 是未公开文档的——微软只让开发者用上层的 Win32 API(如 CreateFile()),Win32 API 内部再调用 Native API。这给了微软重构内核的自由。
📌 子系统是什么?Windows NT 设计之初要兼容多种环境,于是设计了"子系统"层——每个子系统把各自 API 翻译成统一的 Native API。WSL(Windows Subsystem for Linux)就是利用这个架构,加了一个 Linux 兼容子系统,让 Linux 程序直接跑在 Windows 上。
Windows 以盘符为根(C:\、D:\),路径用反斜杠 \ 分隔。
📌 为什么 Windows 用盘符而 Linux 用单根树?历史决定。Windows 继承了 DOS 的盘符设计——早期 PC 有多个软盘驱动器(A:、B:),硬盘从 C: 开始。Linux 的单根树更优雅(见 Linux 笔记 02 章),但盘符对普通用户更直观——"文件在 D 盘"比"文件挂载在 /data"更容易理解。
📌 为什么用反斜杠 \?DOS 历史遗留:DOS 用 / 作为命令选项前缀(如 dir /w),为不冲突,路径分隔符用了 \。现代 Windows API 实际上两种斜杠都支持,但惯例统一用 \。
| 目录 | 关键点 | 对应 Linux |
|---|---|---|
C:\Windows\System32 |
系统核心文件、DLL、驱动 | /usr/sbin + /lib |
C:\Windows\System32\drivers\etc |
hosts 文件、网络配置 | /etc |
C:\Users\<用户名> |
用户家目录 | /home/<用户名> |
C:\Users\<用户名>\AppData |
应用数据(Local/Roaming/Temp) | ~/.config + ~/.local |
C:\ProgramData |
全局应用数据(隐藏) | /var |
C:\Windows\Temp |
系统临时文件 | /tmp |
C:\Windows\Logs |
系统日志 | /var/log |
📌 注册表是什么?Windows 独有的集中式配置数据库。Linux 的配置散在 /etc 下的文本文件里,改配置就是改文件。Windows 把系统配置、应用配置、硬件信息全塞进注册表这个树形数据库里,用 regedit 或 reg 命令操作。
打个比方:Linux 的配置像"一柜子文件夹"——每个软件一个配置文件,用记事本就能改。注册表像"一个巨型 Excel"——所有软件的设置都在这一张表里,结构化但复杂,改错一行可能系统起不来。
| 特性 | NTFS | ext4 |
|---|---|---|
| 权限模型 | ACL(访问控制列表) | rwx + owner/group/other |
| 日志 | 有(事务日志) | 有(journal) |
| 压缩 | 内置透明压缩 | 需额外工具 |
| 加密 | EFS | 需 LUKS 等 |
| 大小写敏感 | 默认不敏感 | 敏感 |
📌 NTFS 权限比 Linux rwx 精细得多。Linux 每个文件只有三组权限(owner/group/other),每组 rwx。NTFS 用 ACL——可以给任意多个用户/组分别设置不同的权限组合(读、写、执行、删除、修改权限……十几种权限位)。
打个比方:Linux 权限像"三把钥匙"——主人、团队、外人各一把。NTFS 权限像"门禁系统"——可以给每个人单独设一张卡,每张卡能进哪些门、什么时段能进,全部独立配置。
| CMD | PowerShell | |
|---|---|---|
| 诞生 | 1987 | 2006 |
| 数据类型 | 纯文本 | 对象(.NET 对象) |
| 管道传递 | 文本流 | 对象流 |
| 编程能力 | 弱(bat) | 强(完整编程语言) |
| 别名 | 无 | 兼容 CMD/Linux 命令名 |
📌 PowerShell 为什么是"面向对象"的?bash 管道传文本,grep 搜文本、awk 切列。PowerShell 管道传对象——Get-Process 输出 Process 对象,可以直接 Get-Process | Where-Object {$_.CPU -gt 10},不用切列、不用正则。
打个比方:bash 管道像"传纸条"——上个工序写好文字,下个工序得自己解析。PowerShell 管道像"传快递包裹"——里面是结构化的物品,标签上写着属性,直接取用。
Mode 列解读:
📌 PowerShell 命令为什么这么长?New-Item、Get-ChildItem 比 Linux 的 touch、ls 长得多。这是 Verb-Noun 命名规范:动词表示动作(Get/New/Set/Remove),名词表示对象(Item/Process/Service)。好处是自描述,坏处是啰嗦——所以有大量别名(rm = Remove-Item、cp = Copy-Item)。
📌 $_ 是什么?管道中的当前对象变量。$_.CPU 就是"当前进程的 CPU 属性"。类似 JavaScript 箭头函数的参数。
📌 PowerShell 有 6 个输出流(Linux 只有 stdout + stderr):1=Success, 2=Error, 3=Warning, 4=Verbose, 5=Debug, 6=Information。可以分别重定向:3>&1 把警告合并到输出。
| Linux | Windows | |
|---|---|---|
| 权限粒度 | 3组 × 3位 = 9个权限位 | 每用户/组独立,十几种权限 |
| 查看权限 | ls -l |
icacls / Get-Acl |
| 修改权限 | chmod |
icacls / Set-Acl |
| 超级用户 | root (UID 0) | Administrator + UAC |
📌 UAC 解决什么问题?Windows XP 时代用户习惯用 Administrator 账户,所有程序都拥有完全权限——恶意软件一运行就能改系统核心。UAC 让管理员平时以普通权限运行,需要提权时才确认。这就是为什么 Windows 7 后恶意软件大幅减少。
📌 为什么有些程序图标有盾牌标记?那个盾牌表示需要管理员权限。在命令行里用 Start-Process -Verb RunAs 以管理员权限启动。
| 代码 | 含义 | 对应 Linux |
|---|---|---|
F |
Full Control | rwx |
M |
Modify | rw- |
RX |
Read & Execute | r-x |
R |
Read | r-- |
W |
Write | -w- |
📌 NTFS 权限继承:Windows 目录权限默认向下继承——给 C:\Projects 设了权限,里面所有子目录和文件自动继承。新文件也自动获得父目录权限。Linux 的 chmod -R 是一次性操作,新文件不受影响。要打破继承用 icacls /inheritance:d。
📌 为什么 PowerShell 默认禁止运行脚本?PowerShell 能力极强(调 .NET、操作注册表、远程执行),如果默认允许跑任何脚本,一封邮件附件的 .ps1 就能控制系统。所以默认 Restricted——你必须主动放开才能跑脚本,相当于安全闸。
| 条件 | 含义 |
|---|---|
Test-Path $path |
路径存在 |
$a -eq $b |
等于 |
$a -gt $b |
大于 |
$str -match "regex" |
正则匹配 |
$str -like "wild*" |
通配符匹配 |
| Linux | Windows | |
|---|---|---|
| 创建机制 | fork() + exec() |
CreateProcess()(一步完成) |
| PID 1 | systemd | Session Manager |
📌 为什么 Windows 没有 fork()?Linux 的 fork 是"复制自己再变身"两步走。Windows 的 CreateProcess 是"直接创建新进程"一步到位——传程序路径、参数、环境变量,直接创建。各有优劣:fork 的好处是中间能动手脚(重定向),Windows 用参数(STARTUPINFO)也能做到。
| 列 | 含义 | 对应 Linux |
|---|---|---|
Handles |
句柄数 | fd 数量 |
WS(K) |
物理内存占用 | RSS |
CPU(s) |
累计 CPU 时间 | TIME |
Id |
进程 ID | PID |
📌 Windows 有信号机制吗?没有 Linux 那样的信号系统。taskkill(不带 /f)发 WM_CLOSE 消息,进程可保存数据后退出(类似 SIGTERM);taskkill /f 强制终止(= SIGKILL)。先礼后兵的思路一样。
| 层 | 作用 | 关键概念 |
|---|---|---|
| 应用层 | 具体应用协议 | HTTP、SSH、DNS |
| 传输层 | 端到端传输 | TCP/UDP、端口号 |
| 网络层 | 跨网络寻址路由 | IP 地址、路由 |
| 链路层 | 物理网络传输 | MAC 地址、网卡 |
📌 网络知识跨平台通用。TCP 三次握手、IP 地址、端口、DNS——在 Windows 和 Linux 上完全一样,因为它们是协议标准。区别只在命令工具:Linux 用 ip/ss,Windows 用 ipconfig/netstat。
📌 Windows ping 默认只发 4 个包就停了,Linux 是持续 ping 直到 Ctrl+C。Windows 要持续 ping 需加 -t 参数。这是历史习惯差异。
📌 netstat -ano 的 -o 显示 PID,可以定位是哪个进程占用了端口。Linux 用 ss -tlnp 达到同样目的。
📌 Windows 10 开始内置 OpenSSH,不再需要 PuTTY。ssh、scp 命令和 Linux 完全一样。这是微软拥抱开源的标志之一。
与 Linux /etc/hosts 功能完全相同——优先级高于 DNS,先查 hosts 再问 DNS 服务器。
| 时期 | 方式 | 对应 Linux |
|---|---|---|
| ~2010 | 安装向导(.exe/.msi) | 无(Linux 从诞生就有 apt) |
| 2011 | Chocolatey(社区) | apt/dnf |
| 2020 | winget(微软官方) | apt/dnf |
📌 为什么 Windows 这么晚才有包管理器?Linux 是开源生态——所有软件都在仓库里,天然适合集中管理。Windows 是商业生态——每个软件厂商有自己的安装程序,各自为政。winget 相当于微软终于建了"超市",把分散的软件集中起来。
📌 msiexec 对应 Linux 的 dpkg -i——底层包安装工具。winget/choco 是高层工具(自动处理依赖),msiexec 是底层工具(装单个包)。和 apt/dpkg 的关系一样。
Windows 的 SCM 相当于 Linux 的 systemd——管理后台服务的启动、停止、自启。
| Linux systemd | Windows SCM | |
|---|---|---|
| 管理器 | systemd (PID 1) | services.exe |
| 配置 | .service 单元文件 | 注册表 + SCM 数据库 |
| 查看服务 | systemctl list-units |
Get-Service |
| 启动/停止 | systemctl start/stop |
Start/Stop-Service |
| 开机自启 | systemctl enable |
Set-Service -StartupType Automatic |
| 查看日志 | journalctl |
事件查看器 (eventvwr.msc) |
📌 sc 命令的怪异语法:start= auto 等号后面必须有空格。这是 sc 命令的历史遗留设计——它把 start= auto 解析为参数名 start 值 auto,等号只是分隔符不是赋值。
| 日志类别 | 内容 | 对应 Linux |
|---|---|---|
| System | 系统事件 | /var/log/syslog |
| Application | 应用事件 | 应用日志 |
| Security | 安全审计 | /var/log/auth.log |
📌 安全事件 ID 速查:4624=登录成功,4625=登录失败,4634=注销,4688=进程创建。对应 Linux 的 /var/log/auth.log 里的记录。
| Linux | Windows | |
|---|---|---|
| 分区表 | GPT/MBR | GPT/MBR |
| 文件系统 | ext4/xfs | NTFS/ReFS |
| 挂载方式 | mount 到目录树 | 分配盘符 |
| 自动挂载 | /etc/fstab | 系统自动(盘符持久) |
📌 Windows 用盘符代替挂载点。Linux 把磁盘"挂载"到目录树(如 /data),Windows 给磁盘分配盘符(如 D:)。思路不同:Linux 的方式更灵活(可以挂到任意位置),Windows 的方式更直观(用户一看盘符就知道)。
📌 VSS 对应 Linux LVM 快照。Windows 的"还原以前的版本"功能底层就是 VSS——它给文件系统拍了某个时间点的快照,之后文件被改了也能恢复。Linux 用 LVM snapshot 或 ZFS/Btrfs 快照达到同样目的。
| MBR(旧) | GPT(新) | |
|---|---|---|
| 最大磁盘 | 2TB | >2TB |
| 主分区数 | 4个 | 128个 |
| 冗余校验 | 无 | 有 |
| 配合 | BIOS | UEFI |
新磁盘建议用 GPT。UEFI + GPT 是现代标准组合。
Windows 防火墙默认开启(不像 Linux ufw 需要手动启用)。默认策略:入站阻止、出站允许。
📌 RDP vs SSH:SSH(端口22)是命令行远程,RDP(端口3389)是图形远程。Linux 也有图形远程(VNC/X11 forwarding)但不如 RDP 流畅——因为 RDP 协议层面就为图形优化。建议限制 RDP 只允许特定 IP 访问。
📌 安全原则跨平台通用:最小权限(服务用低权账户)、最小开放(只开必需端口)、及时更新(Windows Update 打补丁)。和 Linux 安全原则完全一样,只是工具不同。
| 资源 | Windows 工具 | 对应 Linux |
|---|---|---|
| CPU | 任务管理器 / Get-Counter | top / htop |
| 内存 | 任务管理器 / systeminfo | free -h |
| 磁盘 I/O | resmon / Get-Counter | iostat / iotop |
| 网络 | resmon / netstat | iftop / sar |
| 工具 | 打开方式 | 说明 |
|---|---|---|
| 任务管理器 | Ctrl+Shift+Esc | 一屏看CPU/内存/磁盘/网络 |
| 资源监视器 | resmon | 更详细,按进程看IO/网络 |
| 性能监视器 | perfmon | 计数器图表,长期监控 |
📌 性能排查方法论跨平台通用:① 看全局(任务管理器)→ 哪类资源紧张 → ② 针对该资源用专项工具 → 定位到具体进程 → ③ 分析该进程 → 看日志/调参/扩容。和 Linux 的思路完全一样。
IIS(Internet Information Services)是 Windows 自带的 Web 服务器,对应 Linux 的 Nginx。
| IIS | Nginx | |
|---|---|---|
| 平台 | Windows only | 跨平台 |
| 配置 | GUI + XML | 纯文本 |
| ASP.NET | 原生支持 | 需反向代理 |
| 反向代理 | 需装 ARR 模块 | 原生支持 |
| 负载均衡 | 应用池 | upstream |
用 inetmgr 打开 IIS 管理器(GUI)。
📌 IIS 的"应用池"对应 Nginx 的 upstream。每个应用跑在独立的工作进程(w3wp.exe)中,互相隔离。一个应用池崩溃不影响其他站点——这和 Nginx 的 worker 进程隔离思路类似。
📌 WSL1 vs WSL2:WSL1 是"翻译层"——把 Linux syscall 翻译成 Windows NT API,兼容好但有性能损耗。WSL2 是"真 Linux 内核"——跑在轻量 VM 里,完整兼容,接近原生性能。现在默认安装 WSL2。
📌 WSL 利用的是 Windows NT 的子系统架构。Windows NT 设计之初就支持多种子系统(OS/2、POSIX),WSL 就是加了一个 Linux 子系统。这是架构上的远见——30年前的设计在今天发挥了新价值。
| 从 Windows 访问 WSL | 从 WSL 访问 Windows |
|---|---|
\\wsl$\Ubuntu\home\ |
/mnt/c/Users/hisos/ |
📌 VS Code Remote-WSL 是最佳实践:在 Windows 编辑 WSL 里的代码,用 Linux 工具链编译运行。两全其美——Windows 的 GUI 体验 + Linux 的开发环境。
📌 计划任务对应 Linux 的 cron。Linux 用 crontab -e 编辑定时任务,Windows 用 Register-ScheduledTask 或 GUI(taskschd.msc)。思路一样——指定"什么时候执行什么命令"。
📌 PowerShell 文本处理 vs Linux 三剑客。Linux 有 grep/sed/awk 三个专用工具。PowerShell 用 Select-String(= grep)、-replace运算符(= sed)、-split运算符 + Where-Object(= awk)。没有专用工具,但用运算符和管道组合更统一。
| 阶段 | Windows | 对应 Linux |
|---|---|---|
| ① 固件 | UEFI/BIOS | BIOS/UEFI |
| ② 引导 | Windows Boot Manager | GRUB |
| ③ 加载内核 | winload.efi → ntoskrnl.exe | GRUB 加载 vmlinuz |
| ④ 内核初始化 | NT 内核 + 驱动 + 服务 | kernel + systemd |
| ⑤ 登录 | 用户配置文件/桌面 | 登录提示符/shell |
📌 为什么需要 Boot Manager(鸡生蛋问题)。内核是磁盘上的文件,而"读取磁盘文件"本来是内核才会做的事——内核还没启动,谁来读它?所以需要一个极小、不依赖内核、能直接和固件/磁盘打交道的程序先上场。Windows 用 winload.efi(UEFI)或 winload.exe(Legacy BIOS),Linux 用 GRUB。思路完全一样。
📌 Windows 的 PID 1 不是 systemd。Windows 的第一个用户态进程是 Session Manager(smss.exe),它负责启动子系统、加载驱动。之后是 csrss.exe(Win32 子系统)、winlogon.exe(登录)。没有 Linux systemd 那样的统一服务管理——Windows 用 SCM 独立管理服务。
或命令行:
| 主题 | Windows | Linux |
|---|---|---|
| 内核 | NT 混合内核 | 宏内核 |
| Shell | PowerShell(面向对象) | bash(面向文本) |
| 包管理 | winget / Chocolatey | apt / dnf |
| 服务管理 | SCM / Get-Service | systemd / systemctl |
| 存储挂载 | 盘符 C: D: | 目录树 mount |
| 权限 | NTFS ACL + UAC | rwx + sudo |
| 防火墙 | Defender Firewall | ufw / firewalld |
| 性能监控 | 任务管理器 / perfmon | top / htop |
| Web 服务器 | IIS | Nginx |
| 容器 | WSL2 + Docker Desktop | Docker |
| 文本处理 | Select-String / -replace | grep / sed / awk |
| 启动流程 | UEFI → Boot Manager → winload → NT Kernel | BIOS → GRUB → kernel → systemd |
| 日志 | 事件查看器 | journalctl |
| 远程 | RDP (3389) | SSH (22) |
| 计划任务 | Task Scheduler | cron |
📌 学 Windows 的最佳策略:对照 Linux 学。你已经会 Linux,Windows 的每个概念都能在 Linux 找到对应。记住对照关系,就能快速上手。核心差异只有三点:① PowerShell 面向对象 vs bash 面向文本;② 盘符 vs 单根目录树;③ 注册表 vs /etc 文本配置。
| 操作 | PowerShell | CMD | Linux |
|---|---|---|---|
| 列目录 | Get-ChildItem |
dir |
ls |
| 切换目录 | Set-Location |
cd |
cd |
| 当前路径 | Get-Location |
cd |
pwd |
| 创建目录 | New-Item -ItemType Directory |
mkdir |
mkdir |
| 复制 | Copy-Item |
copy |
cp |
| 移动 | Move-Item |
move |
mv |
| 删除 | Remove-Item |
del |
rm |
| 查看内容 | Get-Content |
type |
cat |
| 操作 | PowerShell | CMD | Linux |
|---|---|---|---|
| 进程列表 | Get-Process |
tasklist |
ps aux |
| 杀进程 | Stop-Process -Id PID -Force |
taskkill /pid PID /f |
kill -9 PID |
| 服务列表 | Get-Service |
sc query |
systemctl list-units |
| 启动服务 | Start-Service Name |
sc start Name |
systemctl start Name |
| 磁盘空间 | Get-PSDrive |
wmic logicaldisk |
df -h |
| 网络配置 | ipconfig /all |
ipconfig /all |
ip a |
| 端口占用 | Get-NetTCPConnection |
netstat -ano |
ss -tlnp |
| 操作 | Windows | Linux |
|---|---|---|
| 查IP | ipconfig |
ip a |
| ping | ping -t host |
ping host |
| 路由追踪 | tracert |
traceroute |
| DNS查询 | Resolve-DnsName |
dig |
| 端口查看 | netstat -ano |
ss -tlnp |
| HTTP请求 | curl |
curl |
| 远程登录 | ssh user@host |
ssh user@host |
| 远程桌面 | mstsc /v:host |
— |
| 问题 | 答案 |
|---|---|
| Windows 内核类型? | 混合内核(NT) |
| PowerShell 管道传什么? | 对象(.NET 对象),不是文本 |
| Windows 包管理器? | winget(官方)/ Chocolatey(社区) |
| Windows 的 systemd 叫什么? | SCM(服务控制管理器) |
| Windows 防火墙默认状态? | 开启(入站阻止、出站允许) |
| Windows 的 journalctl? | 事件查看器(Get-WinEvent) |
| Windows 的 cron? | Task Scheduler(计划任务) |
| WSL2 用什么内核? | 真正的 Linux 内核(轻量 VM) |
| Windows 的 /etc? | 注册表(集中式配置数据库) |
| Windows 的 /home? | C:\Users<用户名> |
| PowerShell 默认执行策略? | Restricted(禁止脚本) |
| Windows 的 root? | Administrator + UAC 提权 |
| Windows 的 kill -9? | taskkill /pid PID /f |
| Windows 的 grep? | Select-String |
| Windows 的 df -h? | Get-PSDrive |
| RDP 端口? | 3389 |
| Windows 启动引导器? | Windows Boot Manager(= GRUB) |
| NTFS 权限模型? | ACL(每用户独立配置,十几种权限位) |
Q: PowerShell 和 bash 管道有什么本质区别?
A: bash 管道传文本流,下游用 grep/awk 解析文本。PowerShell 管道传 .NET 对象,下游直接访问属性 $_.CPU,不需要切列解析。
Q: UAC 解决了什么问题? A: Windows XP 时代用户都用 Administrator 账户,恶意软件一运行就有完全权限。UAC 让管理员平时以普通权限运行,需要提权时弹窗确认,减少了恶意软件的静默提权。
Q: WSL2 和 WSL1 的区别? A: WSL1 是 syscall 翻译层(Linux syscall → NT API),兼容好但性能有损耗。WSL2 跑真正的 Linux 内核(轻量 VM),完整兼容,接近原生性能。
Q: Windows 为什么用盘符而不用单根目录树? A: 历史 reasons——继承 DOS 的盘符设计(A: B: 给软盘,C: 开始给硬盘)。Linux 的单根树更优雅,但盘符对普通用户更直观。
目标:在 Windows Server 上部署 IIS + ASP.NET 应用,配置防火墙和监控。
步骤:
📌 这个项目串联了 IIS 配置(13章)、防火墙(11章)、性能监控(12章)、计划任务(15章)、日志查看(9章)——把所学知识串起来用。