ASM

linux syscall 详解【转】

断了今生、忘了曾经 提交于 2021-01-07 23:50:13
转自: https://blog.csdn.net/feixin620/article/details/78416560 引言:分析Android源码的过程中,要想从上至下完全明白一行代码,往往涉及app、framework、native一直到kernel,可能迷失到代码世界,明白了系统调用原理,或许能帮你 峰回路转 ,找到进入kernel函数的入口。本文主要讲解ARM架构相关源码: /bionic/libc/kernel/uapi/ asm-arm/ asm/unistd.h /bionic/libc/arch-arm/syscalls/kill.S /kernel/arch/arm/kernel/calls.S /kernel/arch/arm/include/Uapi/ asm/unistd.h /kernel/include/uapi/ asm-generic/unistd.h /kernel/include/linux/syscalls.h /kernel/kernel/signal.c /kernel/arch/arm/kernel/entry-common.S /kernelarch/arm/kernel/entry-armv.S 一、Syscall意义 内核提供用户空间程序与内核空间进行交互的一套标准接口,这些接口让用户态程序能受限访问硬件设备,比如申请系统资源

C#程序集相关的概念

风格不统一 提交于 2021-01-06 22:56:03
程序集包含:类型元数据(描述在代码中定义的每一类型和成员,二进制形式)。程集元数据(程序集清单、版本号、名称等)、IL代码(这些都被装在exe或dll中)、资源文件。每个程序集都有自己的名称、版本等信息,这些信息可以通过AssemblyInfo.cs文件来自己定义。 获取一个类的类型 person p=new person(); Type Type=p.getType(); 得到一个类的类型 Type type=typeof(Person); 获取一个类型的父类 Type type=s.GetType().BaseType; 获取Person类型的所有方法(不包括私有方法) Person p=new Person(); Type personType=p.GetType(); MethodInfo[] methods=personType.GetMethods(); foreach(var item in methods) { Console.Writeline(item.Name); } 获取一个类型的属性: PropertyInfo[] properties=persontype.GetProperties(); 遍历数组的时候返回的类型为PropertyInfo 获取一个类型的所有字段:FieldInfo[] fields=typeof(Person).GetFiels()

58无埋点数据采集技术在Android端实践

六眼飞鱼酱① 提交于 2021-01-06 18:14:55
本文转载自公众号 58架构师 ,已经作者授权! 作为国内最大分类信息生活服务平台,58集团旗下各个产品都会投入大量人力进行用户行为的分析,来提升运营效率。但是各个产品对用户行为的分析需求基本是相似的。在这样的背景下,我们自研了WMDA 无埋点用户行为分析平台,并提供对PC、M、APP三端支持,帮助各个业务线更好的挖掘用户真实行为。 对于SDK的使用,业务方不需要手动埋点,几行代码,即可实现数据的全量采集。对于移动端SDK来说,采集数据的准确性、及时性、全面性等因素直接决定后续用户行为的分析。本文将从技术选型、技术实现方案角度详细介绍Android端无埋点数据采集技术。 一、技术选型 首先,技术是为需求提供服务的,WMDA的定位是采用无埋点技术来实现用户行为的分析。同时辅助解决手动埋点不易维护,容易出现错埋、漏埋等痛点问题。所以SDK在采集用户行为数据的同时,对开发效率、采集性能、准确性、实时性等有很高的要求,而且需要支持数据的可回溯。 通过对市面上现有埋点技术调研,目前技术方案上大体分为三类: 传统代码埋点 实现方案:Coding阶段手动埋点。 代表解决方案:友盟、百度统计。 优点:灵活、准确,可以定制化。 缺点:业务埋点量非常大,开发成本高,不易维护,如果要修改、新增埋点,需要重新发版。 动态埋点 实现方案:利用AccessibilityDelegate对每个view实例设置代理

一张图看懂linux内核中percpu变量的实现

社会主义新天地 提交于 2021-01-04 15:03:00
我们在使用各种编程语言进行多线程编程时,经常会用到thread local变量。 所谓thread local变量,就是对于同一个变量,每个线程都有自己的一份,对该变量的访问是线程隔离的,它们之间不会相互影响,所以也就不会有各种多线程问题。 正确的使用thread local变量,能极大的简化多线程开发。所以不管是c/c++/rust,还是java/c#等,都内置了对thread local变量的支持。 但你知道吗,不仅是在编程语言中,在linux内核中,也有一个类似的机制,用来实现类似的目的,它叫做percpu变量。 percpu变量,顾名思义,就是对于同一个变量,每个cpu都有自己的一份,它可以被用来存放一些cpu独有的数据,比如cpu的id,cpu上正在运行的线程等等,因该机制可以非常方便的解决一些特定问题,所以在内核编程中被广泛使用。 好奇的你们肯定都在问,它是怎么实现的呢? 我们先不管细节,先来看一张图,这样从全局的角度来了解下它的实现。 从上图中我们可以看到,各种源文件中通过DEFINE_PER_CPU的方式,定义了很多percpu变量,这些变量根据vmlinux.lds.S中的相关定义,会被linker聚合在一起,然后放到最终vmlinux文件的,一个名叫.data..percpu的p里。 这些变量的地址也是被特殊处理过的,它们从零开始依次递增,这样一个变量的地址

