linux-kernel-4.19
4.19内核分析
山羊哥-老宋
写bug
展开
-
Waitqueue in Linux
本文是Linux设备驱动程序系列的续篇,并对字符驱动程序及其实现进行了讨论。这是Linux设备驱动程序教程的第10部分。现在,我们将讨论Linux中的Waitqueue。Waitqueue in LinuxLinux中的等待队列介绍初始化等待队列静态方法动态方法排队wait_eventwait_event_timeoutwait_event_cmdwait_event_interruptiblewait_event_interruptible_timeoutwait_event_killable唤醒等待的翻译 2020-11-17 18:51:31 · 481 阅读 · 0 评论 -
Linux Kernel Selftests
内核自测运行自检(热插拔测试以受限模式运行)运行部分自测运行全方位热插拔自测安装自检运行已安装的自测贡献新测试Example帮助操作内核在tools/testing/selftests/目录下包含一组“self tests”。这些旨在作为小型测试,以练习内核中的各个代码路径。测试旨在在构建,安装和引导内核之后运行。在某些系统上,热插拔测试可能永远挂起,以等待CPU和内存准备好脱机。创建一个特殊的热插拔目标以运行所有范围的热插拔测试。在默认模式下,热插拔测试在有限范围内的安全模式下运行。在受限模式下,cp翻译 2020-11-05 17:16:58 · 2871 阅读 · 0 评论 -
Slab分配接口
Slab Allocator Interface创建新的缓存例子Slab Allocator Interface)创建新的缓存/* * kmem_cache_create_usercopy - 创建一个缓存. * @name: 一个用于 /proc/slabinfo识别此缓存. * @size: 要在此缓存中创建的对象的大小。 * @align:对象所需的对齐方式。 * @flags: SLAB标志 * @useroffset: 用户复制区域偏移 * @usersize:用户复制区域大小原创 2020-11-05 14:38:11 · 337 阅读 · 0 评论 -
redhat8设置kdump不生效问题
kdump配置解决oom杀死crash进程开机后设置kdump第二内核如果生成的crash 过大 在/etc/kdump.conf设置然后重启kdumpe服务测试生成 coredump最近开发内核过程中Redhat8 不能生成coredump 所以自己研究了下规避解决了:以下是配置,记录下方便后续查看。解决oom杀死crash进程kernel.panic = 10kernel.panic_on_io_nmi = 0kernel.panic_on_oops = 1kernel.panic_on_r原创 2020-11-03 08:29:42 · 1010 阅读 · 0 评论 -
内存映射
Memory mapping目标关键字:总览用于内存映射的结构struct pagestruct vm_area_structstruct mm_struct设备驱动程序内存映射Exercises1.将连续的物理内存映射到用户空间2.将不连续的物理内存映射到用户空间3.映射内存中的读/写操作4.显示在procfs中映射的内存目标了解地址空间映射机制了解与内存管理相关的最重要的结构关键字:address spacemmap()struct pagestruct vm_area_struc翻译 2020-10-31 15:58:18 · 854 阅读 · 0 评论 -
非阻塞io之 epoll内核实现
epoll创建epollFdepollFD文件描述符的回调实现epoll_ctl 系统调用epoll_ctl的系统调用实现epoll_wait系统调用由于需要实现一个驱动想封装出epoll的设备,在网上找关于epoll的信息,好少所以自己看了内核的代码了解以下epoll机制,做个总结以便自己后面查看。/* * 这个结构存储在`struct file`结构的 "private_data"成员中,也是eventpoll接口的主要数据结构。 * 访问它受到 wq 内部锁的保护。 */struct ev原创 2020-10-21 17:49:46 · 512 阅读 · 0 评论 -
linux之eventfd机制-epoll
eventfd机制机制结构体创建eventfdeventfd的操作集show_fdinfoeventfd_releaseeventfd_pollreadwritenoop_llseek最近在看linux内核驱动,想实现一个支持epoll的机制,看到了eventfd机制,所以就自己记录下eventfd的机制和心得。机制eventfd是一个将内存作为虚拟文件来操作的文件描述符。在创建eventfd的时候会通过fd = anon_inode_getfd("[eventfd]", &eventfd_原创 2020-10-12 14:47:51 · 2085 阅读 · 0 评论 -
用户态进程的虚拟地址如何转换成物理地址
用户态进程的虚拟地址如何转换成物理地址用户态进程的虚拟地址如何转换成物理地址?mmapmmap基础概念mmap内存映射原理mmap详解UMA和NUMA:mmap优点总结mmap相关函数用户态进程的虚拟地址如何转换成物理地址?区分一个进程,我们都知道最简单就是进程的pid。我们就从(pid,virtualaddress)来看看如何将一个进程的虚拟地址转换为物理地址phyaddress。首先根据pid我们可以得到这个进程的task_struct,进而通过task_struct得到mm,通过mm得到pg原创 2020-09-29 09:13:16 · 3410 阅读 · 1 评论 -
内存管理之remap_pfn_range
定义在v4.19.133 /mm/memory.cint remap_pfn_range(struct vm_area_struct *, unsigned long addr, unsigned long pfn, unsigned long size, pgprot_t);/** * remap_pfn_range - 映射内核内存到用户空间 * @vma: user vma to map to * @addr: target user address to start at * @原创 2020-09-27 15:38:33 · 2343 阅读 · 0 评论 -
内存管理之页转换 virt_to_page
3项技术:mmap系统调用可以实现将设备内存映射到用户进程的地址空间。使用get_user_pages,可以把用户空间内存映射到内核中。DMA的I/O操作,使得外设具有直接访问系统内存的能力。kernel 5.8.11/arch/x86/include/asm/page.h#ifndef __va#define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET))#endif#define __boot_va(x) __va(.原创 2020-09-25 14:42:55 · 3497 阅读 · 0 评论 -
内存管理之alloc_pages_exact
kernel:5.8.11定义在/mm/page_alloc.c/** * alloc_pages_exact - 分配物理上连续的精确页数。 * @size: 要分配的字节数 * @gfp_mask: 分配的 GFP 标志不能包含 __GFP_COMP * * 此函数与alloc_pages()相似,不同之处在于,它分配最少数量的页面以满足请求。 alloc_pages()只能在2分之三的页面中分配内存。 * * 此函数也受MAX_ORDER限制。 * * 此函数分配的内存必须由fr原创 2020-09-25 14:28:05 · 692 阅读 · 0 评论 -
内存管理
内存管理内存管理使用4级页表完成虚拟内存映射使用5级页表完成虚拟内存映射内存管理使用4级页表完成虚拟内存映射注意:负地址(比如-23 TB)是从64位地址空间顶部向下计算的以字节为单位的绝对地址。当看到绝对地址和从顶部到顶部的距离时,更容易理解布局。例如0xffffe90000000000 = =-23TB,它比64位地址空间的低23TB (ffffffffffffffff)。请注意,当我们接近地址空间的顶部时,符号将从 TB 变为 GB,然后是 MB/KB。16M TB乍一看可能很翻译 2020-09-25 11:53:56 · 510 阅读 · 0 评论 -
DMA使用指南
Dynamic DMA mapping GuideDynamic DMA mapping GuideCPU和DMA地址DMA可以使用什么内存?DMA寻址限制DMA映射的类型使用一致的 DMA 映射创建一个 `dma_pool `从 DMA 池中分配内存释放`dma_pool`中申请的内存:销毁`dma_pool`DMA方向使用流 DMA 映射映射单个区域取消映射单个区域解除映射散列表错误处理优化未映射状态空间消耗平台问题=========================Dynamic DMA mappi翻译 2020-09-23 14:35:48 · 5476 阅读 · 3 评论