南飓风 发表于 2025-2-13 10:38:18

Linux---架构概览

一、Linux 架构分层的深度解析

1. 用户空间(User Space)

用户空间是应用程序运行的环境,与内核空隔断离,确保体系稳固性。


[*] 应用程序层:

[*]用户程序:如 edge、vim,通过调用标准库(如 glibc)间接使用体系调用。
[*]动态链接:程序依靠共享库(.so 文件),由动态链接器(ld-linux.so)加载。
[*]实行权限:通过 execve() 体系调用启动程序,联合文件权限(如 rwx)控制实行。

[*] 体系工具链:

[*]GNU Coreutils:提供底子命令(ls、cp),通过 Shell 脚本组合实现复杂功能。
[*]Shell 工作原理:

[*]解析命令为 argv 参数,调用 fork() 创建子进程,再通过 exec() 实行命令。
[*]管道(|)通过匿名管道(pipe())实现进程间通信。

[*]图形界面:

[*]X11/Wayland 协议负责窗口管理,GNOME/KDE 等桌面环境运行在显示服务器之上。


2. 内核空间(Kernel Space)

内核直接受理硬件,提供体系服务,代码运行在特权模式(Ring 0)。


[*] 体系调用接口(SCI):

[*]体系调用表:每个体系调用对应唯一编号(如 __NR_read),通过 syscall 指令触发软停止(如 int 0x80)。
[*]参数通报:通过寄存器(x86)或堆栈通报参数,返回值存入 eax 寄存器。
[*]示例:open("/file", O_RDWR) 触发 sys_open(),返回文件描述符(fd)。

[*] 内核子体系协作:

[*]进程调理:当进程通过 sched_yield() 主动让出 CPU,或时间片耗尽时触发调理。
[*]停止处理:硬件停止(如键盘输入)触发停止服务程序(ISR),通过 irq_handler 处理。

二、核心子体系深度分析

1. 进程管理



[*] 进程与线程的实现:

[*]进程描述符(task_struct):内核用此布局体管理进程的全部信息(PID、内存映射、打开文件等)。
[*]线程实现:线程共享进程的地点空间,通过 clone() 体系调用创建,标记位指定共享资源(如 CLONE_VM 共享内存)。
[*]轻量级进程(LWP):Linux 线程本质是 LWP,由内核调理,与 POSIX 线程库(pthread)共同使用。

[*] 调理器(CFS):

[*]红黑树与 vruntime:全部可运行进程按 vruntime(虚拟运行时间)排序,CFS 选择最小 vruntime 的进程实行。
[*]时间片计算:vruntime 增长速率与进程优先级成反比(高优先级进程 vruntime 增长更慢)。
[*]实时调理类:

[*]SCHED_FIFO:进程不绝运行直到主动让出或更高优先级进程就绪。
[*]SCHED_RR:雷同优先级进程按时间片轮转。


[*] 进程间通信(IPC):

[*]共享内存:通过 shmget() 创建共享内存段,shmat() 映射到进程地点空间。
[*]信号量(Semaphore):控制对共享资源的访问,通过 semop() 实现 P/V 操作。
[*]消息队列:msgget() 创建队列,msgsnd() 和 msgrcv() 发送/接收消息。

2. 内存管理



[*] 虚拟内存机制:

[*]页表与多级分页:x86_64 使用 4 级页表(PGD、PUD、PMD、PTE),MMU 将虚拟地点转换为物理地点。
[*]缺页非常:访问未映射的页时触发缺页停止,内核大概从磁盘加载数据(如互换区或文件映射)。

[*] 内存分配器:

[*]Buddy 算法:

[*]将物理内存分别为 2^n 巨细的块,分配时拆分,释放时合并相邻空闲块。
[*]解决外部碎片标题,但大概产生内部碎片。

[*]Slab 分配器:

[*]针对小对象(如 inode、task_struct),预分配内存池,淘汰内存分配开销。
[*]每个 Slab 包罗多个对象,通过缓存(kmem_cache)管理。


[*] Swap 管理:

[*]页面换出:当物理内存不足时,kswapd 内核线程将不活泼页写入互换分区。
[*]互换优先级:通过页面标记(如 PG_active、PG_referenced)判断页面活泼度。

3. 文件体系



[*] 虚拟文件体系(VFS):

[*]抽象接口:

[*]file_operations 布局体界说文件操作(如 read()、write())。
[*]dentry 缓存目次项,加速路径查找。

[*]挂载点:通过 mount() 体系调用将文件体系挂载到目次树。

[*] Ext4 文件体系:

[*]日记(Journal):

[*]写操作先写入日记,再提交到磁盘,确保崩溃后可通过日记恢复同等性。
[*]日记模式:journal(记录元数据和数据)、ordered(仅记录元数据,数据先写)。

[*]延迟分配(Delayed Allocation):文件写入时先缓存数据,分配物理块推迟到革新时,淘汰碎片。

[*] 设备文件:

[*]字符设备:如 /dev/tty,通过 read()/write() 逐字节访问。
[*]块设备:如 /dev/sda,数据以块为单元读写,由 I/O 调理器合并请求。

4. 网络子体系



[*] TCP/IP 协议栈:

[*]数据包处理流程:
[*]链路层:网卡驱动接收帧,解析 MAC 地点。
[*]网络层:IP 协议处理路由(通过路由表 fib_table),分片与重组。
[*]传输层:TCP 协议维护连接状态(struct sock),处理重传与拥塞控制(如 CUBIC 算法)。

