【Linux内核专栏 16】调试与性能

Tuzik_Linux内核技术栈博客 Tuzik_Linux 内核技术栈博客专注于Linux内核机制研究,涵盖ARMV8架构、实时内核改造、RT调度器等核心技术。博主具有芯片底层技术背景,提供详细的技术分析文章,包括中断线程化、自旋锁优化、RCU机制等实时性改造方案,以及RT调度器实现原理和性能测试方法。博客还收录了实时内核稳定性案例分析和优化实践经验,为Linux内核开发者提供有价值的参考资料。所有内容均为原创技术分析,仅供学习交流使用。 阅读详情

本篇定位:对于gdb 重度用户(stat_snap),本篇是你的 Linux 调试工具箱。从 printk(基础日志)到 ftrace(函数跟踪)、perf(性能剖析)、kprobe(动态插桩)、eBPF(现代神器)、oops/crash(死机分析)、lockdep(死锁检测)。读完能在 Linux 上达到你裸机 gdb 的调试精度,甚至更强。

Linux 调试工具远超裸机 gdb
Linux 全套系统化:① printk(日志);② ftrace(函数跟踪,不用改代码);③ perf(性能剖析,找热点);④ kprobe(动态插桩,你的 stat_snap 系统版);⑤ eBPF(可编程跟踪,现代神器);⑥ oops/panic 分析(addr2line,RISC-V 专题 10 篇那套);⑦ lockdep(死锁自动检测)。调试方法论直接迁移,工具升级。


一、printk:基础日志

1.1 printk 用法

printk(KERN_ERR "fail: %d\n", ret);
printk(KERN_INFO "probe ok\n");
pr_err("error: %d\n", ret);      // 推荐
pr_info("info\n");
pr_warn("warn\n");
pr_debug("debug\n");              // 默认不打印,开 DEBUG 才打
dev_info(&pdev->dev, "probe\n"); // 带设备信息
dev_err(&pdev->dev, "fail\n");

1.2 日志级别

级别宏数值
KERN_EMERGpr_emerg0(最高)
KERN_ALERTpr_alert1
KERN_CRITpr_crit2
KERN_ERRpr_err3
KERN_WARNINGpr_warn4
KERN_NOTICEpr_notice5
KERN_INFOpr_info6
KERN_DEBUGpr_debug7(最低)

1.3 console_loglevel

  • 控制台只显示 >= console_loglevel 的
  • dmesg 看全部
dmesg                      # 看所有内核日志
dmesg | tail               # 最近
dmesg -w                   # 实时(follow)

# 改 console_loglevel
echo 8 > /proc/sys/kernel/printk   # 全打印
cat /proc/sys/kernel/printk        # 当前 4 个级别

1.4 printk 的特点(对照 printf)

  • 在内核态(不是用户态 printf)
  • 带级别
  • 可在中断上下文调(但 try_lock console,忙时缓冲)
  • 不是异步的紧急情况用 printk_safe(防死锁)
  • earlycon(02 篇):早期 printk,console 初始化前用

1.5 printk 时间戳

dmesg | head
# [    0.000000] Booting Linux...
# [    1.234567] ...
  • 时间戳(秒.微秒),自启动
  • dmesg -T 转人类时间

嵌入式视角:printk 是你的串口调试升级版
裸机 printf 到串口。Linux printk 同理,但:① 带级别;② 全局环形缓冲(不丢,可 dmesg 回看);③ 可动态调级别。调试驱动,printk + dmesg 是第一工具,和 printf 习惯一致。


二、oops 和 panic:崩溃分析⭐

2.1 oops 是什么

  • 内核遇到错误(空指针/非法地址/页错误)
  • 打印寄存器 + 栈 + 调用栈
  • 若可恢复(进程上下文)→ 杀进程,内核继续;若不可恢复(中断/关键)→ panic