[友链]

≡放荡痞女 提交于 2020-12-31 05:03:10
同级巨佬: Prutekoi 羊肉汤泡煎饼 喵の耳 ChrisK Siilhouette nofind Phemon KGB1331 lky 天 青色Z_c the_Death 学长: *Miracle* ydnhaha i207M ywy_c_asm nekko Zhang_RQ _23333 YoungNeal communist zhoutb2333 来源: oschina 链接: https://my.oschina.net/u/4301494/blog/3455680

go runtime debug 小技巧

依然范特西╮ 提交于 2020-12-24 15:49:01
前言 本意是打算研究一下go程序的启动流程,然后就去网上搜索了一下入门教程。结果令我有点沮丧,搜到的几乎所有文章开篇都是通过 GDB 调试, 然后就是不同平台下的汇编代码。。。 这令我很不开心, 虽然C/C++应用很广泛, 但是我对它真的没啥兴趣啊, 对它相关的调试工具就更加不感冒了, 虽然它可以调试go程序, 但是总感觉心里少了点什么, 难道 dlv 它不香嘛, 于是就有了今天这篇文章。 dlv命令行debug dlv的名头应该不用我多说, 所以我们直奔主题 1. 开始debug dlv debug test.go 执行上述命令后, 就会进入debug交互命令行界面, 在这个界面任何时候输入 h 都会打印帮助信息. 2. 增加函数断点 交互界面输入下面命令后,会在main包下的main函数打上一个断点 b main.main 3. 指定行断点 在test.go的文件第6行打上一个断点 b test.go:6 4. 开始执行 如上图所示, 我们继续执行时会发现 => 会停留在我们前面标记的断点处。这里的其他命令我们在本篇文章不做过多的介绍了, 我们尽量紧扣本篇的主题。 5. 打印调用栈 如上图所示, 我们通过dlv的调用栈可以看见调用main函数之前,还执行了asm_amd64.s(本次debug的机器为mac)的汇编代码和proc.go的main函数。 意外之喜,

8086汇编语言程序设计——子程序与模块化

前提是你 提交于 2020-12-23 03:24:03
标准的子程序结构 利用跳转可以实现子程序调用。所谓调用,实际上就是程序转移到该标号去继续执行。。这种方式虽然简便,但是在模块化程序结构设计中,是不规范的。尤其是其它模块中的某个程序想要调用这个子程序时,还需要指明该子程序标号是在哪个模块、哪个代码段的哪个程序中。 标准的用法是用8086汇编语言提供的过程定义伪指令PROC来定义子程序。 示例 从键盘键入一个多位十进制数X,回车结束输入。按十进制位相加后显示十进制结果Y。 设计思路: (1) 主程序分别调用三个子程序。 (2) 子程序SUBR1为键盘输入多位十进制数且直接保存到X,输入的位数在BX; (3) 子程序SUBR2将保存的X去掉ASCII码,按位相加,相加的结果在BX中; (4) 子程序SUBR3将BX中的数用十进制显示; (5) 采用将结果除以10保存余数的方法将BX中的数转换为十进制数,并用十进制数的ASCII码显示结果。 (6) 传参寄存器为BX。 代码: 1 ; a.asm 键入一个十进制数x,按位相加后显示十进制结果y。 2 data segment 3 infor1 db 0ah,0dh, ' x=$ ' 4 infor2 db 0ah,0dh, ' y=$ ' 5 x db 20 dup(?) 6 data ends 7 code segment 8 assume cs: code, ds: data 9

一文带你了解传统手工特征的骨龄评估方法的发展历史

