Linux并发与竞争
Linux并发访问共享资源会导致竞争问题,主要成因包括多线程、中断、抢占及多核并发访问。内核提供原子操作、自旋锁、互斥锁等同步机制,其中原子操作通过atomic_t和atomic64_t结构体实现整形变量的不可分割读写,并提供init、read、set、add、sub、inc、dec等API来避免竞争,确保数据一致性。
Linux字符设备基础
Linux字符设备驱动的基础包括设备号的管理,其中主设备号标识设备类型,次设备号区分同一驱动下的多个设备实例。设备号由dev_t类型表示,高12位为主设备号,低20位为次设备号,通过MAJOR、MINOR、MKDEV等宏进行操作。设备号可通过register_chrdev_region静态申请或alloc_chrdev_region动态申请,使用完毕后需用unregister_chrdev_reg
Linux驱动加载逻辑
Linux 驱动通过 module_init 宏注册,该宏利用编译器属性将初始化函数指针放入内核专属的 .initcall 段。内建驱动在启动时按优先级依次执行,不能卸载;可加载模块则通过内核模块加载器处理。内核自定义链接器脚本管理段布局,在支持 PREL32 的架构上使用 PC 相对 32 位偏移量存储地址。
Linux驱动框架
Linux 驱动框架将存储器和外设分为字符设备驱动、块设备驱动和网络设备驱动三大基础类别。内核源码目录分层组织,驱动代码位于 drivers 目录。最简单的驱动结构包含必备的头文件、加载和卸载函数、许可证声明,以及可选的模块参数和版本信息;驱动通过 module_init 和 module_exit 宏注册入口和出口函数,加载成功需 init 函数返回非负值。
Linux系统应用编程
Linux系统应用编程涉及man手册的安装与使用,其分类包括用户命令、系统调用、C库函数等9个章节;文件I/O操作通过open、close、read等系统调用实现,其中open函数支持多种标志(如O_CREAT、O_RDONLY)控制文件打开模式,并返回文件描述符。
Makefile
Makefile是一种用于管理程序构建的工具,基于文件变化决定哪些部分需要重新编译,核心语法由规则(目标、依赖、命令)组成,并支持伪目标、自动变量(如$@)、通配符匹配、模式规则及递归调用等特性,广泛应用于C/C++等编译型语言项目。
GCC内嵌汇编
GCC内嵌汇编分为基础与扩展两种模式,扩展模式通过输出部、输入部和损坏部实现与C变量的交互,支持volatile、inline、goto等修饰符,可用于优化代码、访问特殊指令或实现内存屏障。文章详细介绍了约束修饰符、参数引用方式,并给出了memcpy、memset、读写系统寄存器等实验示例,以及宏结合和goto跳转的高级用法。
GNU LD
GNU Linker (ld) 使用AT&T链接脚本语言,通过SECTIONS命令将输入段映射到输出段,设置VMA(虚拟地址)和LMA(加载地址)。链接脚本中的符号仅定义地址标签而非变量值,访问时需使用`char[]`类型引用地址。实验演示了如何打印段内存布局及处理加载地址与运行地址不同的场景,区分了链接地址、装载地址和运行地址。
GNU AS
GNU AS 是 GNU 汇编器,采用 AT&T 语法,常用于 gcc。它支持标号、注释、符号声明(全局与局部)、对齐伪指令(.align)、数据定义(.byte、.hword、.word、.quad、.float、.double)、字符串定义(.ascii、.asciz)、重复块(.rept/.endr)、常量定义(.equ/.set)、函数相关伪操作(.global、.include、条件编译
GDB
GDB调试技术涵盖启动配置、断点设置、源码查看、日志保存、core dump生成与分析、多线程/多进程/远程调试、内存问题检查等核心功能。编译时需加 -g 参数以支持源码级调试,支持tui模式、emacs集成,可设置条件断点、运行Shell命令、重定向输入输出、指定工作目录和环境变量,同时提供gcore生成进程转储文件及调试正在运行程序的方法。



