自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

bobbypollo的专栏

码农随笔

  • 博客(30)
  • 资源 (1)
  • 收藏
  • 关注

原创 python工程的合理化组织(详解import)

根据自己对python的一些困惑,研究整理的内容

2024-09-07 09:50:12 958

原创 python之4类回调函数的使用方法

将函数作为参数传递给另一个函数,一共分为4种情况:将普通函数传递给普通函数 将普通函数传递给类成员函数 将类成员函数传递给普通函数 将类成员函数传递给类成员函数这4种情况,在python中都支持。#!/usr/bin/python3class Person: def __init__(self): pass def callback(s...

2019-09-02 10:44:32 5315

原创 拿到死机backtrace堆栈后如何确认死在哪一行源码(ARM+Android平台反汇编分析举例)

目录Android上如何用debuggerd拿到死机堆栈拿到死机堆栈后如何分析分析backtrace文件反汇编分析.so文件反汇编分析.o文件相关附件Android上如何用debuggerd拿到死机堆栈关于debuggerd的原理,在这里就不赘述了。需要注意两点:1,确保要调试的进程中没有重写信号处理函数。在我们的中间件中,libqin_buslib.s...

2019-01-01 11:00:54 2711 1

原创 SPI Flash的擦写注意事项

从规格书上看,SPI flash一般支持3种擦写方式:按sector擦写,按block擦写,整片chip擦写。以KH25L3255E为例,•      Serial Peripheral Interface compatible -- Mode 0 and Mode 3•      33,554,432 x 1 bit structure or 16,777,216 x 2 bits (two I...

2018-04-12 08:24:11 18961

原创 UBI镜像的编程烧写注意事项

通过编程的方式往mtd设备中烧写ubifs的镜像,需要注意两点:1,擦除整个分区。注意:是擦除整个分区,而不是擦除要烧写的数据字节数!否则会导致ubiattach出错!2,要忽略本block尾部的所有空页(0xff的page),计算方法就是对每个要烧写的block数据,从尾部开始计算0xFF字节的数量,然后进行page对齐。/*min_io_size: page size.length: usua...

2018-04-12 08:21:39 994

原创 openssl rsa相关命令

从私钥导出公钥openssl rsa -in private.pem -pubout -out public.pem将PEM格式的私钥导出到文本格式:openssl rsa -in inspur_rsa_key1.pem -text -out inspur_rsa_key1.txtrsa_private_key.pem:-----BEGIN RSA PRIVATE KEY-----MIIEpAIB...

2018-04-12 08:16:44 2328

原创 zImage内核与ramdisk及bmem及vmalloc关系的研究探索

问题的初衷:将zImage的内核读入一段内存后,能否将rootfs(ramdisk方式运行)加载到紧挨着kernel之后?担心的问题:由于zImage内核的特殊性,在跳转至内核执行入口之后,内核会自己解压缩自己,解压缩时是否占用额外内存?如过占用kernel之后的内存做为解压缩缓冲,那么就会和rootfs地址发生冲突。测试:给定不带rootfs的kernel vmlinuz-7260a(SDK17...

2018-04-12 08:11:50 1129

原创 tcmalloc库两种用法的符号替换原理

利用LD_PRELOAD来加载tcmalloc库在编译时显式链接tcmalloc库试验试验1:不链接tcmalloc试验2:仅显式链接tcmalloc试验3:显式链接libc和tcmalloc,libc在前试验4:显式链接libc和tcmalloc,tcmalloc在前结论利用LD_PRELOAD来加载tcmalloc库那么用户调用malloc肯定是走到tcmalloc中;在编译时显式链接tcma...

2018-04-12 08:01:51 2100

原创 MySlab--一种特殊的小内存分配器设计

概述设计方案内存布局名词解释span的状态与转移slab对span的管理span对object的管理申请内存的流程从slab中获取span从span中获取object更新span状态紧急内存分配释放内存的流程内存回收(page reclaiming)用户API相关结构体对外接口待优化概述在扩展tcmalloc进行内存诊断追踪时,记录内存的全局链表节点,本身也需要分配内存,如果采用tcmalloc默...

2018-04-12 07:57:11 290

原创 图的应用--动态库依赖关系解析

主程序及其依赖的动态库,可以构成一张有向图,其起始顶点为主程序。主程序的装载过程,就是有向图的遍历+构造过程。根据遍历方法的不同(BFS广度遍历和DFS深度遍历),动态库的加载顺序也有可能发生变化,这影响到了动态符号的绑定结果,比如不同动态库中含有相同的动态符号。根据有向无环图的特性,还能够判断这些动态库中是否存在循环依赖,也就是liba依赖libb,libb又依赖liba的情况。我们只需要对这些...

2018-04-12 07:55:19 1150

原创 AOV网的拓扑排序

在AOV(Activity On Vertex)网(有向无环图)中,用顶点来表示某个活动,用边来表示活动之间的某种先后顺序或者制约关系。如果有向图中的顶点序列 v1,v2,v3,...,vn 满足:若从顶点vi到vj有一条路径,那么在此序列中vi必然排在vj之前。这个序列我们称之为拓扑序列。对有向图的所有顶点进行构造拓扑序列的过程,就叫做拓扑排序。另外,对一个有向图进行拓扑排序,结果可能不唯一。...

2018-04-11 09:38:24 1794

原创 如何理解Dijkstra算法(最短路径)

假设N=(V,{E})是连通网,V是顶点集合,共有n个顶点;对“最短路径“的两个理解:case-1,顶点V0到其它所有顶点的最短路径。case-2,顶点V0到顶点Vi的最短路径。对于Dijkstra算法来说,一次性求出V0到其它所有顶点的最短路径的时间复杂度是O(n^2).Dijkstra算法采用贪心思想,从V0出发,层层向外扩散,一步步求出V0到Vi之间所有顶点的最短路径,最终求得了V0~Vi的...

2018-04-11 09:37:02 814 1

原创 如何理解经典Prim算法---邻接矩阵图与双重链表图

经典Prim算法经典的Prim算法,都是利用邻接矩阵图来实现的,我认为算法的精妙之处在于仅利用双重循环就实现了MST构造,循环次数仅和顶点个数有关,这对于边稠密的图来说,确实是非常高效的。然而,经典Prim算法并不好理解,原因在于没有彻底搞明白一些辅助变量(数组)所表示的真正含义。对于临时数组变量的理解经典Prim算法,在循环构造MST的过程中,至少(或主要)依赖两个临时数组:candidate_...

2018-04-11 09:35:38 543

原创 理解递归的本质:递归与栈

递归的基本思想所谓递归,就是有去有回。递归的基本思想,是把规模较大的一个问题,分解成规模较小的多个子问题去解决,而每一个子问题又可以继续拆分成多个更小的子问题。最重要的一点就是假设子问题已经解决了,现在要基于已经解决的子问题来解决当前问题;或者说,必须先解决子问题,再基于子问题来解决当前问题。或者可以这么理解:递归解决的是有依赖顺序关系的多个问题。我们假设一个抽象问题有两个时间点要素:开始处理,结...

2018-04-11 09:34:08 32319 10

原创 栈和队列的对比

众所周知,栈的特点是先入后出(FILO),队列的特点是先入先出(FIFO),这便是两者最大的区别。但从更深入的角度去理解,我认为栈是比队列更高级的数据结构,嗯,“这个栈比较高级“。栈能实现更复杂的算法,理由如下:1,栈结构记录了数据访问的返回路径(回溯),而队列没有。或者说,栈同时完成了数据的正序访问(入栈的过程)和逆序访问(出栈的过程),而队列只完成了顺序访问(入队列和出队列都是正序访问)。2,...

2018-04-11 09:33:19 1579

原创 关于线程栈与线程地址空间

线程栈与地址空间Linux系统把所有线程都当做进程来实现,线程作为轻量级进程(LWP)。线程仅仅被视为一个与其他进程共享某些资源的进程,而是否共享地址空间几乎是进程和 Linux 中所谓线程的唯一区别。线程创建的时候,加上了 CLONE_VM 标记,这样 线程的内存描述符 将直接指向 父进程的内存描述符,也就是说,线程的mm_struct *mm指针变量和所属进程的mm指针变量相同。所有线程都共享...

2018-04-11 09:30:23 2988

原创 避免僵尸线程:线程资源的回收与join、detach

#include <pthread.h>#include <stdio.h>void* __task(void*arg){ return (void*)0;}int main(int agrc, char**argv){ int i = 0; pthread_t pid = 0; int ret = 0; pthread_attr_t attr; for(i=0; i&lt...

2018-04-11 09:27:41 3703

原创 wine的工作原理与自动运行PE程序

一次偶然的情况,发现我电脑上的linux可以直接使用./来执行tools/vnd/BCM7584UPKFxBA/brcm_sign_enc.exe程序,但是另外一台linux电脑就不可以。使用file命令查看该文件是windowsPE格式的程序。由于我电脑上有wine,猜测它是通过wine来执行的,因此 cat /proc/PID/maps,发现确实是被wine执行的,代码段加载了很多wine相关...

2018-04-11 09:25:17 5238

原创 C++成员函数的拦截方法

概述利用preload方式对动态库中C语言函数调用进行拦截,有时候会达到剑走偏锋的效果。例如,在DVB+Dongle的产品中,我们就采用了这种方案,在不需要修改甚至重新编译原中间件及SDK的前提下,截获了SDK库中的部分接口调用,从而轻松抓取到OSD图层数据及解扰后的视频流。preload原理如下图,图1 注入libhack.so前后的接口调用路径如图,利用ld_preload向应用的进程空间高地...

2018-04-11 09:17:27 1863

原创 MIPS backtrace的实现方案

概述backtrace获取的是当前函数的纵向调用信息。一般思路是,给定当前函数的栈地址和当前运行位置(PC),通过计算得到当前函数的返回地址和上层函数(caller)的栈地址,然后以当前函数的返回地址作为caller的PC,来继续解析caller的返回地址和caller of caller的栈地址,以此类推进行纵向解析。不管什么处理器架构,其GCC工具链提供的libgcc库中,都自带一个unwin...

2018-04-11 08:53:52 2240 2

原创 安装ubuntu(16.04)后要做的事

1, gnome-tweak-tool窗口最大化按钮2,右键打开终端sudo apt-get install nautilus-open-terminal3,安装jdksudo add-apt-repository ppa:webupd8team/javasudo apt-get updatesudo apt-get install oracle-java8-installer4,安装g++5,安...

2018-04-10 22:03:45 631

原创 链接选项 -rdynamic与动态符号表

注意,这是链接选项,而不是编译选项。在将c文件编译成.o的过程中,使用rdynamic是没有任何效果的。只有将.o链接成elf时,才有效果。这主要是对可执行程序而言的,而编译动态库时,即使没有rdynamic选项,默认也会将非静态函数放入动态符号表中(刻意隐藏的函数除外)。一个验证方法显示可执行程序文件内的动态符号(注意,仅仅是动态符号):readelf -Ds a.out默认情况下,可执行程序(...

2018-04-10 22:01:46 11668

原创 全局符号介入(global symbol interpose)的几种方法

1,preload2,显式链接时将介入库放在被介入库的前面,例如,我们利用tcmalloc来hack malloc等函数,那么显式链接tcmalloc时,应保证在libc前面。这样加载时会先加载libtcmalloc,再加载libc。3,编译生成动态库时使用-z interpose选项,会在动态库的符号表中存一个INTERPOSE的flag,动态链接器在加载进程时,判断该flag并优先载入其符号....

2018-04-10 21:59:25 1816

原创 MIPS 动态符号的延迟绑定

概述MIPS平台中动态库的装载与解析原理,网上资料并不多,而且很多讲解都是错误的,甚至MIPS宝书《see mips run》中也没有提供详细的方案。因此本人只好通过代码走读和运行验证的方法来详细了解其原理。之所以要了解mips动态符号的解析调用,是因为之前在实现mips backtrace时,对一些调整gp的指令存在疑惑,顾而深入研究一下。先上结论:MIPS动态库中的外部符号调用,是依赖.got...

2018-04-10 21:58:13 1260

原创 关于动态符号表及“全局符号表”

elf.h中对符号表的类型定义如下:#define DT_STRTAB 5 /* Address of string table */#define DT_SYMTAB 6 /* Address of symbol table */这里DT_SYMTAB与DT_STRTAB对应的section其实是.dynsym和.dynstr,而非.symtab和.symstr!.symtab和.dynsy...

2018-04-10 21:54:15 5670 1

原创 进程装载时各动态库的.init段的执行顺序

我们知道:1,每个动态库都有.init段,.init段的代码会在main函数之前执行。我们可以自定义.init函数,例如,__attribute__ ((constructor)) static void __my_init_func(void){ .......}2,启动进程时,LD_PRELOAD指定的动态库,会被优先加载(位于进程地址空间的顶端处)。那么,LD_PRELOAD的动态库,其.i...

2018-04-10 21:49:59 2118

原创 子类的构造与析构原理--深入阐述虚析构函数的重要性

通过反汇编(objdump -Dsx)分析得知,编译器在编译子类时,会自动把调用基类构造(析构)函数的代码嵌入到子类的构造函(析构)函数体中,也就是说,子类的构造(或析构)函数会自动调用基类的构造(或析够)函数。当子类的构造函数中没有显式调用基类构造函数时,会默认调用基类的无参构造函数,否则会调用基类的指定参数的某构造函数。从上述原理来看,子类指针指向子类对象的情况下,delete子类指针必然会调...

2018-04-10 21:45:45 931

原创 C++函数模板之模板参数的嵌套传递

以函数“指针“作为模板参数传递给函数模板,该函数“指针“即可以是普通函数,又可以是函数模板。#include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream>using namespace std;template<typename T, void(*pVisi...

2018-04-10 21:44:23 6413 1

原创 C++多重继承时的二进制兼容问题分析

多重继承下的对象内存布局参考如下文章:https://www.cnblogs.com/itech/archive/2009/02/28/1399995.htmlhttps://blog.csdn.net/li_ning_/article/details/51893748https://blog.csdn.net/tangaowen/article/details/5830803多重继承时的二进制兼...

2018-04-10 21:41:15 459

翻译 KDE设区--C++的二进制兼容问题

定义关于ABI能做的和不能做的能做的不能做的动态库开发的相关技术位域标志(bitflags)D指针问题解答向没有D指针的类中添加新成员变量添加一个重新实现的虚函数使用一个新类向叶子类中添加虚函数用信号取代虚函数不兼容问题举例定义一个动态库的二进制兼容性指的是,一个依赖该动态库的可执行程序,在不重新编译的情况下,直接替换上该动态库的更新版本也能正确运行。译者解析:C++动态库的二进制兼容性,从本质上...

2018-04-10 21:38:53 396

posix多线程编程中文版

一本关于posix线程的比较经典的教材,写这本书的认识参与制定posix标准的人

2010-09-01

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除