- 博客(88)
- 资源 (15)
- 收藏
- 关注
原创 如何在拷贝文件时保留SELinux上下文
如果要在拷贝一个文件的时候保留其SELinux的上下文,有一个非常简单的方法,直接在拷贝的时候可以加上--preserve=context参数就可以了:cp --preserve=context <Source> <Dest>不过这样做有一个要求,就是当前的Linux内核必须已经激活了对SELinux的支持。如果很不幸没有打开的话,cp命令会报错:当然了,把当前Linux内核上对SELinux的支持打开就可以解决问题了。不过不是所有场景都可以打开对SELinux的支
2021-01-26 19:41:40 6544 1
原创 ARM架构下常用GNU汇编程序伪指令介绍(Assembler Directive)
所有的GNU汇编程序伪指令都以句号(.)打头,后面接上伪指令的名字,通常是由小写字母组成。.section.subsection.pushsection.popsection.previous.ascii语法: .ascii "string"....ascii 表示零个或多个(用逗号隔开)字符串,并把每个字符串(结尾不自动加“\0”字符)中的字符放在连续的地址单元。还有一个与.ascii 类似的.asciz,z ...
2020-08-07 17:08:06 16687
原创 Linux内核同步原语之信号量(Semaphore)
static inline int __sched __down_common(struct semaphore *sem, long state, long timeout){ struct semaphore_waiter waiter; list_add_tail(&waiter.list, &sem->wait_list); waiter.task = current; waiter.up = false; for (;;) { if...
2020-07-30 20:38:34 8935 1
原创 Linux同步原语之顺序锁(Sequence Lock)
(代码位于arch/arm64/include/asm/atomic.h中):#define ATOMIC_OP(op) \static inline void arch_##op(int i, atomic_t *v) \{ \ __lse_ll_sc_body(op, i, v); \}ATOMIC_OP(atomic_andnot)ATOMIC_OP(atomic_or)ATOMIC_OP(atomic_xor)ATOM...
2020-07-29 14:54:19 6069
原创 ARMv8.1平台下新添加原子操作指令
Large System Extensions (LSE)New atomic instructions to support scalable performance: Instructions for full-word, half-word, and byte operations are available. Most of the following have optional load-acquire and/or store-release semantics. Compare an
2020-07-28 17:25:40 14991 3
原创 Arm64内存屏障
smp_load_acquire()forces a read of a location in memory (in much the same way asACCESS_ONCE()), but it ensures that the read happens before any subsequent reads or writes. smp_store_release()writes a value back to memory, ensuring that the write h...
2020-07-22 09:05:13 13450 2
原创 ARM64平台下WFE和SEV相关指令解析
WFEWait For Event.If the Event Register is not set,WFEsuspends execution until one of the following events occurs:An IRQ interrupt, unless masked by the CPSR I-bit. An FIQ interrupt, unless masked by the CPSR F-bit. An Imprecise Data abort, unles..
2020-07-20 14:24:34 16608 1
原创 Linux内核中的READ_ONCE和WRITE_ONCE宏
#define __READ_ONCE(x, check) \({ \ union { typeof(x) __val; char __c[1]; } __u; \ if (check) \ __read_once_size(&(x), __u.__c, sizeof(x)); \ else \ __read_once_size_nocheck(&(x), __u.__c, sizeof(x)); \ smp...
2020-07-16 16:26:44 17335 7
原创 内存屏障简介
为了限制性能下降,CPU被设计成在从内存中获取数据的同时,可以执行其他指令和内存引用。这明显会导致指令和内存引用乱序执行,并导致严重的混乱仅仅在两个CPU之间或者CPU与设备之间存在需要交互的可能性时,才需要内存屏障。任何代码只要能够保证没有这样的交互,这样代码就不必使用内存屏障。但是,不使用内存屏障不代表不使用同步机制。重排序问题无时无刻不在发生,源自三种场景:编译器编译时的优化 处理器执行时的乱序优化 缓存同步顺序(导致可见性问题)...
2020-06-30 18:01:30 16306 6
原创 Linux时间子系统之Tick模拟层(Tick Sched)
在分析高分辨率定时器的时候曾经提到过,一旦切换到高精度模式后,struct tick_sched { struct hrtimer sched_timer; unsigned long check_clocks; enum tick_nohz_mode nohz_mode; unsigned int inidle : 1; unsigned int tick_stopped : 1; unsigned int idle_active : 1; unsigned
2020-06-05 16:28:08 12208
原创 Linux时间子系统之高分辨率定时器层(HR Timer)
在前面介绍定时器层的文章中我们已经知道了在Linux内核中已经存在了一个管理定时器的通用框架。不过它也有很多不足,最大的问题是其精度不是很高。哪怕底层的定时事件设备精度再高,定时器层的分辨率只能达到Tick级别,按照内核配置选项的不同,在100Hz到1000Hz之间。但是,原有的定时器层由于实现教早,应用广泛,如果完全替换掉会引入大量代码改动。因此,Linux内核又独立设计出了一个叫高精度定时器层(High Resolution Timer)的框架,可以为我们提供纳秒级的定时精度,以满足对精确时间有迫切需求
2020-05-28 20:24:22 11460
原创 Linux时间子系统之时间维护层(Time Keeper)
struct timekeeper { struct tk_read_base tkr_mono; struct tk_read_base tkr_raw; u64 xtime_sec; unsigned long ktime_sec; struct timespec64 wall_to_monotonic; ktime_t offs_real; ktime_t of...
2020-05-19 15:14:56 11118
原创 Linux时间子系统之时间的表示
为了实现以上功能,Linux 实现了多种与时间相关但用于不同目的的数据结构。1)jiffies和jiffies_64内核用jiffies_64全局变量记录系统自启动以来经过了多少次Tick。它的声明如下(代码位于kernel/time/timer.c中):__visible u64 jiffies_64 __cacheline_aligned_in_smp = INITIAL_JIFFIES;EXPORT_SYMBOL(jiffies_64);可以看出来jiffies_64被定义成了6
2020-05-11 14:56:46 7925 1
原创 Linux时间子系统之定时器层(Timer)
定时器层是基于Tick层之上的,精度比较低,struct timer_list { /* * All fields that change during normal runtime grouped to the * same cacheline */ struct hlist_node entry; unsigned long expires; void (...
2020-05-08 16:13:33 11646 5
原创 Linux时间子系统之时钟源层(Clock Source)
struct clocksource { u64 (*read)(struct clocksource *cs); u64 mask; u32 mult; u32 shift; u64 max_idle_ns; u32 maxadj;#ifdef CONFIG_ARCH_CLOCKSOURCE_DATA struct arch_clocksource_data archda...
2020-04-26 17:58:55 13059
原创 Linux时间子系统之Tick层
所谓Tick设备,也称作滴答设备,就Tick设备在Linux时间子系统中用tick_device结构体表示(代码位于kernel/time/tick-sched.h中):struct tick_device { struct clock_event_device *evtdev; enum tick_device_mode mode;};可以看出来,它仅仅是对定时事件设备(Cl...
2020-04-23 20:08:58 10225
原创 Linux时间子系统之定时事件层(Clock Events)
几乎所有的计算机系统中都会存在一个所谓的定时设备,经过设置后,在某个固定的时间或某个相对的时间间隔后,达到触发条件,发送中断给处理器。系统中的每一种实际的定时事件设备都由一个叫做clock_event_device的结构体变量表示(代码位于include/linux/clockchips.h):struct clock_event_device { void (*event_han...
2020-04-21 17:51:18 10116
原创 Arm通用计时器简介
所有使用Arm处理器的系统中都会包含一个标准化的通用计时器(Generic Timer)框架。这个通用计时器系统提供了一个系统计数器(System Counter)和一组计时器(Timer)。其结构如下图:可以看到,系统计数器是全局唯一的,并且全局共享。而且这个系统计数器还是一直存在的,哪怕系统处于待机状态,所有内核都被关闭了,它仍然可以工作。每一个Arm核都配备一组专门为自己服务的计时器...
2020-04-16 18:03:59 14032
原创 链接脚本解析
每一个链接器都需要链接脚本来将不同的对象文件链接成最终的可执行文件。如果不特别指定的话,链接器程序本身自带了一个默认的链接脚本,可以通过一下命令获得这个默认的脚本:ld --verbose一般情况来说,默认的链接脚本就够用了,大多数人也不会自己专门编写链接脚本。不过,如果你是编写内核或者固件程序的话,默认的链接脚本有时候就会显得不够用了,需要自己编写。可以用-T参数来告知连接器,使
2020-04-08 15:18:38 1617
原创 在Ubuntu18.04下编译树莓派4B的Arm64内核
make modules是编译模块,很多驱动还有功能在选的时候选成M的都是modules,不过直接make,不加任何参数,就是make all,包含make modules。不用额外加此make,但是在安装的时候make install只是安装bzimage,Systemmap。没有把modules安装好,还要额外的make modules_install,把模块放到/lib/modules文件夹...
2020-04-07 17:02:54 3477 1
原创 Arm64下Linux内核Image头的格式
Linux对于Arm64架构,其编译出来的内核默认是不支持压缩的;而对于Arm32版本来说,默认支持内核解压的操作(代码位于arch/arm/boot/compressed目录下,可是arm64目录下没有对应的代码)。如果实在想压缩内核,也可以在bootloader里面解压好后放到内存中指定的位置。struct arm64_image_header { __le32 code0; __l...
2020-04-03 11:44:10 3965
原创 在Ubuntu18.04下编译OpenJFX8(包含webkit)
1)下载源代码第一步当然是下载源代码,需要安装mercurial,在Ubuntu上可以直接使用apt安装:sudo apt install mercurial然后可以使用hg命令下载到最新的openjfx8的代码:hg clone http://hg.openjdk.java.net/openjfx/8u-dev/rt2)配置编译环境首先,编译OpenJFX8必须要依赖...
2019-12-04 10:15:15 2317
原创 如何向AOSP代码中添加编译好的可执行文件到ROM中
工作当中需要向AOSP的代码中添加一个可执行文件,从而可以打包进ROM里面,方便研究使用。研究一番后,发现其实步骤很简单,一共分成两部:1)将要放进ROM中的可执行文件放到AOSP的prebuilts目录下例如,如果我想将ida的调试服务器android_server文件放到ROM里面,那么我可以在prebuilts目录下建立一个ida目录,然后将android_server拷贝进去。...
2019-11-05 15:26:59 1645 2
原创 如何在Linux系统上简单的限制某个网络接口的速度
一般云端服务器都是建立在Linux操作系统之上的。在部署的时候,有时候会碰到要对某个网口进行限速的情况。当然,想要在Linux上限制速度有很多种选择,比如tc。不过这些方法虽然很强大,要真正很好的掌握还是要学习不少知识的。如果只是想简单的对某一个网络接口限制一下上行或下行速度这种简单的要求,完全没必要去用那些。WonderShaper就非常简单,只需要一个命令就行了。在使用之前首先得安装。
2017-06-01 17:09:50 5830
原创 如何向AOSP中添加根证书
工作中经常需要修改AOSP的代码,定制特定的ROM方便做应用程序分析。但是,由于需要抓取HTTPS的包进行分析,所以,每次刷机后都要倒一个根证书到手机中,非常麻烦。那能不能直接将这个根证书添加到AOSP的代码中,直接包含在编译出的ROM中呢?答案当然是肯定的。其实,AOSP包含的所有根证书都位于“libcore/luni/src/main/files/cacerts”或者是“system/
2017-04-24 16:17:03 3044
原创 Ubuntu系统下如何导入根证书
这几天在摆弄Ubuntu系统,想要抓包就装了个Charles,但本机的HTTPS包是抓不到的,因为没有把Charles的根证书导入CA,而且Charles自带的导证书的功能在Ubuntu下好像不工作。没办法,只能自己手动添加了。搞了半天发现Ubuntu系统中都没有一个好用的GUI工具可以方便的添加根证书。只有通过命令行进行操作,在此记录一下。首先,将要导入的证书拷贝到一个特定目录下:s
2017-04-11 10:45:25 19222
原创 如何查看Android设备上的分区信息
cat /proc/partitionsmountdfls -al /dev/block/platform/msm_sdcc.1/by-name
2016-03-24 14:51:11 46064 6
原创 TrustZone中TrustApp格式解析
ARM早在ARM v6的时候就引入了一个叫做Trust Zone的概念。其基本原理是,相对于普通操作系统的执行环境来说,又引入了一个独立的执行环境,彼此基本上不相关。即使普通操作系统和应用的执行环境被攻破,也不能触及到这个所谓的安全执行环境,这是通过硬件来保证的。Trust Zone中也会运行一个非常轻量级的操作系统,在这个操作系统中运行的程序,叫做Trust App,都是由硬件厂商特别编写的
2016-03-21 15:42:57 4217
原创 如何从oat文件中提取内嵌的dex文件
在Android的ART虚拟机使用的oat文件中,其实是包含了一个完整的dex文件的。可以通过解析oat文件将dex文件的偏移和长度都检索到,然后再将这段数据单独读取出来存成dex文件就可以了。当然,自己可以动手写一个提取的程序,逻辑不复杂。但是,程序员都是很懒的,如果已经有别人免费提供了这类工具,就绝不会自己动手写。经过一番查找,发现了一个比较好用的工具,叫做dextra(http:
2016-02-17 10:53:53 5918 1
原创 Java语言注解(Annotation)简介
Java语言默认自带的注释:1)@Override代表这个函数必须要覆盖2)@SuppressWarnings3)@Deprecated注释说到底,只是给相应的类或方法或变量等特定的域带上相应的属性,但并没有实际做事情。对应的工具会读取这些属性,并做出相应的操作。
2016-02-02 17:11:20 1613
原创 如何解iOS系统中系统库的dyld缓存
这几天想反汇编看一下iOS 9系统中安全框架的实现代码,于是找到系统中的“/System/Library/Frameworks/Security.framework/”目录,发现里面除了一些配置文件和本地化字符串文件,其它什么都没有,最重要的“Security”二进制文件更是没有踪影。查询了许多资料之后才发现,原来从iOS 3.1开始,为了提高系统的性能,所有的系统库文件都被打包保存到了一个很
2015-12-28 11:13:27 7315
原创 Unix域套接字(Unix Domain Socket)介绍
在Linux系统中,有很多进程间通信方式,套接字(Socket)就是其中的一种。但传统的套接字的用法都是基于TCP/IP协议栈的,需要指定IP地址。如果不同主机上的两个进程进行通信,当然这样做没什么问题。但是,如果只需要在一台机器上的两个不同进程间通信,还要用到IP地址就有点大材小用了。其实很多人并不一定知道,对于套接字来说,还存在一种叫做Unix域套接字的类别,专门用来解决这个问题。其API
2015-12-16 15:48:40 33663 2
原创 dex2oat程序参数总结
Android从4.4开始正式引入了ART虚拟机,并从5.0开始取代了Dalvik成为默认的虚拟机。ART与Dalvik最大的不同就是,在程序安装的时候就将其编译成本地指令集(即所谓的Ahead Of Time,AOT),而不像Dalvik是在运行的时候对经常掉用的函数动态编译的(即所谓的Just In Time,JIT)。但是最终编译的动作,还是通过程序dex2oat来执行的。这个程序本身可带非
2015-12-11 13:47:58 12298
原创 Android-X86集成houdini所做的修改
Android-X86其实是基于Android的源码编译出来的一个X86版本,可以运行在X86系列处理器上。对于应用程序来说,如果全是使用Java语言编写的话,不会有什么问题。就算用到了JNI函数,如果编译出来了一个X86的动态库,并且包含在apk文件中,也不会有问题。要命就要命在有许多应用程序内部,只有ARM指令集的动态库,就不能在Android-X86平台下运行了,并且这类应用还不在少数。为了
2015-12-07 16:05:43 20877 5
原创 Linux下如何指定某一类型程序用特定程序打开(通过binfmt_misc)
在Windows平台上,可以绑定拥有特定扩展名的文件,使用特定的程序打开。比如,PDF文件就使用Acrobat Reader打开。这样做确实极大的方便了用户的使用体验。其实,在Linux平台上,也提供了类似的功能,甚至从某种意义上来说更加的强大。Linux的内核从2.6开始就引入了一个叫做Miscellaneous Binary Format(binfmt_misc)的机制,可以通过要打开文件
2015-11-27 14:23:49 9966 1
Android Security Internals
2016-03-07
Symbian OS Explained - Effective C++ Programming for Smartphones
2008-05-23
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人