![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
linux
文章平均质量分 90
wjx5210
积极努力...
展开
-
numa balance实现浅析
NUMA结构的系统上通过numa balance将task和它访问的内存放到相同的node上原创 2022-04-03 17:00:37 · 6919 阅读 · 1 评论 -
gdb调试笔记
官方文档:断点查询断点信息:info b设置断点b *0x123456 // b *addressb main //b funcb test.c:100 //b filename:line取消断点disable 1 //取消断点,不会触发断点del 1 //删除断点信息断点触发时自动执行命令commands 断点 断点 //选择断点列表,可以是多个。。。 //执行命令,当为空时表示删除断点触发时执行的命令。ends符号加载...原创 2020-09-29 09:24:18 · 2000 阅读 · 1 评论 -
virtio系列-packed virtqueue
virtio packed virtqueuespilt virtqueue因其简约的设计而备受欢迎,但是它有一个基本的问题:avail, used ring 是分离的,cpu cache miss的概率比较大,从硬件角度来看意味着每个descriptor的读写操作都需要几个PC事务。packed virtqueue通过将三个ring合并到一起来改善这个问题.不过这种方式看起来非常复杂,远不如split virtqueue简约。在split版本中如果认识到在获取driver提供的数据之后device可以丢翻译 2021-09-09 21:15:51 · 4185 阅读 · 12 评论 -
内核、设备、驱动、文件系统、内核空间、用户空间
学习驱动过程中有一些疑问,记录下来,并希望能在2015-6-30之前能够有一个明确的答案。一、当设备插上的时候,内核怎么发现设备并更新/sys、/dev、/proc文件系统、怎么通知给用户空间?更具体一点是probe的过程二、device和driver怎么配对?例如一个挂载在IIC总线下的设备,我们看到i2c_bus_type中有一个i2c_device_match,这个到底怎么触发的,只原创 2015-05-30 21:04:31 · 2135 阅读 · 0 评论 -
driver的结构体
自己也是刚开始从android framework转到driver,相当于转行了,但是能做自己喜欢的工作还是非常开心的。driver中基本的结构体:kobject,kobj_type,kset这三个结构是驱动中一些基本数据结构,其他的device,device_driver,bus_type等都是对上面3个结构体进行封装形成的; struct kobject {原创 2015-05-25 23:18:04 · 666 阅读 · 0 评论 -
IIC driver 重要结构体
借用一下其他的照片,这样方便我们分析driver;IIC子系统可以分i2c-dev:代表挂在bus上的设备i2c client:代表了完整的从设备,由i2c-dev,i2c-driver组成;i2c-adapter:代表IIC控制器,i2c-algorithm:代表了IIC通信的规范i2c-core:提供了IIC总线上总线驱动和设备驱动的注册、注销方法,IIC通信方原创 2015-06-05 15:37:38 · 647 阅读 · 0 评论 -
电源管理代码
1.系统调用的位置首先可以从include/linux/syscalls.h头文件中找起,头文件中没有那么多和乱七八糟的实现。#define SYSCALL_DEFINE4(name, ...) SYSCALL_DEFINEx(4, _##name, __VA_ARGS__)再看一个位置:kernel/kernel/sys.cSYSCALL_DEFINE4(reboot,原创 2015-06-19 11:11:52 · 808 阅读 · 0 评论 -
linux platform机制的好处
转载:http://blog.sina.com.cn/s/blog_5106eff101011k5c.html从Linux2.6起,引入了一套新的驱动管理和注册机制:Platform_device和Platform_driver。Linux中大部分的设备驱动,都可以使用这套机制,设备用platform_device表示,驱动用platform_driver进行注册。 Linux p转载 2015-06-08 16:16:33 · 911 阅读 · 0 评论 -
ACPI<Advanced Configuration and Power Interface >
转载:http://product.pconline.com.cn/itbk/bjbzj/notebook/1107/2476367.html高级配置与电源接口(Advanced Configuration and Power Interface),简称ACPI。1997年由Intel、Microsoft、Toshiba 所共同制定提供操作系统应用程序管理所有电源管理接口。2000年8转载 2015-05-25 22:52:15 · 917 阅读 · 0 评论 -
Platform 驱动架构
自从2.6以后版本的内核,出现了一个platform架构的驱动子系统,里面有两个基本的对象:platform_device,platform_driver;Linux platformdriver机制和传统的device_driver机制相比,一个十分明显的优势在于platform机制将本身的资源注册进内核,由内核统一管理,在驱动程序中使用这些资源时通过platform_device提供的原创 2015-06-09 17:47:41 · 326 阅读 · 0 评论 -
IIC初探
第一次也没有大概的框架,先走一遍代码有个大概印象再来讨论整体设计吧。先说软件的cdev的框架吧。 static const struct file_operations i2cdev_fops = { .owner = THIS_MODULE,原创 2015-05-30 23:10:54 · 285 阅读 · 0 评论 -
Power-Freeze process进程冻结
前言:电源管理是嵌入式设备中非常重要的一环,特别是android手机上电源管理直接关系到手机的续航时间,每人都希望自己的手机能够充电一次运行终生,不过能量守恒定律决定了它只能运行有限的时间,所以只能延长续航时间。手机电源管理中有一个重要的过程,当按下电源键的时候,整个手机都进入一个挂起状态,专业点叫supend to ram简称s2ram,所有的进程都不在运行,所有的设备都不再响应,ram进入...原创 2015-07-03 00:01:37 · 1622 阅读 · 0 评论 -
ftrace来进行内核hook,part2
翻译:https://www.apriorit.com/dev-blog/546-hooking-linux-functions-2Ftrace是内核中的一种trace框架。但是我们对于找到了一种新的方法,可以通过ftrace来监控系统,当发现可疑进程的时候能够阻止它的运行。事实证明ftrace可以使你能够在不重新编译内核的前提下能够是安装一个可以动态加载的带有GPL licencse的模块...翻译 2019-07-02 17:34:01 · 823 阅读 · 0 评论 -
linux kprobe实现原理
linux kprobeskprobes出现了非常长的时间,最早是2.6.9版本中,最早能够追溯到2004年,距离现在15年,一直没有为人所知,但却是隐藏在诸多技术后的一个基础组件,例如ftrace,perf,SystemTap,LTTng还有最近非常火热的ebpf.kprobes是什么?它是kernel probes(我翻译成探针),是一种debug机制,它是由IBM开发的,最初计划用来和...原创 2019-08-12 20:34:54 · 1467 阅读 · 0 评论 -
linux内核态hook模块
linux内核支持动态加载module,今天不聊正常的module,只简单看一下实现Hook的module. hook通常翻译做劫持,不过这个翻译听起来让人不舒服,感觉有点恐怖,所以大家都是喊行话:hook.上图是经典的堆栈式hook,也是splice典型的做法,在原有的流程中插入hook,更加典型的做法是栈在调用过程中从funcA->funcB变成了funcA->hook->...原创 2019-12-03 16:44:37 · 3698 阅读 · 1 评论 -
CPU Idle Introduction
学习http://www.wowotech.net/之后自己稍微总结了一下Please see the following article:http://lwn.net/Articles/384146/CPUIdle 目的为了在CPU资源无人使用的时候能够在照顾用户体验前提下尽可能地降低CPU功耗以延长手机工作时间;Tip1:Cpu资源是什么?CPU中主要的功能单元是逻辑运原创 2015-08-14 16:48:55 · 1577 阅读 · 0 评论 -
高通平台手机的power概览
高通power的概览,可操作性不强。原创 2016-04-11 23:58:25 · 4033 阅读 · 2 评论 -
内核模块踩内存问题定位利器- hardware breakpoint
转发自:https://blog.csdn.net/phenix_lord/article/details/41415559内核由于共享内存地址空间,如果没有合适的工具,很多踩内存的问题即使复现,也无法快速定位;在新的内核版本中引入了一个新工具hardware breakpoint,其能够监视对指定的地址的特定类型(读/写)的数据访问,有利于该类问题的定位;以下是一个使用该工具的例子(来...转载 2019-06-24 15:48:21 · 2400 阅读 · 0 评论 -
修改bio完成加解密文件系统
通过hijack了解bio背景bio是block io,它是一个描述硬盘里面的位置与page cache的页对应关系的数据结构,每个bio对应的硬盘里面一块连续的位置,每一块硬盘里面连续的位置,可能对应着page cache的多页,或者一页,所以它里面会有一个bio_vec *bi_io_vec的表。而每个bio_vec都只能描述一个页内数据的连续的数据的偏移和长度:通过bi_sec...原创 2019-06-13 20:14:41 · 695 阅读 · 0 评论 -
Gdb调试内核的宏
“I don’t think any new thoughts. I think thoughts that other people have thought, and I rearrange them.” – Linus TorvaldsLinus说他把调试器当反汇编器使用,其实查看宏也是蛮方便的。打开内核的调试选项CONFIG_DEBUG_INFO,修改内核编译选项。--- a/M...转载 2020-02-02 18:10:28 · 419 阅读 · 0 评论 -
virtio系列-split virtqueue数据流
virtio split virtqueue数据流基本概念解释buffers和notifications:一个virtqueue的buffer是由guest来分配,host来消费的,host可以读和写这些buffer。一个buffer只能是只读或者只写的,但是不能读和写同时存在。buffer的描述符可以是通过指针链接起来的,即indriect descriptor,通过将消息扩展会更加方便,例如在一个buffer中放入和2000字节的数据和使用两个1000字节的数据buffer存放效果是一样的。原创 2021-09-09 20:47:24 · 1926 阅读 · 0 评论 -
virtio系列-规范解读
virtiovirtio 是一种 I/O 半虚拟化解决方案,是一套通用 I/O 设备虚拟化的程序,是对半虚拟化 Hypervisor 中的一组通用 I/O 设备的抽象。提供了一套上层应用与各 Hypervisor 虚拟化设备(KVM,Xen,VMware等)之间的通信框架和编程接口,减少跨平台所带来的兼容性问题,大大提高驱动程序开发效率。历史背景qemu支持多种设备,例如网卡有e1000,virtio等,其中e1000属于全虚拟化设备,它模拟了一个真实的硬件设备,提供的访问接口完全遵循硬件手册,当虚拟原创 2021-09-09 19:42:57 · 2756 阅读 · 0 评论 -
linux hook方法整理
在计算机中,基本所有的软件程序都可以通过hook方式进行行为拦截,hook方式就是改变原始的执行流,下面简要分类linux系统下的各种hook方式,主要有三类:修改函数指针,直接修改指令,利用系统提供的注册机制.函数指针hookC语言的一项强大的功能就是指针,指针代表一个地址,而函数指针就是指向一个函数地址的指针,通过函数指针来指向不同的函数地址控制执行流.一般这类函数指针存在于软件运行的整个周期中,要实施这类hook首先就是找到关键的函数指针,之后就和普通的指针修改一样进行改变就OK.函数指针的使原创 2020-08-20 15:16:49 · 5481 阅读 · 0 评论 -
linux应用层内存统计
在内核中有很多的机制:KASAN,slab debug等,在应用层也有很多的优秀的工具:valgrind, ASAN,tcmalloc, glibc memcheck等。这里不讲这些已知的方案,只总结一下基于glibc的内存debug方法,主要分为两大类:一种是需要修改api名称,例如将malloc改成debug_malloc,另外一种不需要修改api名称。原创 2020-07-06 23:41:20 · 565 阅读 · 0 评论 -
变长参数va_list va_start va_arg va_end
对于int printf(const char *format, ...);这种变长参数,需要使用va_list va_start va_end va_arg来访问参数。下面是一个tutorialspoint 的一个使用demo,示范如何使用这几个接口#include<stdarg.h>#include<stdio.h>int sum(int num_args, ...) { int val = 0, i; va_list ap; va_start(ap,原创 2020-06-29 16:34:16 · 4465 阅读 · 1 评论 -
静态编译文件是否真的到处可运行
这里只讨论一个问题,基于x86_64的静态编译文件是否真的到处可运行?例如在centos上静态链接一个程序是否在ubuntu、suse等linux发行版上运行毫无障碍,这个时间维度也不能毫无边界的扩散,运行的条件是内核支持ELF三种格式,在这讨论0.11版内核完全没有意义。首先一个简单的hello world运行大概率是没有任何问题。一个静态链接程序的排布,我们通过一个简单的helloworld程序来看一下它的链接过程:gcc hello.c -static -o hello -v...... /原创 2020-06-25 01:39:13 · 1166 阅读 · 0 评论 -
linux虚拟文件系统-文件的打开
文件打开的过程主要有两件事,确认文件是否存在,文件存在建立fd,file,dentry,inode,address_space的关联关系dentry的hash管理,加速查找,rcu锁无dentry之后的文件查找,inode的lookup关联各种对象软链接文件的处理…和.的处理挂载点的处理fd和file的映射关系文件的关闭简单的关闭文件释放open flag的作用O_CLOEXEC...原创 2020-06-20 03:44:48 · 831 阅读 · 1 评论 -
linux虚拟文件系统综述
Linux延续了Unix的一个哲学观点:一切皆文件,应用看到的所有对象都是文件,里面除了socket不那么典型之外所有都是文件。而实际情况非常复杂,内核管理着非常多的设备:字符设备、块设备、网络设备,还支持许多类型的文件系统:ext2、ext3、ext4、fuse、ntfs等,另外还有很多的伪文件系统:proc、devfs、sys、debugfs等,特殊的节点类型:netlink、notify、epoll等。没有什么是不能通过增加一个抽象层解决的,VFS就作为linux中的这一抽象层完成了一切皆文件的哲学观原创 2020-06-16 20:24:56 · 319 阅读 · 0 评论 -
linux内存管理-反向映射
为什么需要反向映射正向映射是通过虚拟地址根据页表找到物理内存,反向映射就是通过物理地址找到哪些虚拟地址使用它。应用场景:页面回收compaction匿名页的反向映射文件页的反向映射struct anon_vma {}struct anon_vma_chain}...原创 2020-06-11 11:16:06 · 1520 阅读 · 0 评论 -
ELF中模块间数据引用的重定位
在模块中进行各类数据引用的方式总共分有:模块内数据、函数访问,模块间数据、函数访问,其中模块内的访问在链接时就已经决定了他们的相对偏移,在运行时不再关心这部分的内容,而模块间访问相对就比较复杂了。为了复用物理内存,发明了PIC/PIE技术,将数据和指令分开GOT和PLT stub,这样重定位代码只需要修改GOT的数据部分就可以访问正确的函数了,ELF的PLT和GOT分析了模块间函数访问过程中的lazy bind机制。http://www.qnx.com/developers/docs/qnxcar2/i原创 2020-06-08 23:43:08 · 379 阅读 · 0 评论 -
linux内存管理-页面规整
页面整理页面申请失败有两种情况:1.空闲页不够,触及到回收的阈值2.申请order > 0的连续页时找不到连续的物理内存原创 2020-06-06 02:08:41 · 472 阅读 · 0 评论 -
linux内存管理-页面回收
页面回收Q1:那些页面可以被回收在页面申请的时候会将可回收的页加入到zone的active_list/inactive_list链表,并更新zone的NR_ACTIVE,NR_INACTIVE的数据do_wp_pageinstall_arg_pagedo_anonymous_pagedo_no_page页面回收的时候有两部分:LRU维护的页面,slab,其中slab中只回收注册了shrinker的slab,通常是dcache,icache,nfs,xfs,mbcache的slab,shrink原创 2020-05-31 18:42:13 · 876 阅读 · 1 评论 -
linux bootmem memblock的演进
有人可能认为在系统启动的时候内存的分配应该非常容易:基本上所有的内存都是可用的,不需要考虑并发性。尽管如此,boot阶段的内存管理仍然不是一个简单的任务。物理内存不一定是连续的,系统之间他们的分布更是有很大的不同,如何检测内存的布局就不是一个简单的任务。在NUMA的机器上这件事情更加复杂,在内存分配的时候还需要考虑在当前节点上分配,构建内存的拓扑图。为了应对这些问题,在启动过程中的早期阶段需要一些复杂的机制来进行内存管理工作。有人会问,为什么不一开始就使用buddy这些系统来管理呢?因为linux的页分配翻译 2020-05-30 01:41:33 · 390 阅读 · 0 评论 -
反汇编二进制代码
最近又做了一些内核hook的工作,繁琐的地方在于二进制指令的可读性上,下面简要记录dump出指令二进制,之后利用binutils来转成可读的汇编代码.hook的主要流程参考之前的linux内核态hook模块-splice,主要就是构建一个trampoline的代码区域,主要的工作就是操作堆栈,返回地址,还有修复跳转地址.不聊这么复杂的东西,回归主题,dump指令很简单,将指令按照16进制打印出来,4个字节一组void dump(void *buf, int len) { int i = 0;原创 2020-05-22 17:40:51 · 2096 阅读 · 0 评论 -
linux内存-x86-64页表初始化
x86-64的地址空间x86-64的页表初始化原创 2020-05-22 00:44:50 · 2738 阅读 · 0 评论 -
linux为什么限制用户栈空间的大小
coding的时候为什么不建议申请太大的临时变量,例如下面得这样的用法:int fun() { char buf[8192]; ...}我们通过ulimit -a看到系统对当前进程的栈size进行了限制,大部分是8M1.内核中对于每个线程的内核栈进行了限制,一般是8kb,它在栈底部放置了thread_info信息,当栈越界的时候就会乱写thread_info信息,基本上就会触发内核崩溃.为什么栈不放的大一点?每个线程的内核栈在创建线程的时候就已经实际分配了,一个线程就算什么也不做,它也占据了原创 2020-05-21 00:15:42 · 2578 阅读 · 4 评论 -
浅析linux内存管理
CPU能够看到虚拟地址,MMU能够看到物理地址虚拟地址是指针,而物理地址是整数?CPU如何访问内存地址?MMU根据页表进行转换地址转换,还进行权限管理TLB进行页表缓存权限:进行内存保护,读写执行和用户/内核权限page fault是CPU提供的机制,地址不可访问就是在页表中不存在,权限不对其中这个权限是用户和内核空间模型的基础,用户坚决访问不了内核空间MPU:内存权限管理物理地...原创 2020-05-18 20:22:23 · 856 阅读 · 0 评论 -
linux内存中的page,pte,alloc_page的flag
内核中关于内存的这几个flag容易混淆,他们的功能相互关联,下面简要总结一下他们的区别,其中的重要flag的用途页表项的flag:使用页表项的有两个:CPU和MMU,MMU的功能有两个,将虚拟地址转换为物理地址,检查访问权限是否合法,它是arch完全相关的page的flag:page是物理地址空间管理的元数据,它是纯粹的软件概念,基本是通用的alloc_page的flag:根据物理内存的稀有程序,它受到区别对待分成了ZONE_DMA,ZONE_DMA32,ZONE_NORMAL,ZONE_HIGH;而原创 2020-05-17 23:53:11 · 2755 阅读 · 0 评论 -
linux fork COW机制分析
1.整体设计2.拷贝时3.使用时按需分配原创 2020-05-12 01:01:26 · 1757 阅读 · 0 评论 -
linux内存管理-per cpu数据管理
per-CPU是2.6内核中引入的,它是一种典型的空间换时间的方案,通过为每个处理器都分配自己的内存区间来避免并发问题, 访问per-CPU变量几乎不需要锁,只需要微不足道的原子操作.每个处理器都在其自己的副本上工作,这些副本是如何生成的呢?静态分配的per-CPU结构设计分为两个阶段:编译阶段和运行时阶段在编译阶段,实际上只生成了一个CPU原本。系统中所有per-CPU结构都放到了一个叫做data.percpu的section中,在ld.S链接脚本有如下内容:__per_cpu_load =原创 2020-05-11 18:18:07 · 535 阅读 · 0 评论