Linux Kernel解析
文章平均质量分 81
Linux kernel 核心模块的原理分析
pwl999
莫听穿林打叶声,何妨吟啸且徐行。
展开
-
Linux 驱动模块内存精简
本文以一个实际例子,详细描述一下 `.ko` 内存精简优化的具体过程。原创 2023-09-25 08:30:00 · 896 阅读 · 0 评论 -
Linux Phy 驱动解析
Linux Phy 驱动的架构解析,phy 芯片的状态怎么传递给 mac netdev 驱动的流程分析。原创 2022-12-16 10:52:21 · 6094 阅读 · 1 评论 -
Linux mem 2.8 Kfence 详解
1. 原理介绍Kfence (Kernel Electric Fence) 是 Linux 内核引入的一种低开销的内存错误检测机制,因为是低开销的所以它可以在运行的生产环境中开启,同样由于是低开销所以它的功能相比较 KASAN 会偏弱。Kfence 的基本原理非常简单,它创建了自己的专有检测内存池 kfence_pool。在 data page 的两边加上了 fence page 电子栅栏,利用 MMU 的特性把 fence page 设置成不可访问。如果对 data page 的访问越过了 page原创 2022-04-30 10:00:00 · 1381 阅读 · 0 评论 -
Linux usb 7. Linux 配置 ADBD
文章目录1. 简介2. ADBD 源码3. Gadget Device 配置3.1 functionfs3.2 legacy 方式配置 functionfs3.3 configfs 方式配置 functionfs3.4 adb 使用配置参考资料1. 简介ADB 是 Android 环境下非常好用的调试工具。它是 client-server架构,由三部分组成:1、client (adb),运行于开发机器 (Host) ,你可以在shell中调用adb命令,其它的Android工具比如ADT插件和DDM原创 2021-12-11 14:38:42 · 6359 阅读 · 8 评论 -
Linux usb 6. HC/UDC 测试
文章目录1. 背景介绍2. Device (gadget zero)2.1 `gadget zero` 创建2.2 SourceSink Function2.3 Loopback Function3. Host (usbtest.ko)3.1 testcase3.2 ioctl4. App (testusb)参考资料1. 背景介绍在测试 USB 时,普通的做法是找一些 U 盘、鼠标、键盘 等外设来做一些测试,但是这些测试还是偏上层偏功能的。相比较 HC (USB Host Controller) 和 U原创 2021-11-11 15:46:16 · 4060 阅读 · 1 评论 -
Linux usb 5. usbip (USB Over IP) 使用实例
文章目录0. 简介1. Server 配置2. Client 配置参考资料0. 简介USB Over IP 是一种应用很多的场景,目前已经有现成的解决方案 usbip。linux 和 windows 环境下都有配套软件,本文不分析原理就验证一下 Linux 环境下 usbip 功能的使用。1. Server 配置运行环境为 ubuntu 20.04.2。操作命令如下:// (1) 关闭防火墙$ sudo ufw disable// (2) 加载 server 端驱动$ cd /lib/原创 2021-10-29 17:43:22 · 6480 阅读 · 0 评论 -
Linux USB (目录)
1、USB 总线简介2、USB 协议分析3、USB Host 详解4、USB Device 详解原创 2021-10-27 17:35:08 · 1988 阅读 · 0 评论 -
Linux usb 4. Device 详解
文章目录1. 简介2. Platform Layer2.1 Platform Device2.2 Platform Driver3. UDC/Gadget Layer3.1 Gadget Bus3.2 Gadget Device3.2.1 Endpoint Alloc3.2.2 EndPoint Access3.2.3 UDC Control3.3 Gadget Driver (Configfs)3.3.1 configfs 使用3.3.2 configfs 层次结构3.3.3 gadget driver3原创 2021-10-27 17:28:18 · 4710 阅读 · 3 评论 -
Linux usb 3. Host 详解
文章目录1. 简介2. Usb Core 驱动设备模型2.1 Usb Device Layer2.1.1 device (struct usb_device)2.1.2 driver (struct usb_device_driver)2.1.3 bus (usb_bus_type)2.2 Usb Interface Layer2.2.1 device (struct usb_interface)2.2.2 driver (struct usb_driver)2.2.3 bus (usb_bus_type)原创 2021-10-23 15:16:46 · 2352 阅读 · 1 评论 -
Linux usb 1. 总线简介
文章目录1. USB 发展历史1.1 USB 1.0/2.01.2 USB 3.01.3 速度识别1.4 phy 总线2. 总线拓扑2.1 Device 内部的逻辑关系2.2 Compund/Composite Device2.3 Hub2.4 Configure Descriptor3. 总线调度3.1 Frames/Microframes3.2 Bulk Transactions3.3 Control Transfers3.4 Interrupt Transactions3.5 Isochronous原创 2021-10-21 11:24:38 · 2309 阅读 · 0 评论 -
Linux usb 2. 协议分析
文章目录1. USB 协议传输格式1.1 Packet1.1.1 Token Packet1.1.2 Data Packet1.1.3 Handshake Packet1.1.4 Special Packet1.2 Transaction1.2.1 IN/Read/Upstream Transaction1.2.2 OUT/Write/Downstream Transaction1.2.3 Control Transaction1.2.3.1 Setup Stage (`Transaction`)1.2.3原创 2021-08-16 16:18:09 · 1689 阅读 · 0 评论 -
Linux Kdump 机制详解
文章目录1. 简介1.1 安装1.2 触发 kdump1.3 调试 kdump1.3.1 安装 debuginfo vmlinux1.3.2 编译 kernel1.4 kdump-tools.service 流程分析2. 原理分析2.1 elf core 文件格式3. `/proc/kcore`3.1 准备数据3.2 读取 elf core4. `/proc/vmcore`4.1 准备 elf header (运行在 normal kernel)4.1.1 crash_notes 数据的更新4.1.2 vm原创 2021-07-02 16:16:53 · 3705 阅读 · 0 评论 -
Linux NameSpace (目录)
1. User Namespace 详解2. Pid Namespace 详解3. Mnt Namespace 详解4. UTS Namespace 详解5. IPC Namespace 详解6. Network Namespace 详解原创 2021-06-04 11:25:40 · 842 阅读 · 0 评论 -
Linux ns 6. Network Namespace 详解
文章目录1. 简介1.1 Docker Network 桥接模式配置2. 代码解析2.1 copy_net_ns()2.2 pernet_list2.2.1 loopback_net_ops2.2.2 netdev_net_ops2.2.3 fou_net_ops2.3 sock_net_set()2.4 dev_net_set()2.5 write_pnet()参考文档:1. 简介1.1 Docker Network 桥接模式配置1、创建一个新的 bash 运行在新的 net namespace原创 2021-06-04 11:17:31 · 743 阅读 · 0 评论 -
Linux ns 5. IPC Namespace 详解
文章目录1. 简介2. 源码分析2.1 copy_ipcs()2.2 ipcget()2.3 ipc_check_perms()2.4 相关系统调用参考文档:1. 简介进程间通讯的机制称为 IPC(Inter-Process Communication)。Linux 下有多种 IPC 机制:管道(PIPE)、命名管道(FIFO)、信号(Signal)、消息队列(Message queues)、信号量(Semaphore)、共享内存(Share Memory)、内存映射(Memory Map)、套接字(S原创 2021-06-04 11:11:49 · 1443 阅读 · 0 评论 -
Linux ns 4. UTS Namespace 详解
文章目录1. 使用简介1.1 hostname1.2 domainname1.3 uname2. 代码分析2.1 copy_utsname()2.2 sethostname()2.3 gethostname()2.4 setdomainname()2.5 uname()参考文档:1. 使用简介UTS(UNIX Time Sharing) namespace 是最简单的一种 namespace。UTS 中主要包含了主机名(hostname)、域名(domainname)和一些版本信息:struct ut原创 2021-05-15 17:43:31 · 1388 阅读 · 0 评论 -
Linux Mem (目录)
1、用户态相关:1.1、用户态进程空间的创建 — execve() 详解1.2、用户态进程空间的映射 — mmap()详解1.3、分页寻址(Paging/MMU)机制详解2、内核态相关:2.1、Page 页帧管理详解2.2、内核地址空间布局详解2.3、内核页表隔离 (KPTI) 详解2.4、Buddy 内存管理机制2.5、Buddy 内存回收机制2.6、Rmap 内存反向映射机制 2.7、内存错误检测 (KASAN) 详解 ...原创 2021-04-24 23:57:54 · 1936 阅读 · 0 评论 -
Linux mem 2.7 内存错误检测 (KASAN) 详解
文章目录1. 简介2. Shadow 区域初始化3. 权限的判断3.1 read/write3.2 memxxx()4. 权限的设置4.1 buddy4.1.1 kasan_free_pages()4.1.2 kasan_alloc_pages()4.2 slub4.2.1 kasan_cache_create()4.2.2 kasan_slab_free()4.2.3 kasan_slab_alloc()4.3 kmalloc4.4 global variable4.4.1 struct kasan_gl原创 2021-04-24 23:49:35 · 3766 阅读 · 0 评论 -
Unwind 栈回溯 issue
1、.eh_frame信息中cie的Augmentation字段为空:Oracle Linux 6.5# readelf -wf oracle | moreContents of the .eh_frame section: 00000000 00000014 00000000 CIE Version: 1 Augmentation: "" Code alignment factor: 1 Data alignment factor.原创 2021-04-23 17:57:53 · 400 阅读 · 0 评论 -
Linux mem 2.5 Buddy 内存回收机制
文章目录1. 简介2. LRU 组织2.1 LRU 链表2.2 LRU Cache2.3 LRU 移动操作2.3.1 page 加入 LRU2.3.2 其他 LRU 移动操作3. LRU 回收3.1 LRU 更新3.2 Swappiness3.3 反向映射3.4 代码实现3.4.1 struct scan_control3.4.2 shrink_node()3.4.3 shrink_list()3.4.4 shrink_active_list()3.4.5 shrink_inactive_list()3.4原创 2021-04-22 19:44:33 · 877 阅读 · 0 评论 -
Linux mem 2.6 Rmap 内存反向映射机制
文章目录1. 简介2. 匿名内存2.1 fork()2.2 do_page_fault()3. 文件内存3.1 fork()3.2 do_page_fault()参考文档:1. 简介通常情况下用户态的虚拟地址和物理内存之间建立的是正向映射的关系:vma存储了虚拟地址 → 发生了page_fault以后分配物理内存page并且建立mmu映射。但是在进行内存回收时,需要反向查找,根据目的物理内存 page,查找到所有映射到该内存的 vma 并进行映射关系的解除,才能回收对应的物理内存 page。本节相当原创 2021-04-21 18:23:43 · 935 阅读 · 0 评论 -
Linux ns 3. Mnt Namespace 详解
1. 文件系统层次化对 Linux 系统来说一切皆文件,Linux 使用树形的层次化结构来管理所有的文件对象。完整的Linux文件系统,是由多种设备、多种文件系统组成的一个混合的树形结构。我们首先从一个单独的块设备来分析其树形结构的构造。1.1 块设备的层次化(superblock/inode/dentry)对一个块设备来说要想构造文件系统树形结构,最重要的两个全局因素是:块设备(block_device)和文件系统(file_system_type)。内核使用了一个数据结构 struct sup原创 2021-04-03 18:05:17 · 1077 阅读 · 2 评论 -
Linux mem 2.4 Buddy 内存管理机制
文章目录1. Buddy 简介2. Buddy 初始化2.1 Struct Page 初始化2.2 Buddy 初始化3. 内存释放4. 内存分配4.1 gfp_mask4.2 node 候选策略4.3 zone 候选策略4.4 zone fallback 策略4.5 lowmem reserve 机制4.6 order fallback 策略4.7 migrate type 候选策略4.8 migrate fallback 策略4.9 reclaim watermark4.10 reclaim 方式4.1原创 2021-04-03 17:59:52 · 1219 阅读 · 2 评论 -
Linux ns 1. User Namespace 详解
文章目录1. 简介2. user namespace的创建2.1 原理介绍2.2 操作实例2.3 代码分析3. `uid/gid`隔离3.1 原理介绍3.2 操作实例3.3 代码分析3.2.1 map_write()3.2.2 getuid()3.2.3 stat64()3.2.4 acl_permission_check()4. `capability`隔离4.1 原理介绍4.2 操作实例4.3 代码分析4.3.1 ns_capable()4.3.2 cap_bprm_set_creds()参考文档:1原创 2021-03-24 20:30:45 · 2968 阅读 · 1 评论 -
Linux Hook (目录)
Hook技术是性能优化和安全加固的基础。1、内核态1.1、LSM Hook1.2、Ftrace Hook (LivePatch)1.3、Inline Hook Syscall2、用户态2.1、PLT Hook & Inline Hook原创 2021-03-04 09:59:40 · 1277 阅读 · 1 评论 -
Linux mem 2.3 内核页表隔离 (KPTI) 详解
文章目录1. 背景介绍1.1 Meltdown & Spectre 漏洞1.2 KPTI补丁2. KPTI原理2.1 页表隔离2.2 TLB刷新策略3. 代码实现3.1 pgd切换3.2 系统调用3.3 进程切换3.4 pgd的初始化4. 相关知识4.1 ALTERNATIVE()4.2 .pushsection4.3 宏计数器`\@`4.4 pt_regs参考文档:1. 背景介绍KPTI(Kernel page-table isolation)内核页表隔离,把进程页表按照成用户态、内核态独立的原创 2021-01-15 20:12:11 · 5499 阅读 · 0 评论 -
Linux mem 2.2 内核地址空间布局详解
文章目录1. 简介2. 内核页表初始化2.0 decompress阶段2.1 `head_64.S`和`head64.c`2.2 start_kernel()2.2.1 物理内存(e820)2.2.2 初始内存分配机制(memblock/bootmem)2.2.3 线性映射区的创建(direct mapping)2.2.4 page存储区的创建(vmemmap)2.2.5 正式内存分配机制的初始化(buddy)2.2.6 非连续内存区(vmalloc)2.2.7 KASLR2.2.8 进程创建(fork()原创 2020-12-31 20:40:11 · 3599 阅读 · 1 评论 -
Linux DAC 权限管理详解
文章目录1. 背景简介2. 主体(subject)2.1 用户2.2 进程2.2.1 凭证(credentials)2.2.2 uid/suid/euid/fsuid2.2.3 初始uid (fork())2.2.4 uid权限升级 (SUID execve())2.2.5 uid权限降级 (setreuid()/setuid()/setresuid()/setfsuid())3. 客体(object)4. 规则(policy)4.1 UGO(User、Ggroup、Other)规则4.2 ACL(Acce原创 2020-12-08 17:57:13 · 9918 阅读 · 0 评论 -
Linux ns 2. Pid Namespace 详解
文章目录1. pid1.1 pid_link1.1.1 process1.1.2 thread group1.1.3 process group1.1.4 session1.2 pid的初始化2. pid namespace2.1 clone(CLONE_NEWPID)2.2 setns(CLONE_NEWPID)2.3 unshare(CLONE_NEWPID)2.4 相关函数参考文档:1. pid在linux下获取pid,会发现有好几种类似的id(pid、tgid、pgid、sid),这几种的区别在原创 2020-11-18 20:03:40 · 1669 阅读 · 2 评论 -
Linux mem 2.1 Page 页帧管理详解
文章目录1. Page1.1 `struct page`定义1.2 `struct page`的初始化1.3 `struct page`的存放位置1.4 `page frame`的物理地址和虚拟地址2. page fault2.1 概述2.2 do_page_fault()2.3 handle_mm_fault()2.4 do_fault()2.5 do_anonymous_page()2.6 do_swap_page()2.7 do_wp_page()3. COW4. Swap4.1 swap out4.原创 2020-11-06 21:18:05 · 3335 阅读 · 3 评论 -
Linux mem 1.3 分页寻址(Paging)机制详解
文章目录1. X86手册定义1.1 paging modes1.2 `4-LEVEL PAGING`和`5-LEVEL PAGING`模式1.2.1 `4-LEVEL PAGING`1.2.2 CR3 format1.2.3 PML5/PGD entry format1.2.4 PML4/P4D entry format1.2.5 PDPT/PUD entry format (1-GByte Page)1.2.6 PDPT/PUD entry format (Page Directory)1.2.7 PD/原创 2020-11-02 17:14:37 · 4174 阅读 · 0 评论 -
Linux mem 1.1 用户态进程空间的创建 --- execve() 详解
文章目录1. 原理介绍1.1 固定地址映射1.2 随机地址映射(ASLR)1.3 文件映射1.4 stack2. 代码详解2.1 execve()2.1.1 bprm_mm_init()2.1.2 copy_strings()2.1.3 security_bprm_check()2.2 load_elf_binary()2.2.1 flush_old_exec()2.2.2 setup_new_exec()2.2.3 setup_arg_pages()2.2.4 elf_map()2.2.5 load_el原创 2020-10-26 14:44:23 · 1997 阅读 · 0 评论 -
Linux mem 1.2 用户态进程空间布局 --- mmap()详解
mmap系统调用Author: pwlDate: 2020-10-20文章目录mmap系统调用1. 原理介绍1.1 映射1.2 vma管理1.3 mmap1.4 缺页异常1.5 layout1.6 brk2. 代码详解2.1 关键数据结构2.2 mmap()2.2.1 mm->mmap_base(mmap基地址)2.2.2 get_unmapped_area()2.2.2.1 arch_get_unmapped_area()2.2.2.2 arch_get_unmapped_area_t原创 2020-10-20 20:23:52 · 3319 阅读 · 2 评论 -
Unwind 栈回溯详解
1. 历史背景1.1 frame pointers在调试的时候经常需要进行堆栈回溯。最简单的方式是使用一个独立的寄存器(ebp)来保存每层函数调用的堆栈栈顶(frame pointer):pushl%ebp movl%esp,%ebp ... popl%ebp retx86_64的frame point模式arm64的frame point模式这种方式在堆栈回溯时非常方便快捷。但是这种方法也有自己的不足:需要一个专门寄存器ebp来保存frame poniter。保存e原创 2020-07-24 21:02:33 · 20975 阅读 · 3 评论 -
X86寄存器 (笔记)
文章目录1. 16位cpu1.1 段寄存器2. 32位cpu2.1 通用寄存器2.2 系统表寄存器2.2.1 全局描述符表GDT(Global Descriptor Table)2.2.2 局部描述符表LDT(Local Descriptor Table)2.2.3 任务状态段TSS(Task State Segment)2.2.4 中断描述符表IDT(Interrupt Descriptor Table)2.3 段寄存器2.4 指令指针寄存器和标志寄存器/控制寄存器/调试寄存器/测试寄存器3. 64位cp原创 2020-07-10 19:16:07 · 7112 阅读 · 0 评论 -
x86 PerCPU变量基址(gs寄存器)的原理
0. 引子我们在调试的时候发现,x86下有一个快捷方法,只需一条简单的汇编指令mov %gs:var就能取出某个percpu变量在当前cpu的值,非常高效。unsigned long get_mem_value(unsigned long addr) { unsigned long value = 0 ; __asm__ __volatile__ ("mov %0, %%rax\n\t"::"r"(addr)) ; __asm__ __volatile__ ("mov %gs:(原创 2020-06-23 19:47:25 · 2947 阅读 · 0 评论 -
Linux fsck 机制解析
Linux fsck 机制0. 概述1. Upstart 方式 (ubuntu 14.04 32bit)1.1 配置fsck启动1.2 配置fsck运行参数1.3 mountall.config1.4 mountall1.5 fsck2. Systemd 方式 (ubuntu 16.04 64bit)2.1 普通分区的fsck2.2 Root分区的fsck2.3 ext文件系统的限制2.4 强制fsck完整扫描2.5 fsck.repair3. Systemd 方式 (arm 32bit)3.1 普通分区的原创 2020-06-15 17:03:24 · 4973 阅读 · 0 评论 -
Linux fanotify 解析
Linux fanotify 解析1. 基本介绍1.1 基本原理1.2 fanotify基本功能2. 用户态实现2.1 实例代码2.2 API介绍3. 内核实现3.1 配置fanotify3.1.1 fanotify_init()3.1.2 fanotify_mark()3.2 触发fanotify3.3 响应fanotify3.3.1 fanotify_read()3.3.2 fanotify_write()参考文档:1. 基本介绍Fanotify (Filesystem wide access no原创 2020-06-16 10:37:57 · 6742 阅读 · 2 评论 -
Linux Interrupt
在面试的时候我们常常问或者被问一个问题:几种中断下半部机制softirq、tasklet、workqueue有什么区别?linux为什么要设计这几种机制?真正能够回答清楚的人还是少数的。下面我们就详细分析一下这其中的区别。原创 2017-10-11 16:24:06 · 2407 阅读 · 0 评论 -
Linux Workqueue
workqueue是内核里面很重要的一个机制,特别是内核驱动,一般的小型任务(work)都不会自己起一个线程来处理,而是扔到workqueu中处理。workqueue的主要工作就是用进程上下文来处理内核中大量的小任务。 所以workqueue的主要设计思想:一个是并行,多个work不要相互阻塞;另外一个是节省资源,多个work尽量共享资源(进程、调度、内存),不要造成系统过多的资源浪费。 为了实原创 2017-10-11 15:30:50 · 1846 阅读 · 0 评论