2.2 典型 oops 输出

Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000
Oops[#1]:
CPU: 0 PID: 1234 Comm: myapp
pc : my_driver_probe+0x34/0x100
lr : platform_probe+0x20/0x40
Call trace:
 my_driver_probe+0x34/0x100
 platform_probe+0x20/0x40
 really_probe+0x60/0x100
 ...
epc : ffffff8001234034 ra : ffffff8001235020 sp : ffffffc08001fee0
RISC-V 寄存器:
 ra : ffffff8001235020 sp : ffffffc08001fee0 gp : ...
 a0-a7 : ...
 Code: xxxx xxxx (出错处指令)
---[ end trace ]---

2.3 oops 分析五步法(对照你 RISC-V 10 篇)

1. 看错误类型
   "NULL pointer dereference" / "Unable to handle paging request"
   → 空指针 / 非法地址

2. 看 PC(出错指令地址)
   pc : my_driver_probe+0x34/0x100
   → my_driver_probe 函数,偏移 0x34

3. addr2line 定位源码行
   riscv64-linux-gnu-addr2line -e vmlinux ffffff8001234034
   /path/my_driver.c:42
   → 第 42 行

4. 看调用栈(Call trace)
   my_driver_probe ← platform_probe ← really_probe
   → 怎么调用进来的

5. 看寄存器(a0-a7 参数)
   a0 = 0  → 传入了空指针

2.4 addr2line(你 10 篇那套)

# 内核符号地址 → 源码行
riscv64-linux-gnu-addr2line -e vmlinux ffffff8001234034
# /home/me/kernel/drivers/my/my_driver.c:42

# 反汇编
riscv64-linux-gnu-objdump -d vmlinux | grep -A 20 "my_driver_probe"

2.5 panic

  • oops 不可恢复 → panic(整内核停)
  • 配 panic=10 内核参数:panic 后 10 秒重启
  • kdump:panic 时启动捕获内核,dump 内存

2.6 crash dump(kdump)

  • CONFIG_CRASH_DUMP:panic 时切到捕获内核
  • dump 内存到文件
  • crash 工具分析(vmcore)
# 配 kdump
# 内核 cmdline: crashkernel=128M
# 启动 kdump 服务
systemctl start kdump

# 分析 vmcore
crash /usr/lib/debug/vmlinux /var/crash/xxx/vmcore
crash> bt          # 看崩溃栈
crash> ps          # 看进程
crash> struct task_struct ffffffc0xxx

oops 分析五步法和RISC-V 10 篇死机分析同构
RISC-V 专题 10 篇的"死机分析五步法"(mepc→addr2line/mcause/mtval/MPP/栈回溯)——Linux oops 分析完全同构:PC(=mepc)→ addr2line / 错误类型(=mcause) / 出错地址(=mtval) / 进程上下文(=MPP) / Call trace(=栈回溯)。RISC-V 死机分析经验直接迁移到 Linux oops。


三、ftrace:函数跟踪⭐

3.1 ftrace 是什么

  • Function Tracer,不用改代码,运行时跟踪函数调用
  • 内核 CONFIG_FTRACE + CONFIG_FUNCTION_TRACER
  • 基于编译器 -pg 插桩(mcount),运行时动态开关

3.2 tracefs 接口

# tracefs(常挂 /sys/kernel/tracing)
cd /sys/kernel/tracing

# 看可用 tracer
cat available_tracers
# hwlat blk function_graph wakeup_dl wakeup_rt wakeup function nop

# 选 tracer
echo function > current_tracer

# 跟踪某函数
echo my_driver_probe > set_ftrace_filter

# 开始跟踪
echo 1 > tracing_on
# ... 触发操作 ...
echo 0 > tracing_on

# 看结果
cat trace
# myapp-1234 [000] 1234.567: my_driver_probe <- platform_probe

3.3 function_graph tracer(调用图)

echo function_graph > current_tracer
echo my_driver_probe > set_graph_function
cat trace
#  my_driver_probe() {
#     ioremap+0x10/0x20 () {
#        ...
#     }
#     request_irq+0x20 () {
#     }
#  }
  • 看函数调用嵌套 + 耗时
  • 类似你 stat_snap 的调用栈展开

3.4 trace events(事件跟踪)

# 看可用事件
ls events/
# sched/ irq/ net/ block/ ...

# 启用某事件
echo 1 > events/sched/sched_switch/enable
# 跟踪进程切换

cat trace
# sched_switch: prev=myapp pid=1234 next=swapper/0
  • 预定义事件(sched/irq/net/block…)
  • 细粒度跟踪

3.5 trace-cmd(前端工具)

# trace-cmd 包装 ftrace
trace-cmd record -e sched ls    # 跟踪 sched 事件,跑 ls
trace-cmd report                # 看结果

# KernelShark:GUI 看 trace

ftrace 系统化跟踪所有函数调用,不用改代码,运行时开关。function_graph 看调用嵌套+耗时,events 看子系统事件(sched_switch/irq_entry)。


四、perf:性能剖析⭐

4.1 perf 是什么

  • 性能分析神器
  • 采样 CPU 周期/缓存/分支/软件事件
  • 找热点(哪个函数耗 CPU)

4.2 perf 基础

# 统计程序事件
perf stat ./myapp
#  cycles / instructions / cache-misses / branch-misses

# 采样 CPU 热点
perf record ./myapp    # 生成 perf.data
perf report            # 交互看热点
perf report --stdio    # 文本

# 实时 top
perf top               # 实时看 CPU 热点函数

4.3 perf 事件

事件含义
cyclesCPU 周期
instructions指令数
cache-misses缓存未命中
branch-misses分支预测失败
task-clock任务占 CPU 时间
page-faults缺页
context-switches上下文切换
sched:sched_switch调度事件(Tracepoint)

4.4 perf record 采样

# 采样 CPU 周期,调用栈
perf record -g ./myapp       # -g 记录调用栈
perf report -g graph         # 看调用图

# 采样特定事件
perf record -e cache-misses ./myapp

# 采样所有 CPU
perf record -a sleep 5       # 采 5 秒系统全局

4.5 perf 输出

  35.23%  myapp  myapp  [.] process_data
  20.10%  myapp  libc   [.] memcpy
  10.05%  myapp  myapp  [.] compute_hash
  ...
  • 按函数占比找热点
  • process_data 占 35%,优化它收益最大

4.6 perf 应用场景

场景用什么
CPU 热点perf record -g + report
缓存性能perf stat -e cache-misses
调度分析perf sched
内存分配perf kmem
块 IOperf stat -e block:…
火焰图perf record -g + FlameGraph

4.7 火焰图

# 生成火焰图
perf record -F 99 -ag sleep 30    # 99Hz 采样 30s
perf script > out.perf
git clone https://github.com/brendangregg/FlameGraph
./stackcollapse-perf.pl out.perf > out.folded
./flamegraph.pl out.folded > flame.svg
# 浏览器打开 flame.svg
  • 可视化 CPU 热点,宽的函数 = 占 CPU 多
  • 调优必备

perf 是你性能分析主力
裸机性能靠 cycle 计数器(RISC-V mcycle)。Linux perf 全系统采样,找 CPU 热点/缓存/调度问题。性能问题先 perf record + report,火焰图直观。


五、kprobe:动态插桩⭐

5.1 kprobe 是什么

  • Kernel Probe,运行时在任意指令插桩
  • 不用改内核源码,不用重编
  • 插桩点抓寄存器/改寄存器

5.2 kprobe 类型

类型触发
kprobe任意指令
kretprobe函数返回
jprobe函数入口(弃用,用 kprobe)

5.3 kprobe API

struct kprobe kp = {
    .symbol_name = "do_sys_open",
    .pre_handler = my_pre,    // 执行前
    .post_handler = my_post,  // 执行后
};

register_kprobe(&kp);

int my_pre(struct kprobe *p, struct pt_regs *regs) {
    // 抓参数(regs->a0, a1, ...)
    printk("open: %s\n", (char *)regs->a1);
    return 0;
}

5.4 kprobe 用途

  • 跟踪任意内核函数(不用改源码)
  • 抓函数参数/返回值
  • perf/ftrace 底层用 kprobe

5.5 通过 ftrace 用 kprobe

# 在 do_sys_open 插桩
echo 'p:my_open do_sys_open' > /sys/kernel/tracing/kprobe_events
echo 1 > /sys/kernel/tracing/events/kprobes/my_open/enable
cat trace
# my_open: do_sys_open ...

gdb 在断点抓状态——kprobe 运行时在内核任意函数插桩抓寄存器/参数,不用 gdb attach(生产可用)。perf/ftrace 的动态跟踪底层就是 kprobe。


六、eBPF:现代神器⭐

6.1 eBPF 是什么

  • Extended Berkeley Packet Filter
  • 在内核运行沙箱程序(安全),不改内核
  • 现代 Linux 可观测性/网络/安全核心

6.2 eBPF 能力

领域用途
跟踪替代 kprobe/ftrace(更灵活)
网络XDP(网卡层)/TC/cgroup
安全LSM 钩子,审计
观测性能/事件/统计

6.3 eBPF 程序

  • 用 C(受限子集)写,编译成 BPF 字节码
  • 经验证器(verifier)安全检查
  • JIT 编译成本地指令
  • 挂到钩子点(kprobe/tracepoint/XDP/socket…)
// 简化 eBPF 程序(跟踪 do_sys_open)
SEC("kprobe/do_sys_open")
int my_open(struct pt_regs *ctx) {
    char comm[16];
    bpf_get_current_comm(&comm, sizeof(comm));
    bpf_trace_printk("open by %s\n", comm);
    return 0;
}

6.4 eBPF 工具链

工具作用
bccPython + C 写 eBPF(易用)
bpftrace类 awk 脚本写 eBPF(极简)
libbpfC 库(生产)

6.5 bpftrace 示例

# 跟踪所有 open
bpftrace -e 'tracepoint:syscalls:sys_enter_openat { printf("%s open %s\n", comm, str(args->filename)); }'

# 统计函数调用次数
bpftrace -e 'kprobe:do_sys_open { @[comm] = count(); }'

# 函数耗时
bpftrace -e 'kprobe:my_func { @start[tid] = nsecs; } kretprobe:my_func /@start[tid]/ { @us[comm] = (nsecs - @start[tid]) / 1000; delete(@start[tid]); }'

6.6 eBPF 工具集(bcc tools)

# 一堆现成工具
execsnoop        # 跟踪进程执行
opensnoop        # 跟踪 open
biolatency       # 块 IO 延迟分布
biosnoop         # 块 IO 事件
tcpconnect       # TCP 连接
runqlat          # 调度延迟
funccount        # 函数调用计数

eBPF 是现代内核调试/观测的核武器
裸机调试受限于静态代码。eBPF 运行时动态注入观测逻辑,安全(验证器)且高效(JIT)。bpftrace 几行脚本跟踪任意函数/事件。不用改代码,运行时观测,生产可用。你学 Linux 必学 eBPF。


七、lockdep:死锁检测

7.1 lockdep 是什么

  • Lock Dependency Detector
  • CONFIG_LOCKDEP
  • 运行时跟踪所有锁的获取顺序,检测潜在死锁

7.2 lockdep 检测

  • AB-BA 死锁(锁顺序冲突)
  • 持锁睡(原子上下文 schedule)
  • 自递归锁
  • 中断里持同一锁

7.3 开启

# 内核配置 CONFIG_LOCKDEP=y CONFIG_PROVE_LOCKING=y
# 开启后跑测试,自动报告

dmesg | grep -i lockdep
# [ BUG: possible deadlock ]
# [ BUG: sleeping in atomic context ]

7.4 lockdep 报告

=============================================
WARNING: possible recursive locking detected
task: myapp/1234 is trying to acquire lock:
 lock(&lockA){...}, at: my_func+0x20/0x40

but task is already holding lock:
 lock(&lockA){...}, at: other_func+0x10/0x30
...

lockdep 是你 07 篇死锁的自动检测
你 07 篇学的死锁类型(AB-BA/持锁睡/自递归)——lockdep 自动检测,不用你肉眼看。开发期开 lockdep 跑测试,大部分死锁自动暴露。你写驱动必开 lockdep 调试,省大量排查时间。


八、其他调试工具

8.1 kgdb(内核 gdb)

  • 内核版 gdb,远程调试
  • 配 kgdboc=ttyS0,115200 cmdline
  • 主机 gdb 连接,断点/单步/读寄存器
  • 和你裸机 gdb 几乎一样,只是调试内核
# 目标(内核 cmdline)
kgdbwait kgdboc=ttyS0,115200

# 主机
gdb vmlinux
(gdb) target remote /dev/ttyUSB0
(gdb) b my_driver_probe
(gdb) c

8.2 kdb

  • kgdb 的简单版,串口直接交互(不用主机 gdb)
  • kdb> ps / bt / md(内存)

8.3 /proc 和 /sys

  • /proc/<pid>/:进程信息(status/maps/fd/…)
  • /proc/meminfo /proc/interrupts /proc/cpuinfo
  • /sys/:设备模型(10 篇)

8.4 sysrq(魔术键)

  • SysRq 组合键,紧急调试
  • echo 1 > /proc/sys/kernel/sysrq 启用
  • Alt+SysRq+键:t(栈)/m(内存)/w(阻塞任务)/c(crash dump)/b(重启)/o(关机)
echo t > /proc/sysrq-trigger   # 打印所有任务栈
echo c > /proc/sysrq-trigger   # 触发 crash(测 kdump)

8.5 debugfs

  • 11 篇 / 12 篇提过,驱动调试信息放这
  • /sys/kernel/debug/

九、网络/IO 调试工具

9.1 网络

工具作用
tcpdump抓包
wireshark图形分析包
ss看 socket
ethtool网卡统计
iperf3带宽测
dropwatch丢包点定位

9.2 IO

工具作用
iostatIO 统计
iotop进程 IO
blktrace块层事件
fioIO 压测

9.3 内存

工具作用
free内存概况
cat /proc/meminfo详细
slabtopslab 占用
pmap进程内存映射
valgrind用户态内存检测

十、调试方法论(系统化)

10.1 调试层次

1. 现象捕获:printk/dmesg + 复现
2. 错误定位:oops + addr2line(死机)
   或:perf/ftrace(性能)
3. 深入:eBPF/kprobe 动态观测
4. 验证:改代码 + 重测

10.2 各场景首选工具

场景首选
死机/panicoops + addr2line + 栈
性能慢(找热点)perf record + report / 火焰图
函数调用跟踪ftrace function_graph
动态观测参数bpftrace / kprobe
死锁lockdep
内存泄漏kmemleak / slabtop
中断问题/proc/interrupts + ftrace irq events
网络tcpdump + ss + dropwatch
IO 慢iostat + blktrace
进程卡/proc//status + cat /proc//wchan

10.3 调试内核配置

开发期开启(生产关,影响性能):

CONFIG_DEBUG_INFO=y        # 调试符号(addr2line)
CONFIG_FRAME_POINTER=y     # 栈回溯准确
CONFIG_LOCKDEP=y           # 死锁检测
CONFIG_DEBUG_ATOMIC_SLEEP=y # 原子上下文睡检测
CONFIG_KASAN=y             # 内存安全(地址越界)
CONFIG_KMSAN=y             # 内存未初始化
CONFIG_UBSAN=y             # 未定义行为
CONFIG_FAULT_INJECTION=y   # 故障注入
CONFIG_KMEMLEAK=y          # 内存泄漏检测
CONFIG_FTRACE=y            # 跟踪
CONFIG_KPROBES=y           # 动态插桩
CONFIG_BPF=y               # eBPF

开发开 debug 配置,生产关
调试内核要开一堆 CONFIG_DEBUG_*(符号/lockdep/KASAN),自动抓很多 bug。生产关掉(性能损失)。这是裸机"Debug 编译/Release 编译"的内核版。


十一、对照总表

概念裸机 gdbLinux 调试
日志printfprintk + dmesg
死机分析mepc/addr2line/栈oops + addr2line + Call trace
函数跟踪断点单步ftrace(不改代码)
性能剖析cycle 计数perf + 火焰图
动态插桩gdb 断点kprobe / eBPF
死锁检测肉眼lockdep 自动
远程调试gdbkgdb
紧急调试复位sysrq
内存检测自己加KASAN/kmemleak
可观测stat_snapeBPF

十二、本篇小结

  • printk:内核日志,分级(pr_err/info/debug),dmesg 看,console_loglevel 控制台显示
  • oops/panic:崩溃分析五步法(错误类型/PC/addr2line/Call trace/寄存器),和你 RISC-V 10 篇死机分析同构;kdump + crash 分析 vmcore
  • ftrace:函数跟踪(不改代码),function/function_graph/events,trace-cmd 前端
  • perf:性能剖析,perf record/report 找热点,火焰图可视化,事件(cycles/cache-misses/sched)
  • kprobe:动态插桩任意函数,抓寄存器/参数,perf/ftrace 底层
  • eBPF:现代神器,沙箱程序运行时观测,bpftrace 几行脚本,bcc 工具集(execsnoop/biolatency…)
  • lockdep:CONFIG_LOCKDEP 自动检测死锁(AB-BA/持锁睡/自递归),开发必开
  • kgdb/kdb:内核 gdb 远程调试,和你裸机 gdb 几乎一样
  • sysrq:魔术键紧急调试(t 栈/m 内存/c crash)
  • /proc /sys debugfs:状态导出
  • 网络工具:tcpdump/ss/ethtool/dropwatch;IO:iostat/blktrace;内存:slabtop/kmemleak
  • 方法论:现象→定位→深入→验证;开发开 DEBUG 配置,生产关

速查表

想干啥用什么
看内核日志dmesg / dmesg -w
打印pr_err/pr_info/dev_info
改日志级别echo N > /proc/sys/kernel/printk
死机定位oops + riscv64-…-addr2line -e vmlinux ADDR
反汇编riscv64-…-objdump -d vmlinux | grep -A 20 func
跟踪函数echo function > current_tracer;echo func > set_ftrace_filter
调用图echo function_graph > current_tracer
跟踪事件echo 1 > events/xxx/enable
性能热点perf record -g ./app;perf report
火焰图perf record -ag + FlameGraph
实时热点perf top
缓存性能perf stat -e cache-misses
动态插桩bpftrace -e ‘kprobe:func {…}’
跟踪 openbpftrace -e ‘tracepoint:syscalls:sys_enter_openat {…}’
死锁检测CONFIG_LOCKDEP;dmesg | grep lockdep
内存越界CONFIG_KASAN
内存泄漏CONFIG_KMEMLEAK / slabtop
远程调试kgdb + gdb vmlinux;target remote
紧急栈echo t > /proc/sysrq-trigger
触发 crashecho c > /proc/sysrq-trigger
看 socketss -tlnp
抓包tcpdump -i eth0
IO 统计iostat -x 1
进程内存cat /proc//maps;pmap PID
调试符号CONFIG_DEBUG_INFO=y

Linux 内核专题 16 篇全部完成!
从 01 心智模型到 16 调试性能,覆盖 Linux 内核全部核心模块。每篇都用"双对照法"(Linux vs FreeRTOS / Linux vs RISC-V bare-metal)对接已有知识。** MCU/RTOS/RISC-V 经验是加速器,不是包袱**。回到 链接: link看全图,按需回查。


💡技术之路漫漫,分享是为了更好地交流。如果本文的内容对你有启发,希望能得到你的 点赞 👍 和 收藏 ⭐。

如果你在调试过程中遇到了其他问题,欢迎在 评论区 💬 留言,我们一起探讨。也欢迎 关注 👀 我,一起交流底层开发的那些事儿。


【Linux内核】设备驱动之块设备介绍 Linux块设备驱动是操作系统与硬件设备之间的桥梁,负责管理块设备的读写操作。块设备通常指硬盘、SSD等以固定大小的块为单位进行数据存储的设备。块设备驱动的核心任务是将文件系统的请求转换为硬件设备的操作指令,并处理设备的中断和错误。Linux块设备驱动是操作系统与硬件设备之间的关键组件,负责管理块设备的读写操作。本文详细介绍了块设备驱动的基本结构、初始化过程、请求处理函数、读写操作、错误处理、卸载过程、性能优化、调试方法和实例。 阅读详情

相关推荐

手把手教你学 AI芯片 SOC软件开发专栏简介

在AI芯片(如NPU、GPU加速器)爆发式增长的今天,软件栈开发已成为AI应用落地的核心瓶颈。无论是模型推理加速、低延迟部署,还是能效优化,都依赖于对芯片底层软件的深度掌握。然而,许多开发者困于“只会调用API,不懂驱动实现”的困境,导致性能瓶颈难以突破。本专栏《手把手教你学 AI芯片 SOC软件开发》专为AI工程师、嵌入式开发者及系统架构师打造,从零基础切入,系统拆解AI芯片SOC(System on Chip)的完整软件栈,覆盖Runtime(运行时)

MHD0815的博客 172

linux内核源码分析系列文章汇总

进程,驱动、中断、文件系统、优化、网络、内存专题

7858

《爬虫和逆向教程》 - 专栏介绍和目录

本专栏为爬虫初学者和进阶开发者量身定制的爬虫和逆向学习园地。为你提供全面而深入的爬虫和逆向技术指导,从入门到精通,从基础理论到高级实战,助你在数据的海洋中畅游,挖掘出有价值的信息。通过本专栏的学习,你将具备独立开发和优化爬虫程序的能力,及逆向分析能力和项目开发能力,成为爬虫领域的佼佼者。

数据知道的博客 2万+

【linux内核专栏01】Linux 内核心智模型与设计哲学

Linux内核是宏内核设计,强调性能与生态,通过“一切皆文件”统一资源抽象,用VFS实现机制;坚持“机制与策略分离”,内核只提供能力,策略交由用户态控制;依托arch抽象层实现跨架构移植。与FreeRTOS(无内核、策略固化)和RISC-V裸机(无抽象层)本质不同:前者是运行在S态的庞大系统,后者是用户态程序或直接操作硬件。理解这三层哲学——宏观结构、抽象范式、分层思想——是掌握内核的灵魂。

peter_pan_study的博客 539

Windows10下MATLAB2017a安装与破解实战:手把手教你搞定双镜像加载

本文详细介绍了在Windows 10系统下安装和破解MATLAB 2017a的完整步骤,包括双镜像加载、许可证配置及常见问题解决方案。通过手把手教程,帮助用户顺利完成安装并优化性能,特别适合工程计算领域的初学者和专业人士。

weixin_29053383的博客 419

Cox构建预测模型(5):如何用R语言绘制校准曲线(附全套代码)

这篇文献通过绘制两个模型的DCA曲线来评估模型的临床决策实际需求,一个是列线图模型,包括纳入列线图的全部变量,一个是TNM模型,只纳入TNM分期3个变量。A图是训练集1年、3年、5年患者的总生存期的DCA曲线;B图是训练集1年、3年、5年患者的总生存期的DCA曲线,红色线条代表列线图模型(包括构建模型的10个变量),黄色线条代表TNM模型(仅纳入TNM分期3个变量),两个模型对比,在绘制校准图之前,必须要完成数据的导入、拆分数据集的工作、预测因子的筛选,校准图的绘制是分别在训练集与验证集独立进行的。

qq_37610365的博客 1360

【Linux 内核专栏 00】总目录

本文面向有MCU/RTOS经验的嵌入式工程师,提供从裸机到Linux内核开发的“对齐骨架”。通过对照FreeRTOS等系统中的任务、调度、中断等概念,揭示Linux如何将这些机制“放大”为多进程、公平调度、“一切皆文件”及框架化驱动。重点解析内核启动、进程调度、内存管理、中断下半部与系统调用等核心模块,强调以已有知识为锚点,用“对照法”突破认知鸿沟,实现高效进阶。

peter_pan_study的博客 239

工程师必看:如何用MINITAB快速计算传感器寿命(附详细步骤)

本文为工程师提供了使用MINITAB软件快速计算传感器寿命的详细实战指南。文章重点阐述了如何通过数据预处理、回归分析拟合阿伦尼斯模型,并最终预测平均寿命与置信区间,帮助工程师高效处理加速寿命试验数据,提升可靠性分析工作的准确性与效率。

weixin_29296241的博客 248

【linux内核专栏 03】进程管理与调度

对于有过轻量级实时操作系统,如FreeRTOS TCB 到 port 层经验的工程师,本篇把"Linux 进程"对你 FreeRTOS 任务的**增量**讲清:task_struct 比 TCB 胖十倍(含 mm/fs/files/signals)、调度从"优先级抢占"跳到"CFS 公平 + EEVDF"、上下文切换从"切栈"跳到"切地址空间 + 切栈 + 切 fs/files"。读完能写内核线程、能调调度问题、能讲清 CFS vs FreeRTOS 优先级调度的本质差异。

peter_pan_study的博客 808

手把手教你用芯驰X9HP驱动MAX96755/MAX96752点亮智能座舱仪表屏(附完整寄存器配置表)

本文详细介绍了如何使用芯驰X9HP驱动MAX96755/MAX96752实现智能座舱仪表屏的完整开发流程,包括硬件架构解析、关键寄存器配置、Linux BSP集成及调试技巧。通过实战指南和完整寄存器配置表,帮助开发者快速掌握驱动开发核心技术,提升智能座舱系统的显示性能与稳定性。

weixin_30879169的博客 526

点云语义分割:使用Cylinder3D训练SemanticKITTI数据集

将该路径修改到config/semanticktti.yaml文件中的data_path节点下。下载semanticKITTI数据集的点云数据和标签,解压到一起。系统:Ubuntu18。

zhaoguanhua的博客 2600

【linux内核专栏 05】中断与下半部

本文系统解析Linux中断架构,对比RISC-V裸机与FreeRTOS,突出Linux强制“顶半部+下半部”分离的核心机制。通过irq_domain虚拟化、virq/hwirq映射、中断控制器驱动(如PLIC)及设备树配置,详解中断处理四阶段:异常入口→通用处理→顶半部(不可睡眠)→下半部(softirq/workqueue)。重点掌握中断分层设计原理与实战技巧,助力驱动开发与故障排查。

peter_pan_study的博客 526

PCL 八叉树的使用

八叉树(Octree)是一种空间划分的数据结构,广泛应用于三维点云的处理和分析。八叉树通过将空间递归地划分为八个子区域,可以有效地组织和索引三维点数据,提升点云的查询、降采样和配准等操作的效率。

纵马踏花向自由 1659

【linux内核专栏 09】内核模块与 kbuild

本文系统解析Linux内核模块(LKM)机制,涵盖模块本质、生命周期、Makefile编译、加载卸载流程及符号导出。通过实战代码详解insmod/rmmod原理,强调模块化开发在BSP中的核心价值:动态加载、快速迭代、资源可控。内容涵盖Kbuild系统、符号解析、依赖管理与module_exit清理规范,助开发者掌握从编写到部署的完整链路,实现高效驱动开发。

peter_pan_study的博客 217

深入解析逆时偏移(RTM)算法及其在C++中的实现

逆时偏移(Reverse Time Migration, RTM)是一种高级地震成像技术,广泛应用于地震勘探中。RTM通过逆时传播波场来构建地震子波,能够提供更高分辨率和更精确的地下构造图像。本文将详细介绍RTM的基本原理,并通过C++代码示例,深入解析如何实现和优化RTM算法。希望这篇文章能够为地球物理学家和C++开发者提供有价值的参考。

qq_38334677的博客 1529

用Python绘制DCA曲线详解及示例代码

在这篇文章中,我们将详细解释如何使用Python绘制DCA曲线,并提供示例代码。通过使用上述的示例代码和解释,你可以自己尝试不同的投资金额、期数和增长率来绘制自定义的DCA曲线。通过运行上述代码,我们将得到一个绘制了DCA曲线的图表。该图表将显示出DCA投资策略在给定投资金额、投资期数和增长率下的投资价值随时间的变化情况。在上述代码中,我们使用一个循环来计算每个投资期的DCA曲线值。现在,我们可以使用上述函数来计算DCA曲线的值,并将其绘制成图表。最后,我们返回计算得到的DCA曲线值列表。

TechPr的博客 1410

【Linux内核专栏 14】网络协议栈

本篇讲清数据通路(收发路径)、sk_buff、net_device、NAPI、netfilter。读完能理解 `ping`/`curl` 的内核路径、能看懂网卡驱动收发框架。

peter_pan_study的博客 731

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Linux内核6.x版本构建与优化全指南

Linux内核作为操作系统的核心组件,其构建过程涉及工具链配置、源码编译和系统集成等关键技术环节。通过合理配置构建环境,开发者可以针对不同硬件架构进行内核优化,显著提升系统性能。在嵌入式开发和云计算场景中,内核定制尤为重要,需要掌握交叉编译和模块化构建等进阶技巧。本文以Linux 6.x版本为例,详细解析从环境准备到编译优化的全流程,特别介绍了如何利用多核并行编译加速构建过程,以及通过GRUB引导加载器管理多内核版本。针对常见问题如头文件缺失、模块签名错误等提供了实用解决方案,并分享了性能调优和安全加固的生

weixin_33744854的博客 403

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【linux内核专栏 04】内存管理

**本篇定位**:你最大的认知跳变——从"一个物理堆"跳到"每进程虚拟地址空间 + page cache + 多层分配器"。本篇把这些在 Linux 里怎么用讲透:mm_struct/buddy/slab/缺页/mmap/page cache/kmalloc vs vmalloc/DMA 映射。读完能选对 kmalloc/vmalloc、能调 OOM、能配 DMA buffer、能讲清 page cache 为什么让 Linux 又快又省。

peter_pan_study的博客 458

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Linux内核风暴:从“C语言殿堂”到“Rust与AI新时代”的惊世进化

Linux内核五年变革:从C语言到Rust+AI的新纪元 过去五年,Linux内核经历了重大技术转型:Rust语言正式引入(6.1版本)、实时性补丁合并(6.6)、CVE漏洞暴增13倍(2024年达3529个)、XZ后门事件引发供应链安全革命。 这场静默革命正在重塑从嵌入式设备到云计算的数字基础设施,标志着Linux进入安全与性能并重的新时代。

道阻其长,未来可期。笔耕不辍,行则将至! 1617

Oracle Linux 9.7 正式发布!内核、虚拟化、工具链全面升级,性能飚升、更安全、更稳定了

2025 年 12 月 1 日 Oracle Linux 9.7 正式发布,作为与 Red Hat Enterprise Linux(RHEL)完全二进制兼容的企业级操作系统,该版本在性能、安全性和开发工具链方面进行了全面升级。软重启,后量子加密,工具链、容器与存储全线升级,打造更安全、稳定的企业级 Linux。更快、更强、更流畅的现代化开源替代利器来了。性能更强、更灵活、易用的开源替代利器来了。全新一代性能更强、更安全、更稳定的操作系统来了。性能、安全、容器与虚拟化全面升级,更高效、更稳定了。

民工哥的博客 1307

【Linux网络】深入理解Linux IO多路复用:select服务器完善、内核原理与poll实战

上一篇我们从零搭建了 select 服务器的基础框架,实现了新连接的接受与托管。但当时的代码还比较粗糙,所有逻辑都挤在一个处理函数里,也没有处理客户端数据读写与连接关闭。这一篇我们先把 select 服务器完善成一个完整的 echo 服务器,引出事件编程的核心思想;然后深入内核层面,拆解 select 到底是怎么实现「同时等待多个 fd」的;最后我们再认识 poll —— 作为 select 的改进版,它解决了什么问题,又留下了什么遗憾,并亲手把 select 服务器改写成 poll 版本。

会当凌绝顶,一览众山小 4631

构建Linux内核心智模型:从代码阅读到设计哲学理解

心智模型是操作系统学习的核心能力,指代一套能预测系统行为的最小假设集合。它源于对内核设计原理的深度把握,而非碎片化代码记忆。Linux内核的设计哲学围绕稳定性、可维护性、性能与可移植性四大锚点动态权衡,驱动着CFS调度、VFS抽象、内存分层等关键机制的演进。理解这些原理,才能穿透`/proc`伪文件、`mmap`限制、OOM触发逻辑等表象,实现从参数调整到故障归因、从模块定制到架构演化的技术跃迁。本文聚焦Linux内核心智模型与设计哲学,提供可验证、可推演、可落地的系统性认知框架。

weixin_31364787的博客 248

【Linux内核专栏 11】驱动框架:platform / char / misc / 设备树

讲透 platform 驱动(probe/remove)、字符设备(cdev/file_operations)、misc 简化框架、设备树 DTS 匹配。读完能独立写一个完整的字符设备驱动:设备树描述 → platform 驱动匹配 → probe 映射寄存器/注册中断 → file_operations → 用户态 open/read/write/ioctl。

peter_pan_study的博客 642

Android14之Binder调试(二百一十一)

本篇目的:基于Android14源码,如何对Binder进行调试Binder,全称为Android Binder IPC(Inter-Process Communication),是Android系统中用于进程间通信的一种机制。它是一种基于C/S(客户端/服务器)模式的通信方式,主要由客户端、服务端和Binder驱动三个部分组成。Binder机制在Android系统中具有重要的意义,因为它使得不同的进程可以安全、高效地共享数据和资源,从而实现了应用程序之间的协作和通信。

Android系统攻城狮 2016

Linux性能优化从入门到实战: CPU篇:硬中断、软中断

qccz123456 2018-12-24 23:04:08 1302 收藏 4 分类专栏: Linux性能优化 版权 软中断(softirq)会导致CPU 使用率升高 中断是系统用来响应硬件设备请求的一种机制,它会打断进程的正常调度和执行,然后调用内核中的中断处理程序来响应设备的请求。中断其实是一种异步的事件处理机制,可以提高系统的并发处理能力。由于中断处理程序会打断其他进程的运行,所以,为了减少对正常进程运行调度的影响,中断处理程序就需要尽可能快地运行。并且当CPU执行在中断处理函数中时,不会响应同时发

u012403024的博客 1327
上一篇: 【Linux内核专栏 15】电源管理
下一篇: 【串口技术系列文档 00】总目录
硅基手札
博客等级 码龄8年 86粉丝 150原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

硅基手札

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值