嵌入式这个方向这几年也是越来越火,物联网和嵌入式都可以按软件和硬件来分;范围很广,所以也就有很多细分的方向。物联网是一个行业大类,嵌入式是一个技术大类,它们的共同特性就是软硬件都要学习理解。
嵌入式的话,主要做一些单片机软件开发,计算机科学与技术和电子信息类专业的同学在学校肯定都玩过那东西,还有Linux软件开发,驱动开发,嵌入式系统软件开发,相对而言更接近底层的开发,所以说用到的语言肯定是C语言。除了软件学习之外,还有硬件方面的,要看得懂时序图、电路图,汇编语言也要会,因为在调试的时候可能会用到C语言的反汇编。FPGA、DSP软件开发 这类相对上层一点硬件专业中属于偏软,还有一些其他的工业控制软件开发。相比于其它软件开发,嵌入式就业的方向更广、更深,就业机会和入职待遇比普通软件工程师好。
内存管理实战
- 1、自旋锁项目实战分析
- 2、RCU项目实战分析
- 3、分配物理页实战分析
- 4、vmalloc案例实战分析
- 5、kmalloc案例实战分析
- 6、kzalloc&kcallolc案例实战分析
- 7、创建slab缓存案例实战分析
要转向内核开发,嵌入式开发人员需要掌握以下知识
- 1. C语言编程:C语言是内核开发的主要编程语言,需要熟练掌握其语法和编程技巧。
- 2. 操作系统原理:需要了解操作系统的基本原理,包括进程管理、内存管理、文件系统等。
- 3. Linux内核:需要深入了解Linux内核的架构、模块、驱动程序等。
- 4. 设备驱动开发:需要掌握设备驱动的开发流程和技术,包括字符设备、块设备、网络设备等。
- 5. 调试技能:需要掌握调试技能,包括使用调试工具、分析内核崩溃等。
- 6. 硬件知识:需要了解硬件的基本原理和操作,包括处理器、内存、外设等。
- 7. 开源社区:需要了解开源社区的文化和开发流程,以便更好地参与内核开发。
还不熟悉的朋友,这里可以先领取一份Linux内核驱动开发新手学习资料包(入坑不亏):
这里给大家推荐零声教育全网独家的【Linux内核源码分析与项目实战】课程体系,通过原理技术+源码分析+案例分析+项目实战,全面解析计算机底层原理,20项目案例,2W+行手写代码,全面解析6个内核底层原理开发技术:
1、进程管理专题
(一)操作系统与汇编基础
- Linux操作系统进程分析
- 计算机基础技术
- 进程原理
- Linux特性与内核版本
- 进程特征与调度算法
- 死锁产生必要条件
- 进程状态及转换
- 进程调度策略与调度依据
- 存储器结构与分区存储管理
- 主存储器结构及技术指标
- 分配策略与分区回收
- 页表与交换技术
- 物理内存与虚拟内存
- 段式存储管理与页式存储管理
- 文件管理基础架构
- x86_ ARM处理器架构
- x86架构整体部件分析
- ARM处理器架构分析
- 64位通用寄存器结构
- 汇编基础与寻址方式
- SMP架构与NUMA架构
- ARM Cortex-A9处理器架构
- ARM常用指令系统详解
(二)进程管理基础
- Linux内核源码组织结构分析
- Linux内核(五大子系统关系)
- 内核源码目录结构详解
- 如何快速掌握阅读内核源码方法与技巧
- 进程原理与生命周期及系统调用
- 写时复制原理
- 进程内存布局
- 进程堆栈管理
- 系统调用实现
- 调度器及CFS调度器
- 实时调度类及SMP和NUMA
- task_ struct数据结构分析
- 进程内核do_ fork() /kernel_ clone()函数分析
- RCU机制及内存优化屏障
- 内核内存布局和堆管理
- 实战操作:内核数据结构(链表和红黑树)
(三)进程调度模块
- 进程调度策略
- SCHED_ DEADLINE
- SCHED_ FIFO
- SCHED_ RR
- SCHED_ NORMAL
- 四种进程优先级
- 调度优先级
- 静态优先级
- 正常优先级
- 实时优先级
- 五大调度类解析
- stop_ sched_ class
- idle_ shced_ class
- dI_ sched_ class
- rt_ sched_ class
- cfs_ sched_ class
- 多核调度分析
- 调度组与调度域
- 负载计算与均衡算法
- SMP调度类处理器负载均衡
- 实战操作:进程优先级与调度策略
- 实战操作: QEMU调试L inux内核
- 实战操作:动手编译自己Linux内核
- 实战操作:进程间通信实现
2、内存管理专题
(一)内存管理基础部分
- 虚拟地址空间布局架构
- 内存管理架构
- 用户虚拟地址空间布局
- 内核地址空间布局
- SMP/NUMA模型组织
- 物理内存组织结构与模型
- 系统调用sys_ mmap/sys_ munmap
- 物理内存组织三级结构
- 页表/页表缓存原理
- 处理器缓存机制及SMP缓存一致性
- 内存分配器(bootmem/ memb lock)
- bootmem分配器原理
- memblock分配器原理及分配流程
- 伙伴系统算法与实现
- 伙伴系统原理机制
- 分配页和释放页实现
- 块分配器(SIab/S1ub/Slob)原理实现
- 内存映射
- 数据结构分析
- 系统调用实现
- 创建/删除内存映射
- 实战操作:SIab块分配器实现
- 实战操作:进程地址空间在内核(VMA实现)
(二)内存管理进阶部分
- brk/kmalloc/vmalloc(系统调用分析)
- 不连续内存分配器原理
- 页表缓存(TLB)与巨型页
- TLB表项格式及管理
- ASID原理/VMID原理
- 处理器对巨型页的支持
- 标准巨型页原理及查看
- LRU算法与反向映射
- 缺页异常分析
- 写时复制缺页异常
- do_ page_ fault函数分析
- 文件映射缺页中断
- 匿名页面缺页异常
- 内存反碎片技术
- 内存碎片整理算法
- 虚拟可移动区域技术原理
- 内存检测与死锁检测
- 内核调优参数
- /proc/sys/kernel/
- /proc/sys/ vm/
- /proc/sys/fs/
- 内存屏障与内核互斥原理
- 编译器屏障
- 处理器屏障
- ARM64处理器内存屏障分析
- 内存与Kasan工具分析
- 五大常见内存访问错误
- Kasan内核检测工具应用
- 页回收原理机制
- 发起页回收
- 计算扫描页数
- 收缩活动页链表
- 回收不活动页
- 页交换与回收slab缓存
- 缓存着色
- 内存缓存数据结构
- 空闲对象链表及着色
- 内核调试方法printk/oops分析
- 实战操作:内存池原理及实现
- 实战操作:perf性能分析工具
- perf原理机制与安装配置
- perf采集数据命令29种工具应用
- perf采集数据至火焰图分析
3、网络协议栈专题
(一)网络基础架构
- sk_ _buff与net_ device详解.
- 套接字缓冲区管理数据
- 从套接字缓冲区获取TCP首部
- sk_ buff及net_ device结构分析
- TCP/UDP/ICMP协议栈分析
- 套接字分析
- 发送与接收UDP数据包分析
- 发送与接收TCP数据包分析
- 发送/接收1CMP/IPv4/IPv6消息.
- 传输层分析
- 流控制传输协议(SCTP)
- 数据报拥塞控制协议(DCCP)
- IPsec(互联网安全协议)
- IPsec基础知识
- XFRM框架/策略/状态
- 传输模式/隧道模式/IPsec高可靠性
- IPv4策略路由选择
- FIB信息_缓存_下一跳
- 生成及接收1CMPv4重定向消息
- 无线子系统分析
- MAC帧结构分析
- 扫描/身份验证/关联
- mac80211接收与传输实现
- 高吞吐量(802.11n)
- 网状网络(802.11s)
- IPv4重定向消息/FIB表
- Netfilter内核防火墙报文处理
- Netfilter框架简介
- 数据包选择Iptables
- 数据包过滤
- NAT(网络地址转换)
- 连接跟踪与数据包操纵
- 十Iptables基础/表和链及过滤规则
- Netfilter5种挂接点详解
- 注册Netfi Iter钩子回调函数源码分析
- NAT钩子回调函数分析
- 实战操作:内核NetI ink套接字及实战
- 数据结构设计与API系统调用
- 内核模块与用户应用程序设计
(二)网络协议栈架构
- Linux内核邻接子系统分析
- 创建与释放邻居AP1接口分析.
- ARP协议(IPv4)发送与接收请求分析
- 高级路由选择
- 组播路由选择
- 策略路由选择
- 多路径路由选择
- 接收/发送(IPv4和1Pv6)数据包
- InfiniBand栈的架构
- RDMA(远程直接内存访问)结构
- Inf iniBand组件与编址
- InfiniBand功能与数据包
- NIC数据包接收与发送分析
- NIC实现原理与NIC分类
- NIC数据包发送与接收流程分析
- eBPF原理与实现
- eBPF工作原理详解
- eBPF开发环境搭建
- eBPF如何在内核运行与交互
- 实战操作:epoll内核原理与实现
- 实战操作:内核防火墙iptables实现
- 实战操作:eBPF实践分析
- 进程跟踪
- 内核跟踪
- 性能优化
4、设备驱动专题
(一)设备驱动基础架构
- i/0体系结构
- 系统总线(PC1、 ISA、SCSI、 USB等)
- 与外设交互及控制设备
- 访问设备详解
- 内核块设备详解
- 块设备1/0操作集合及源码分析
- 通用磁盘及分区源码分析
- Linux设备模型
- 深度剖析LDM
- LDM数据结构分析
- 设备驱动程序原理与实现
- kobject结构分析
- kobj_ type/内核对象集合
- 设备模型和sysfs
- sysfs文件及属性
- 轮询sysfs属性文件
- 资源分配
- 资源管理
- i/0内存分析
- i/0端口 分析
- 字符设备操作
- 主设备与次设备
- 打开设备文件
- 分配与注册字符设备
- 写文件操作实现
- open/release方法
- read/write
- iiseek/poll方法
- 填充file_ operations结 构体
- 实战操作:USB设备驱动实现
- USB体系架构设计
- 驱动程序数据结构结构
- make及USB设备驱动测试
- 实战操作:PC1设备驱动实现
- 实战操作:TTY设备驱动实现
(二)NIC网络接口卡
- 数据结构
- 套接字缓冲区
- 网络设备接口
- 缓冲区管理与并发控制
- 网络吞吐量
- 协议性能
- 驱动程序性能
- 实战操作:NIC网卡驱动架构实现
- NIC网卡驱动的recv与sk_ buff
- NIC网卡open与stop的实现
- NIC编译与用户态协议栈
5、文件系统专题
(一)虚拟文件系统
- 文件系统类型与文件模型研究
- 磁盘文件系统(DF)
- 网络文件系统(NF)
- inode
- 链接
- API编程接口
- VFS数据结构
- 超级块(super_ block)
- 挂载描述符 (mount结构体)
- 索引结点(inode结构体)
- 目录项缓存(dentry结构体)
(二)文件系统调用
- 打开/关闭文件
- 创建/删除文件
- 读/写文件实现
- 文件回写技术原理/接口实现
(三)挂载文件系统
- 系统调用mount处理流程
- 绑定挂载/挂载命名空间
- 挂载/注册rootfs文件系统
- 无持久文件系统
- proc文件系统
- proc数据结构
- 初始化及装载proc
- 管理proc数据项
- 数据读写实现
- 系统控制机制
- sysfs文件系统
- sysfs数据结构
- 装载文件系统
- 文件和目录操作
- 向sysfs添加数据内容
- 实战操作:procfs文件系统实现
- 实战操作: sysfs文件系统实现
(四)磁盘文件系统
- Ext2文件系统
- Ext2物理结构
- Ext2数据结构分析
- Ext2文件系统操作
- Ext4_ 日志JBD2
- Ext4文件系统特性
- Ext4文件系统数据结构
- Ext4_日志JBD2
(五)数据同步
- 内核定时器
- 原子操作与屏障
- 自旋锁机制
- 自旋锁的实现与变体
- spin_ lock()/raw_ spin_ lock() 函数分析
- 互斥锁
- mutex数据结构分析
- 互斥锁的快速与慢速通道
- 乐观自旋锁等待机制
- mutex_ unlock() 函数分析
- 读写锁与RCU
- 实战操作:同步管理RCU实现
6、内核组件专题
(一)内核活动组件
- 中断处理流程及IRQ
- irq_ _desc数据结构分析
- 开启_禁止中断
- 软硬中断分析
- 中断控制器及域详解
- tasklet_等待队列工作队列
- 审计规则及数据结构分析
(二)开源社区
- 如何参与开源社区
- 如何提交Linux内核补丁
- 管理员Bugzilla参数配置及如何管理用户
- 在Gitee创建一个开源项目
以上是系统学习课程内容,需要系统学习请扫码添加秋香老师VX:2207032995(备注911)领取专属大额优惠券。
7、内核难点与学习方法
- 1、知识点多,关系错综复杂。
- 2、每一个知识点的难度都很难。
- 3、代码量很大,内核有几百万行。
- 4、操作系统相关的知识。
- 5、程序结构上的很多规范要求
8、内核适宜的工程师人群
- Linux 内核优化、内存管理 ,内核开发岗位、定制化自己OS
- 深入系统内核研究、网络安全逆向分析
- 提升自己能力,为了更好做应用层开发提供核心依据
- 跳槽面试大厂(腾讯、华为、中兴、中微、中芯等等)
- 从事业务开发多年,对底层原理理解不够深入的在职工程师
- 从事嵌入式方向开发,想转入内核开发的在职工程师
- 从事Qt/MFC等桌面开发的,薪资多年涨幅不大的在职工程师
- 从事非开发岗位(算法岗,运维岗,测试岗),想转内核开发岗位的在职工程师
至于学习效果怎么样?👇
精品文章推荐阅读: