![](https://img-blog.csdnimg.cn/20190918140012416.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Linux内幕
文章平均质量分 75
Linux实现原理
Victor Fung
主要涉及分布式中间件、分布式存储、数据库、linux内核、编译器。。。
展开
-
Linux虚拟化之VFIO框架
对group文件调用ioctl执行VFIO_GROUP_GET_DEVICE_FD命令,将调用vfio_group_get_device_fd从struct vfio_group.device_list链表中查询设备,并创建一个文件对象,将struct vfio_device赋值给file->private_data;目前有三种iommu实现,vfio_noiommu_ops、tce_iommu_driver_ops和vfio_iommu_driver_ops_type1。后面以vfio-pci设备为例。原创 2023-11-28 10:46:08 · 1319 阅读 · 0 评论 -
Linux虚拟化之mdev框架
然后再将该设备通过函数mdev_register_device注册到mdev框架中,其回调为struct mdev_parent_ops mdev_fops。在vfio_mdev_init函数中,直接通过mdev_register_driver注册了一个设备驱动vfio_mdev_driver;在mdev_register_driver内部,将vfio_mdev_driver.driver.bus设置为mdev_bus_type。注:mtty_*系列回调实现了pci配置空间、BAR空间的模拟。原创 2023-11-28 10:45:43 · 1508 阅读 · 0 评论 -
Linux图形子系统之dma-buf
dma-buf是linux内核提供的一种机制,用于不同模块实现内存共享。它提供生产者和消费者模式来实现不同模块对内存共享同时,不用关心各个模块的内部实现细节,从而解耦。在drm框架中也集成了dma-buf方式的内存管理。drm通过DRM_IOCTL_PRIME_HANDLE_TO_FD实现将一个gem对象句柄转为dma-buf的fd。其中会调用struct drm_driver的prime_handle_to_fd回调,drm_gem_prime_handle_to_fd函数是prime_handle_to原创 2022-06-21 15:36:57 · 1977 阅读 · 0 评论 -
Linux数据结构之refcount
kref是linux内核用于原子引用计数的数据结构一般在结构体中嵌套struct kref:1.2 初始化在结构体初始化过程对refcount初始化:原创 2022-06-18 16:41:32 · 505 阅读 · 0 评论 -
Linux数据结构之radix-tree
radix-tree在linux文件系统和句柄表使用的一种高效数据结构。它通过类似B+树的原理建立ID与数据指针的映射,并且通过rcu机制提供数据安全性和高效性。注:radix_tree_root也可以嵌套到结构体中1.3 预分配1.4 插入节点1.5 删除节点1.6 替换节点1.7 查询遍历1.8 安全访问安全读安全写1.9 标签操作注:tag必须小于RADIX_TREE_MAX_TAGS...原创 2022-06-16 19:14:33 · 591 阅读 · 0 评论 -
Linux数据结构之rcu
了解rcu前,先引入一个问题:当多个读者在访问一个全局指针的时候,假设一个写者给全局指针设置了一个新的值,同时需要对旧的指针指向的内存进行销毁。这个时候写着在销毁旧指针的时候,读者可能还在访问该全局变量。为了解决这个问题,可以通过加锁,或引用计数方式去实现。前者性能不佳;后者会有环形引用的风险;而RCU机制恰到好处。RCU通过机制将写者销毁旧数据的时机延迟到所有读者结束,它具备如下特点:注:struct的内部字段也可以定义为__rcu注:在rcu_read_lock/rcu_read_unlock之间原创 2022-06-15 19:47:04 · 471 阅读 · 0 评论 -
Linux数据结构之list
链表是Linux使用比较常见的一种数据结构一般在struct中嵌套struct list_head作为数据节点:1.2 初始化头节点头节点也用struct list_head表示。通过LIST_HEAD_INIT初始化头节点:1.3 添加节点list_add/list_add_tail将节点添加到链表节点的后面或前面:1.4 删除节点通过list_del移除节点:1.5 遍历节点通过list_for_each_safe安全遍历节点(遍历过程中,可以移除当前节点):注:在遍历过程中不移除节点原创 2022-06-15 19:48:19 · 219 阅读 · 0 评论 -
Linux数据结构之rbtree
rbtree是linux内核红黑树实现。一般在struct中嵌套struct rb_node作为树节点:1.2 初始化根将struct rb_root赋值为RB_ROOT:1.3 插入节点先通过rb_link_node插入节点,再通过rb_insert_color重新平衡红黑树:1.4 移除节点通过rb_erase移除节点:注:该API会重新平衡红黑树通过rb_entry可将节点转为具体类型:......原创 2022-06-15 19:47:50 · 489 阅读 · 0 评论 -
Linux虚拟化之IOMMU
Linux虚拟化之IOMMU引言1 IOMMU初始化1.1 初始化函数集1.2 初始化流程2 Intel-IOMMU2.1 技术原理2.2 数据结构2.3 核心流程引言DMA操作允许设备直接访问内存,但是也带来了诸多问题:当设备需要大量连续物理内存时,OS未必能满足;当某些设备不能访问高端内存时,必须采用反弹缓冲区搬移,影响性能;在虚拟化环境中,存在多设备访问同一物理内存的冲突;IOMMU与cpu的MMU类似,给设备提供一套虚拟地址空间,设备发出虚拟总线地址空间的访问请求、送到IOMMU单元原创 2022-06-10 12:34:09 · 5503 阅读 · 1 评论 -
Linux图形子系统之vblank事件
Linux图形子系统之vblank事件引言1 使能vblank2 传递vblank引言显示器显示图像数据的过程,一般从左上角,按从左至右、从上至下的方式扫描像素数据。一般每扫描一行,会切换到下一行的左侧,行与行之间的返回过程称为水平消隐;一帧图像扫描完成,要从图像的右下角返回到图像的左上角,开始新一帧图像的扫描,这一时间间隔,叫做垂直消隐,也称场消隐(vblank)。从右下角返回左上角的时间间隔内,可以通知驱动进行下一帧图像的送显,一般硬件进入vblank后(也就是扫描完一帧图像)会通过中断机制触发硬件原创 2022-03-31 20:35:07 · 4126 阅读 · 1 评论 -
Linux图形子系统之DRM渲染框架
Linux图形子系统之DRM渲染框架引言1 渲染框架2 amd实现引言drm对图形渲染抽象出了相关组件,drm核心代码负责管理其渲染流程和同步,驱动和GPU固件负责实现具体命令的生成和执行细节。1 渲染框架2 amd实现...原创 2022-03-31 17:58:20 · 3050 阅读 · 0 评论 -
Linux图形子系统之GEM内存管理
Linux图形子系统之GEM内存管理引言1 创建与映射1.1 创建GEM1.2 映射对象2 内存分配2.1 数据结构2.1.1 内存管理结构2.1.2 内存节点结构2.2 分配算法2.3 常见用法引言drm对内存使用抽象成GEM对象,用户空间通过句柄或文件映射的方式访问。1 创建与映射1.1 创建GEMdrm_mode_create_dumb_ioctl是DRM_IOCTL_MODE_CREATE_DUMB的处理函数,它直接调用了drm_mode_create_dumb函数,该函数通过参数解析和检原创 2022-03-29 16:58:47 · 4751 阅读 · 0 评论 -
Linux图形子系统之setCRTC流程
Linux图形子系统之setCRTC流程引言1 drm_mode_setcrtc2 drm_atomic_helper_set_config3 drm_atomic_helper_commit引言drm通过DRM_IOCTL_MODE_SETCRTC实现最原始的模式设置和送显操作。1 drm_mode_setcrtcdrm_mode_setcrtc是DRM_IOCTL_MODE_SETCRTC的处理函数。其源码如下:int drm_mode_setcrtc(struct drm_device *d原创 2022-03-29 11:03:15 · 2419 阅读 · 1 评论 -
Linux图形子系统之DRM显示框架
Linux图形子系统之DRM显示框架引言1 概述1.1 connector引言与其他子系统一样,linux抽象出了DRM作为其图形子系统。其中包括显示和渲染,本文主要讲解渲染部分。1 概述如图所属,drm将显示部分抽象出了framebuffer、plane、crtc、encoder、connector五部分。在同一时刻,一个framebuffer与一个plane动态绑定;在同一时刻,通常一个或多个plane与一个crtc静态绑定;在同一时刻,一个crtc与多个encoder动态绑定;在同原创 2022-03-28 16:46:37 · 5366 阅读 · 1 评论 -
Linux文件IO之ext文件系统
Linux文件IO之ext2和ext4引言引言原创 2020-06-19 21:47:36 · 412 阅读 · 0 评论 -
LINUX内存管理之x86地址转换
LINUX内存管理之地址转换1 地址转换过程2 分段转换2.1 逻辑地址结构2.2 段描述符2.3 段地址转换1 地址转换过程计算机加电后,运行在实模式下。在实模式下,程序直接操作的物理地址,以80386CPU为例,它只使用32根物理地址线中的20根,所以在实模式下最多能使用IM内存;经过BIOS的引导最终执行到linux内核后,经过前半部分的实模式和保护模式的交替运行,最终会运行在保护模式下......原创 2020-04-06 13:08:48 · 1338 阅读 · 0 评论 -
LINUX文件IO之epoll内核实现
epoll内核实现引言1 epoll概述1.1 file结构体1.2 eventpoll结构体1.3 epitem结构体2 运行时2.1 epoll初始化2.2 创建epoll对象2.3 关联/修改/取消文件IO事件2.3.1 关联文件IO事件2.4 等待关联文件的IO事件3源码解读引言linux有select/poll/epoll三种常见的多路复用的IO编程模型。其中,epoll自内核2.6...原创 2020-03-02 22:22:31 · 508 阅读 · 0 评论 -
LINUX内存管理之slab机制
slab机制解析引言1 概述1.1 kmem_cache1.2 kmem_cache_node1.3 page2 源码解读引言slab是Linux在伙伴系统之上的一种内存管理机制。伙伴系统最小的内存处理大小为4k(即一页的内存大小),然而,实际使用内存过程中,很多都是小内存,为了提高内存申请释放效率、防止内存碎片的产生、防止内存连续分配导致CPU缓存命中率低,linux在伙伴系统之上设计出sl...原创 2020-01-09 16:31:10 · 1010 阅读 · 0 评论 -
Linux启动过程
Linux启动过程引言1 执行BIOS2 执行Boot步骤一步骤二步骤三引言对于电脑电源键被按后,经过一系列控制台文本的打印,然后就进入了我们的操作系统界面。而且同一个电脑,可以安装不同的操作系统(如windows、linux)。它会自动帮你启动到你的操作系统。以linux为例,它的启动过程如下:其中执行BIOS、执行boot是所有计算机的通用过程;运行Kernel、启动init进程是属于...原创 2020-01-01 19:09:02 · 148 阅读 · 0 评论