虽然工作中一直在写用户层代码,但也凭兴趣看下kernel代码,提高自己,毕竟懂得越多,对工作和业务了解、架构设计就越有帮助,而且很多东西看到最后都是借助kernel实现,所以掌握kernel也是非常必要。从业以来也陆陆续续看过,解决一些疑问,但没有记录,也没想的特别明白,现在有时间认真思考下,本文相当于十万个为什么,记录我对linux内核和驱动的一些学习。
内核概述linux内核分为进程管理系统 、 内存管理系统 、 i/o管理系统 和文件管理系统四个子系统。
linux内核主要由哪几个部分组成:
Linux内核的主要模块分以下几个部分:存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信,系统的初始化(引导)、系统调用
文件一切皆文件是linux的高级抽象,Linux中“一切皆文件”是什么意思? - 知乎
之前面试的时候遇到过read的流程,当时自己的回答可能就是说系统调用陷入内核态啥的,没有描述更多的信息,那详细的读写流程是怎样的 从内核文件系统看文件读写过程 - 胡潇 - 博客园
工作中可能出现多个线程同时读写相同文件的问题,多个线程同时读没有问题,如果存在写,那就可能存在问题了。
系统调用系统调用是通过软件中断的方式进入内核。Linux 系统调用和中断(查漏补缺版)_A.iguodala的博客-CSDN博客_linux 系统调用 软中断
虚拟文件系统 inode模块inode模块,管理一个具体的文件,是文件的唯一标识,一个文件对应一个inode。通过inode可以方便的找到文件在磁盘扇区的位置
struct file结构体已经打开的文件对象由open系统调用在内核中创建,也叫文件句柄。打开文件列表模块中包含一个列表,每个列表表项是一个结构体struct file,结构体中的信息用来表示打开的一个文件的各种状态参数
进程 vs 文件列表 vs Inode多个进程可以同时指向一个打开文件对象(文件列表表项),例如父进程和子进程间共享文件对象;一个进程可以多次打开一个文件,生成不同的文件描述符,每个文件描述符指向不同的文件列表表项。但是由于是同一个文件,inode唯一,所以这些文件列表表项都指向同一个inode。通过这样的方法实现文件共享(共享同一个磁盘文件)。
内存 内存布局Linux进程地址空间与进程内存布局详解 - 哔哩哔哩
从大的方面来说,首先要有内核空间和用户空间的概念,它们都是虚拟地址,用户代码不能访问内核空间地址,但是内核是直接能访问用户空间地址的(但实际也不会直接访问,而是通过copy_from_user和copy_to_user接口,增加内存地址校验)。所有进程共享内核虚拟地址空间,每个进程有独立的用户虚拟地址空间,同一个线程组的用户线程共享用户虚拟地址空间。Linux内核机制总结内存管理之虚拟地址空间布局(九)_张衡天的博客-CSDN博客_内核虚拟地址空间
malloc、vmalloc、kmalloc用户程序使用的malloc是将物理地址映射到用户空间的虚拟地址,内核程序使用的vmalloc、kmalloc是将物理地址映射到内核空间的虚拟地址
世上最强最全Linux 内存总结(用户空间:malloc、内核空间:vmalloc kmalloc slab buddy )_小卷怡情的博客-CSDN博客_malloc和kmalloc的原理不同
mmap内核和用户空间交互需要相互拷贝,mmap是将物理地址同时映射到内核和用户空间,实现零拷贝深入理解mmap 0拷贝技术_内核
dma-buf这篇文章非常经典,介绍了dma buffer如何被CPU内核空间、CPU用户空间、DMA硬件使用、通过和file绑定实现进程间共享dma-buf 由浅入深(一) —— 最简单的 dma-buf 驱动程序_何小龙的博客-CSDN博客_dmabuf
ION buffer高通使用ION buffer实现dma buffer以高通camera 申请ion内存看dma-buf_checode的博客-CSDN博客
SMMUSMMU全称System Memory Management Unit,其实SMMU和MMU具有同样的作用,区别是供使用DMA的外设使用,同样提供页表转换工作,外设可通过页表转换访问物理地址,达到devices设备和进程一样使用虚拟地址4.8.1 SMMU介绍(1)——背景&应用 - 知乎
SMMU本质上就是一个MMU设备,它的内存转换逻辑与CPU的MMU采用相同的逻辑,都允许将物理上非连续的页虚拟为连续的内存页。SMMU和IOMMU可以交替使用。
关于MMU有个疑问就是,它是将VA->PA,那VA是怎么来的?应该就是虚拟内存管理技术生成的。
高通camera SMMU qcom camera smmu学习(1)_checode的博客-CSDN博客_camera smmu
这里面提到的IOVA是通过 gen_pool_alloc分配出来的,然后将IOVA和phys address传给SMMU建立起映射关系,那后面设备就可以使用IOVA了



