10 wjx5210

尚未进行身份认证

我要认证

积极努力...

等级
TA的排名 9w+

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

mips汇编中的.set伪指令

在mips中.set xxx是一条伪指令,它指示汇编器如何处理之后的汇编代码,典型的有以下几种:.set push --> save all settings.set reorder/noreorder --> let/don't let assembler reorder instructions.set at/noat --> let/don't let assembler use the register $at in instruction aliases (li,la, e

2020-09-21 16:39:01

QMP和QM

QM(qemu monitor)是一个能够和QEMU模拟器进行交互的工具,通过QM能够完成查询虚拟机的内部状态,进行设备的热插拔,虚拟机的迁移/备份/快照等功能。而QMP(Qemu Monitor Protocol)是一种基于JSON格式的传输协议,定义了与虚拟机的交互规范,底层支撑了QM的实现。一般手工维护大部分都是用QM,而做批量维护或者二次定制就需要基于QMP进行封装。有多种方法使用QM/QMP,一般主要通过tcp和unix socket。通过TCP使用QM/QMP使用-monitor添加QM相

2020-09-19 10:55:15

linux hook方法整理

在计算机中,基本所有的软件程序都可以通过hook方式进行行为拦截,hook方式就是改变原始的执行流,下面简要分类linux系统下的各种hook方式,主要有三类:修改函数指针,直接修改指令,利用系统提供的注册机制.函数指针hookC语言的一项强大的功能就是指针,指针代表一个地址,而函数指针就是指向一个函数地址的指针,通过函数指针来指向不同的函数地址控制执行流.一般这类函数指针存在于软件运行的整个周期中,要实施这类hook首先就是找到关键的函数指针,之后就和普通的指针修改一样进行改变就OK.函数指针的使

2020-08-20 15:16:49

linux应用层内存统计

在内核中有很多的机制:KASAN,slab debug等,在应用层也有很多的优秀的工具:valgrind, ASAN,tcmalloc, glibc memcheck等。这里不讲这些已知的方案,只总结一下基于glibc的内存debug方法,主要分为两大类:一种是需要修改api名称,例如将malloc改成debug_malloc,另外一种不需要修改api名称。

2020-07-06 23:41:20

变长参数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

静态编译文件是否真的到处可运行

这里只讨论一个问题,基于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

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

linux虚拟文件系统综述

Linux延续了Unix的一个哲学观点:一切皆文件,应用看到的所有对象都是文件,里面除了socket不那么典型之外所有都是文件。而实际情况非常复杂,内核管理着非常多的设备:字符设备、块设备、网络设备,还支持许多类型的文件系统:ext2、ext3、ext4、fuse、ntfs等,另外还有很多的伪文件系统:proc、devfs、sys、debugfs等,特殊的节点类型:netlink、notify、epoll等。没有什么是不能通过增加一个抽象层解决的,VFS就作为linux中的这一抽象层完成了一切皆文件的哲学观

2020-06-16 20:24:56

linux内存管理-反向映射

为什么需要反向映射正向映射是通过虚拟地址根据页表找到物理内存,反向映射就是通过物理地址找到哪些虚拟地址使用它。应用场景:页面回收compaction匿名页的反向映射文件页的反向映射struct anon_vma {}struct anon_vma_chain}...

2020-06-11 11:16:06

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

linux内存管理-页面规整

页面整理页面申请失败有两种情况:1.空闲页不够,触及到回收的阈值2.申请order > 0的连续页时找不到连续的物理内存

2020-06-06 02:08:41

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

linux bootmem memblock的演进

有人可能认为在系统启动的时候内存的分配应该非常容易:基本上所有的内存都是可用的,不需要考虑并发性。尽管如此,boot阶段的内存管理仍然不是一个简单的任务。物理内存不一定是连续的,系统之间他们的分布更是有很大的不同,如何检测内存的布局就不是一个简单的任务。在NUMA的机器上这件事情更加复杂,在内存分配的时候还需要考虑在当前节点上分配,构建内存的拓扑图。为了应对这些问题,在启动过程中的早期阶段需要一些复杂的机制来进行内存管理工作。有人会问,为什么不一开始就使用buddy这些系统来管理呢?因为linux的页分配

2020-05-30 01:41:33

反汇编二进制代码

最近又做了一些内核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

linux内存-x86-64页表初始化

x86-64的地址空间x86-64的页表初始化

2020-05-22 00:44:50

linux为什么限制用户栈空间的大小

coding的时候为什么不建议申请太大的临时变量,例如下面得这样的用法:int fun() { char buf[8192]; ...}我们通过ulimit -a看到系统对当前进程的栈size进行了限制,大部分是8M1.内核中对于每个线程的内核栈进行了限制,一般是8kb,它在栈底部放置了thread_info信息,当栈越界的时候就会乱写thread_info信息,基本上就会触发内核崩溃.为什么栈不放的大一点?每个线程的内核栈在创建线程的时候就已经实际分配了,一个线程就算什么也不做,它也占据了

2020-05-21 00:15:42

浅析linux内存管理

CPU能够看到虚拟地址,MMU能够看到物理地址虚拟地址是指针,而物理地址是整数?CPU如何访问内存地址?MMU根据页表进行转换地址转换,还进行权限管理TLB进行页表缓存权限:进行内存保护,读写执行和用户/内核权限page fault是CPU提供的机制,地址不可访问就是在页表中不存在,权限不对其中这个权限是用户和内核空间模型的基础,用户坚决访问不了内核空间MPU:内存权限管理物理地...

2020-05-18 20:22:23

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

linux fork COW机制分析

1.整体设计2.拷贝时3.使用时按需分配

2020-05-12 01:01:26

查看更多

勋章 我的勋章
  • 签到新秀
    签到新秀
    累计签到获取,不积跬步,无以至千里,继续坚持!
  • 阅读者勋章Lv2
    阅读者勋章Lv2
    授予在CSDN APP累计阅读博文达到7天的你,是你的坚持与努力,使你超越了昨天的自己。
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  • 勤写标兵Lv2
    勤写标兵Lv2
    授予每个自然周发布4篇到6篇原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。
  • 学习力
    学习力
    《原力计划【第二季】》第一期主题勋章 ,第一期活动已经结束啦,小伙伴们可以去参加第二期打卡挑战活动获取更多勋章哦。
  • 原力新人
    原力新人
    在《原力计划【第二季】》打卡挑战活动中,成功参与本活动并发布一篇原创文章的博主,即可获得此勋章。
  • 分享达人
    分享达人
    成功上传6个资源即可获取