北战南征 提交于 2020-12-22 19:29:19
摘要 :基于传统手工特征的骨龄评估方法主要包括预处理、关键区域检测、手骨分割、特征提取、测量五个步骤。 基于传统手工特征的骨龄评估方法主要包括预处理、关键区域检测、手骨分割、特征提取、测量五个步骤,见图1,以下为该类方法的发展历史介绍。 图1 前人基于手工特征的骨龄评估方法的主要技术路线 1989年,Michael和Nelson共同开发了世界上第一套基于模型的半自动化手骨测量系统,并将其命名为HANDX。该系统包含了三个主要模块:预处理、分割和测量。首先构造直方图模型用于增强图像,使用高斯分布函数将图像大致分为三类:背景,软组织和骨骼;然后,采用自适应轮廓逼近算法逐步勾勒出每块骨骼的形状;最后,通过找到每块骨骼的长轴和短轴来计算测量值。HANDX系统需要基于手的位置作为先验知识输入到系统中,并未进行大规模的数据测试。 1991年,Pietka等人提出了一种基于测量指骨长度来估计骨龄的简便方法。通过对二值化后的图像缩小范围,确定大致的指骨及其骨骺感兴趣区(phalangeal ROI,PROI)并对图像进行旋转,获得大致PROI垂直正位X光片,使用Sobel梯度算子进行边缘检测,根据经验选择合适的阈值,从而获得指骨及其骨骺的边缘图。然后根据中指位于图像最顶端的特性,找出中指的近端指骨、中端指骨和远端指骨并测量他们的长度。通过查阅中指的标准指骨长度表,对应给出大致估计的骨龄

F5:如何在构建合规体系的同时,给用户提供强有力的攻防手段?

我怕爱的太早我们不能终老 提交于 2020-12-21 19:12:06
  关于安全产品的部署在业界一直有几种不同的声音,有一种认知是认为安全主要就是为了合规的,在合规的前提下,其他的都不太重要。但对于用户的实际价值来说,攻防能力的体现可能显得更为重要,由于安全攻击本身是一个动态的变化过程,这要求安全防护也能够适应变化,能随着攻击手段的变化而调整,满足不同场景下的防护要求,这实际上就是攻防能力的最高体现。   F5的DDoS防护体系是一个立体的多层次防护体系,目的是在构建合规体系的同时,给用户提供强有力的攻防手段,真正能够帮助用户的业务抵御层出不穷的各种安全威胁。安全既要合规,更要攻防!   从实际经验来看, Bot防范是Web防御的重中之重,应用层DDoS防御是WAF的职责所在,到场服务和应急响应是成功阻截攻击的先决条件。实际上,F5的DDoS防护体系是一个立体的多层次防护体系,除了Advanced WAF(API安全-新一代WAF),还包括了云端的DDoS清洗,网络层面的DDoS防护,以及Advanced WAF(API安全-新一代WAF)所擅长的应用层DDoS防护,通过立体防护架构的建立,在面对混合式攻击时能够有效地分别有效应对。   F5 7层DDoS防御方案一览:   针对于DDoS的不同场景,F5 Advanced WAF(API安全-新一代WAF)准备了相应的组合策略的防御方案,来应对不同的DDoS场景。包括:     

Linux内核中锁机制之原子操作、自旋锁

。_饼干妹妹 提交于 2020-12-14 04:42:50
很多人会问这样的问题,Linux内核中提供了各式各样的同步锁机制到底有何作用?追根到底其实是由于操作系统中存在多进程对共享资源的并发访问,从而引起了进程间的竞态。这其中包括了我们所熟知的SMP系统,多核间的相互竞争资源,单CPU之间的相互竞争,中断和进程间的相互抢占等诸多问题。 通常情况下,如图 1所示,对于一段程序,我们的理想是总是美好的,希望它能够这样执行:进程 1先对临界区完成操作,然后进程 2再去操作临界区。但是往往现实总是残酷的,进程 1在执行过程中,进程 2很可能在此插入一脚,导致两个进程同时对临界区进行读写访问,读是没有问题,但写的话问题就大了。这样的话,得到的结果往往不是我们想要的。 图 1 一个简单的例子 因此,我们需要一些解决方法,在 Linux内核中它提供了如下几种锁机制,供用户在针对不同情况分别或配合使用,包括:原子操作、自旋锁、内存屏障、读写自旋锁、顺序锁、信号量、读写信号量、完成量、 RCU机制、 BKL(大内核锁 )等等,下面笔者将分五篇博文一一讨论这些锁机制。另外,本文所涉及的关于 Linux内核源码采用版本为: Linux 3.3.1。 OK,让我们首先讨论有关原子操作和自旋锁的相关内容吧。 一、原子操作 所谓的原子操作即是保证指令以原子的方式执行,它在执行过程中不被打断。它包括了原子整数操作和原子位操作,在内核中分别定义于 include