[*]套接字(Socket):

[*]通过 socket() 创建,类型包括 SOCK_STREAM(TCP)、SOCK_DGRAM(UDP)。
[*]绑定端口后通过 listen() 等候连接,accept() 接受新连接。


[*] Netfilter 框架:

[*]五个钩子点:NF_IP_PRE_ROUTING、NF_IP_LOCAL_IN、NF_IP_FORWARD、NF_IP_LOCAL_OUT、NF_IP_POST_ROUTING。
[*]iptables 规则示例:iptables -A INPUT -p tcp --dport 22 -j ACCEPT# 允许 SSH 连接


5. 设备驱动



[*] 驱动模子:

[*]设备树(Device Tree):描述硬件资源配置(如 ARM 平台),替代传统的硬编码配置。
[*]sysfs 文件体系:通过 /sys 目次暴露设备信息(如 /sys/class/net/eth0)。

[*] 模块加载:

[*]编译与加载:驱动代码编译为 .ko 文件,通过 insmod 加载,rmmod 卸载。
[*]依靠管理:modprobe 自动处理模块依靠关系。

三、Linux 启动流程的具体步调


[*] BIOS/UEFI 阶段:

[*]硬件自检(POST):检测 CPU、内存、外设。
[*]引导设备选择:按 BIOS 设置顺序(如硬盘、USB)探求引导扇区。

[*] Bootloader(GRUB):

[*]引导菜单:加载 grub.cfg,显示可启动内核列表。
[*]加载内核:读取 vmlinuz 和 initramfs 到内存,移交控制权。

[*] 内核初始化:

[*]解压与启动:解压内核镜像,初始化核心子体系(内存管理、进程调理)。
[*]挂载根文件体系:initramfs 提供临时根文件体系,加载真实根文件体系驱动(如 Ext4)。

[*] 用户空间初始化:

[*]init 进程:

[*]Systemd:并行启动服务单元(.service 文件),管理依靠关系。
[*]运行级别:systemctl isolate multi-user.target 切换运行模式。


四、Linux 设计哲学的实践体现


[*] 一切皆文件:

[*]/proc 文件体系:通过 /proc/<pid>/status 查看进程状态,/proc/cpuinfo 获取 CPU 信息。
[*]伪终端(PTY):通过 /dev/pts/0 实现终端会话,SSH 连接依靠此机制。

[*] 模块化设计:

[*]热插拔支持:插入 USB 设备时,内核自动加载 usb-storage.ko 驱动。
[*]自界说内核:通过 make menuconfig 裁剪不必要的模块,编译专属内核。

[*] KISS 原则的典型应用:

[*]文本处理流水线:grep "error" log.txt | awk '{print $1}' | sort | uniq -c 组合多个工具完成任务。

五、安全机制的实现细节


[*] Capabilities 机制:

[*]细分特权:传统 root 权限被拆分为数十种能力(如 CAP_NET_BIND_SERVICE 答应绑定低端口)。
[*]设置能力:通过 setcap cap_net_bind_service=+ep /usr/bin/myapp 赋予程序特定权限。

[*] LSM 框架:

[*]SELinux:

[*]强制访问控制(MAC),基于安全上下文(如 user_u:role_r:type_t)限制进程访问资源。
[*]策略规则示例:allow httpd_t var_log_t:file { read write };。


[*] 定名空间(Namespaces):

[*]PID 定名空间:容器内进程 PID 从 1 开始,与宿主机隔离。
[*]网络定名空间:每个容器拥有独立网络栈,通过 veth pair 连接宿主机。

六、性能优化技能详解


[*] I/O 调理器选择:

[*]Deadline 调理器:为每个请求设置截止时间,防止饿死(适合数据库负载)。
[*]Kyber:针对 NVMe SSD 设计,基于队列深度动态调整。

[*] 内存优化:

[*]透明大页(THP):自动合并 2MB 大页,淘汰 TLB 未命中次数(需内核配置 CONFIG_TRANSPARENT_HUGEPAGE)。
[*]内存压缩(zswap):将不活泼页压缩后存入内存,而非写入互换区。

[*] eBPF 的高级应用:

[*]动态追踪:通过 bpftrace 脚本监控内核函数调用。
[*]网络加速:XDP(eXpress Data Path)在网卡驱动层处理数据包,实现 DDoS 防护。

总结与学习建议

Linux 的复杂性源于其广泛的应用场景和高度优化的设计。要深入理解:

[*] 实践方法:

[*]使用 strace 跟踪体系调用:strace -f -o log.txt gcc hello.c。
[*]通过 /proc 和 /sys 实时查看内核状态:cat /proc/meminfo。

[*] 源码学习:

[*]阅读内核源码(如进程调理代码在 kernel/sched/ 目次)。
[*]使用 QEMU + GDB 调试内核启动流程。

[*] 性能分析工具:

[*]perf:分析 CPU 热点(perf record -g ./program)。
[*]ftrace:跟踪内核函数调用链。

通过联合理论、代码和工具,可以逐步掌握 Linux 的核心机制,为体系级开发和运维打下坚固底子。
人的精神思想方面的优势越大,给无聊留下的空间就越小。 —叔本华

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Linux---架构概览