奔跑吧Linux内核卷1:基础架构(第2版) ----- https://
arch/arm/boot
git clone https: exports exports PATH =
pwd和$PWD的联系与区别 --- https://blog.csdn.net/weixin_44333061/article/details/122435940
$pwd获取当前目录的绝对路径
开始下载 ---repo sync
下载经过CM适配的内核源代码
apk Library get-prebuilts build
proprietary(apk library) proprietary() proprietary proprietary
为什么apk程序不带odex文件 apk
target = user
system userdata
recovery boot bootloader
fastboot flash recovery recovery.img
room root
ROM表示 android os的系统文件 bootloader
recovery
linux终端 执行 adb reboot bootloader
安卓adb工具(安卓abd) --- https://www.bufeishi.cn/56213.html
su root recovery setgid setuid
exit 回到ubuntu linux终端
recovery刷机包 updater-script updater-script recovery刷机包
recovery刷机包 su updater-script和update-binary binary
system meta-inf
busybox mount -o
退出android设备的shell ,回到linux终端
su命令,root权限 platform签名后
/system/xbin /system/bin mm ndk.build
/system/extra/su /system/extra/su
su superuser.apk 配合root权限
adb shell am start com.android.calulator2
localSocket localSocket(12,45)
localSocket
android 分配的 package->id
shared_userid shared_userid component
component component activity action action
调用 su命令的程序的用户ID 是shell, 直接允许 Root授权
localSocket chown localSocket chown
atexit(cleanup) cleanup
result += sizeof SOCKET_RESPONSE, SOCKET_RESPONSE
调用 su命令 的程序信息
from->uid = getuid(),from->gid = getppid()
snprintf 函数用法详解 --- https://blog.csdn.net/m0_50668851/article/details/110000520
snprintf函数用法详解 ---
snprintf的返回值是欲写入的字符串长度,而不是实际写入的字符串度。如:
/proc/%u/cmdline cmdline from->pid
命令行参数是调用su命令的程序
【C语言】strncpy详解 ---https://blog.csdn.net/Vcrossover/article/details/114712850
NUL即\0; NUL即\0
总的来说,strncpy总是复制len个字符到dst指向的内存!!!
*dst-- = *str--包住str后面的数据,
C语言:内存重叠问题 --- https://blog.csdn.net/lemonchi/article/details/78137969?spm=1001.2101.3001.6650.3&depth_1-utm_relevant_index=6
readlink
cat /proc/cmdline
su 命令文件链接路径
/system/bin/app_process app_process
su和 Superuser 通信之 localSocket
/data/data/packageName
/data/user/android_user_id/packageName
Superuser/Android.mk
ln -sf /system/xbin/su $@ ln -sf /system/xbin/su
将localSocket与Path绑定
start the activity that confirms the request
exec /system/bin/am
action_notify
write_string(name,buf)
from.uid
from.name
from.bin
socket_send_request
write_string
socket_send_request
key-value
write_data(fd,name) write_data(fd,data)
binary = system/bin/shell
/system/bin/dumpstate
C 库函数 char *strrchr(const char *str, int c) 在参数 str 所指向的字符串中搜索最后一次出现字符 c(一个无符号字符)的位置
char* str1 = "hello world";
char str2[10] = "*********";
printf("%s\n", strcpy(str1,str2));
return 0;
}
这里的程序也出现了错误。str1指向的是常量字符串,是不可以被修改掉的,
目标空间必须是可以被修改的,因为要将拷贝的字符串放在目标空间中。
'\0'
Zom定制 Zombie
system.img userdata.img ramdisk.img boot.img recovery.img
system.img userdata.img ramdisk.img
Bootloader rom
recovery.rom
fastboot p 1 0 part0 p 0 0 part1
[width] [height] [frame-rate]
p[loop] [pause] [folder]
userdata.img用户数据镜像
RAM 内存磁盘镜像 ramdisk.img
mkbootfs .|mingzip ../ramdisk.img.new
boot.img -> ramdisk.img和 zImage
mkdir boot
uppack bootimg --
mkbootfs mingzip ../boot.img-ramdisk.gz.new
Linux 串口编程学习记录(termios.h) ---- https://blog.csdn.net/Flag_ing/article/details/125644852
android使用google工具进行串口开发--每次只接收32个字节问题 --- https://www.jianshu.com/p/12f43eff8cf1
recovery镜像
Int[] arr1 ={1,2,3,4,5};
arrayCopy(arr1, 3, arr1, 2, 2);
意思是:将arr1从数字4开始 拷贝到arr1的数字3的位置, 拷贝2个数, 也就是说将4和5 拷贝到数字3的位置,相当于删除数字3.
cache.img缓存镜像
system.img system ramdisk.img root
userdata.img data
recovery.img recovery Recovery , recovery.img ,recovery.img
system.img 和boot.img android,library zImage
boot.img base pagesize
mkbootimg --kernel
--ramdisk
-- second --cmdline <kernel-commandline>
--board<boardname>
--base<address>
--pagesize<pagesize>
--ramdisk_offset address
bootloader rom usb system
su文件放到 /system/xbin目录
bootloader rom更新整个system system su
制作Recovery rom cm rom recovery rom update.zip
update.zip
meta-inf 存储签名文件,更新脚本
update-script update-binary 执行update-script脚本文件
recovery rom META_INF 目录
update-binary 3 stdout /sdcard/update.zip
set_progress
package-extract file
busybox cp busybox cat busybox<commandline>(command)
set_perm(uid,gid,mode)
ro.product.device getprop
sha1_check run_program run_program (proc,ar1,argN)
run_program ("/tmp/backuptool.sh","buckup")
补丁操作 Patching operations operations
Patching
apply_patch(srcfile,tgtfile,tgsha1,tgsize, sha1_1,patch_1,...)
lexer yacc
char* cond edify
update-binary是 Editfy脚本解释器
try_update_binary odex library
exports boot_classpath
signapk.jar signapk.jar对apk进行签名
grouper grouper clockworkmod clockworkmod recovery
fputc-》写入字符
与fputs函数 -》写入字符串
//zip update-binary
fdopen update-binary
fgets(str, 7, stdin); /*从输入流stdin即输入缓冲区中读取7个字符到字符数组str中*/
strtok分解字符串
2.原型
char *strtok(char s[], const char *delim);
.说明
(1)当strtok()在参数s的字符串中发现参数delim中包含的分割字符时,则会将该字符改为\0 字符。
strt_or
用法:
float strtof (const char* str, char** endptr);
将字符串转换为浮点数
f2 = strtof (pEnd, NULL);
strtof
C 库函数 - strtol()
C 库函数 long int strtol(const char *str, char **endptr, int base) 把参数 str 所指向的字符串根据给定的 base 转换为一个长整数(类型为 long int 型),
base 必须介于 2 和 36(包含)之间,或者是特殊值 0。
strtol strtol strtol
strtol yaffs2 yaffs2
strdup()主要是拷贝字符串s的一个副本,由函数返回值返回,这个副本有自己的内存空间,和s不相干。
char *strdup(const char *s)
{
char *t = NULL;
if (s && (t = (char*)malloc(strlen(s) + 1)))
strcpy(t, s);
return t;
}
strdup = malloc() strcpy()
使用 sideload 模式刷 ROM
sideload 模式刷 rom
install zip from sideload
函数pthread_join用来等待一个线程的结束,线程间同步的操作。
/sdcard/update
/sdcard/update/.android_secure second
recovery/roots.c
/data/media /data/media
函数声明:char *strstr(const char *str1, const char *str2)
头 文 件:#include <string.h>
返 回 值: 返回值为char * 类型( 返回指向 str1 中第一次出现的 str2 的指针);
如果 str2 不是 str1 的一部分,则返回空指针。
ramdisk是内存到磁盘的映射 yaffs2 ext4
语言中stat函数,C语言:stat,fstat和lstat函数 start
这三个函数的功能是一致的,都用于获取文件相关信息,但应用于不同的文件对象。
/system /data format_volume
recovery菜单项
汉化 recovery菜单项
gglsurface recovery
7f = 0111 1111 =
//绑定纹理 bind_texture texture package- package/app_process
platform签名后
存储二进制形式系统文件的目录是 /system/app_process
存源码的目录是 android源码目录/apps
category category
source ./build/envsetup.sh
mm /system/app_process odex apk里面的 odex文件
source_update.sh scheme = "cal" packageInstaller
package/apps/packinstaller package-extract
. ./ build/envsetup.sh lungch lungch
data android:scheme = "file"
packinstaller
packageInstallerActivity
package- uri scheme等信息
apps/package-installer
mpackage.getScheme getScheme
getContentResolver getContentResolver
adb install apk
package-info
platform签名后
source update.sh
platform签名后
/packages/app/settings settings
include $(call all-makefiles-under,$LOCAL_PATH)
android.mk文件
local_progard_flag_files local_progard_flag_files
local_path_name local_path_name local_certificate local_certificate
指定签名文件 = platform签名后
build/target/product
platform.pk8 platform.x509.pem
coreApp = true true
mm mmm /system/app/
android:shared_userid = android.uid.system
mount -o remount, rw/data
header pref
普通应用不需要platform签名和 system权限
settings.db-wal 覆盖settings.db
sqlite -shm
-shm模式 内存映射文件
-wal模式 settings.db global表
airplane_mode_toggleable_radios
shared_userid = android.uid.system
android:process = system
dan rom settings.db
settings.db
name,value 两个字段
Android BaseAdapter提升性能的建议实作方式 --- https://magiclen.org/android-baseadapter/
content://settings/global表
getStringForUser getStringForUser resolver resolver,name,userHandle
mUri, SELECT_VALUE,NAME_EQ_PLACEHOLDER,
new String[] {name}, null , null);
BaseAdapter + ListView数据源不变化就复用旧的数据;
怎么判断fragment是否被添加 --- https://zhidao.baidu.com/question/242831140018407804.html
Java比较两个List之间差异(基于业务场景) -- https://blog.csdn.net/weixin_39699061/article/details/109409415?share_token=015eb3fa-b80b-447d-b960-e14170518599
android studio ViewPager 禁止滑动和去除切换效果 --- https://blog.csdn.net/weixin_44377507/article/details/125560625
Android Fragment+ViewPager 组合使用 ---- https://blog.csdn.net/paladinzh/article/details/88078989
盘一下 Fragment 间的五种通信方式 ---- https://blog.csdn.net/winskyan/article/details/118406967
android - 如何从后台服务更新 ViewModel 的 LiveData 并更新 UI --- https://www.coder.work/article/46437
Android笔记:TabLayout去除文字点击选中背景色 ---- https://blog.csdn.net/Xiong_IT/article/details/123667110
load result refresh () { }
platform签名 platform签名
wifimanager .connect connect
startScanning startScanning
dispatch device added platform签名后
content_resolver :// context.getpackageName
内部存储空间 和usb存储器
编译android源代码
Android Dialog弹出输入法卡顿,容易发生ANR --- https://blog.csdn.net/m0_37611657/article/details/72639465
root授权和网络adb 是cm room特有
persist.sys.root_access persist.sys.root_access = true
获取root授权方式的状态值
ro.build.version.release release
setproc persist.sys = true
setproc persist.sys = true
mAdbDialog != null
adb connect 192.168.169:5555
content://settings/boot sqlarguments sqlarguments
adb connect 192.168
adb
backupAgent = true application backupAgent
insert
getContentResolver.insert
android 获得wifi列表并连接wifi --- https://blog.csdn.net/xuji7483/article/details/125421006
persist.radio.otspadi = true
Github打不开解决方法 --- https://zhuanlan.zhihu.com/p/566713519
ro.debugger = true debugger = true
空祖家的对话框工具V3版,集成三种风格+夜间模式对话框,以及等待、提示、分享等特色对话框,支持花式自定义 --- https://github.com/kongzue/DialogV3
强大而灵活的RecyclerView Adapter --- 完美兼容ConcatAdapter,解决了许多遗留问题,拆分了功能模块,BaseAdapter更加简洁干净
万能适配器BaseQuickAdapter简单使用 --- https://www.jianshu.com/p/54b1839d9563
uri = content://sms/queued
getContentResolver = resolver
/system/app/
package/app/settings
resolver = package->
content provider provider
content:// =
insert question/242831140018407804 delete
Android 软键盘丝滑切换(一) -- https://blog.csdn.net/u010106754/article/details/128814803
view insets insets fragment
getContentResolver.delete ( ur.part0 content://
Android 炫酷的 Activity 切换效果,共享元素 ---- https://toutiao.io/posts/jq7cog/preview
Activity跳转时会闪屏问题解决方案(或打开弹窗底层Activity移动问题) ---https://blog.csdn.net/Azadoo/article/details/126545798
Activity以singleTask模式启动,intent传值的解决办法 ---- https://blog.csdn.net/harryweasley/article/details/46557827/
create_icon_bitmap bitmap
app_widget app_widget bind_workspace bind_texture _workspace
sbgfolder sbgfolder app widgets widgets folders
long,folder
handleMoveEvent handleMoveEvent dragLayer
奔跑吧linux内核卷2https://pan.baidu.com/s/1PHD6LqFylKzjm_6Opj-KkQ 密码:8hch
linux命令行大全第2版http://www.jinyihulian.cn/view/20995
optmicstic_spin_node optmicstic_spin_node
osq _lock osq_lock prev = deocode
decocode_cpu(old) decode
need_resched need_resched
curr_node->locked localSocket mcs锁
lock->tail = 3
barrier barrier指令 mcs锁的妙处
barrier = 3 lock- tail = 3
need_resched
pending 域 ,tail域
queued标签处去排队
自旋等待锁持有者释放锁
automic_cond_read_acquire acquire
automic_cond_read_acquire acquire
setCompoundDrawables使用 ---- https://blog.csdn.net/qq_38998213/article/details/93506973
mcs_spinlock mcs_spinlock
mcs自旋锁被置1 cpu3 mcs节点的locked
Android自定义AlertDialog ---https://blog.csdn.net/snow_ice_yang/article/details/81983738
local->val = {0,1,1} val = {0,0,1}
down _intterruptible
list_add_tail() 将new所代表的list_head插入head所索引的队列的尾部
static inline void list_add_tail(struct list_head *new, struct list_head *head)
...{
__list_add(new, head->prev, head);
}
list_add_tail new ,head
List 去重的 6 种方法,这种方法最完美! --- https://blog.csdn.net/weixin_41055260/article/details/127462630
irqsave 关闭CPU可中断
linux kernel 中双向链表详解(一) ---https://blog.csdn.net/u014787262/article/details/123699525
Java中List集合去除重复数据的方法汇总--
https://www.cnblogs.com/dituirenwu/articles/17077908.html
struct apple *it = list_first_entry(&apple_top, struct apple, list);
拿到数组apple首地址
list_del(&it->list); apple *it = null
insmod
rmmod
public void startWps(WpsInfo config, WifiManager.WpsCallback listener) {
D:\sraum2.0\linux-5.0\linux-5.0.9\linux-5.0.9\kernel\locking
down_write down_write sys—— product protect sys_drc dragLayer
有一个bug 我没去填 它还去连接; 提示ssid 为空 ;请去配网;
call_rcu
task_struct *readlink ,task_struct *write_thread write_data
ktread_run_program kthread run_program
g_ptr, p
读者临界区中的指针副本p指向旧数据
sys rcu call_rcu
内存管理中的锁
1.11.1 mm->mmap_sem mm-> mmap_sem ksm vma ksm vma->
av -> (红黑树)vma-> avc
vma映射到页
vma ->avc av mm->mmap_sem
nFIQCPU[n] active = active pending
nFIQCPU[n] =
更多关于 GIC 的介绍可以参考 <ARM Generic Interrupt Controller Architecture Specification version 2 》
和 《 CoreLink GIC-400 Generic Interrupt Controller Technical Reference Manual K
coreApp = true
gic = 400
qemu = gic = 400
cat / proc/ interrupts interrupts
cat /proc/ interrupts
./run debian arm64 .sh run
gic_spi gic_spi.cache cah
arm ,cortex-arm64
irq create_icon_bitmap mapping magiclen
D:\sraum2.0\linux-5.0\linux-5.0.9\linux-5.0.9\kernel
gic irq doma all-makefiles-under
request_threaded_irq // irq
alloc irqs all-makefiles-under
irq_data irq_data
request_threaded_irq
request_threaded_irq
riq
irq_desc irq_desc irq_desc riq
new->flags &= ~IRQF_ONESHOT;
new->flags & = ~ IRQF_ONESHOT; IRQF_ONESHOT;
使用 IRQ 号 , 而不是硬件中断号 。 IRQ 号是映射过的软件中断号
IRQ 是软件中断号
primary handler_handler IRQ_WAKE_THREAD IRQ_wake_thread thread
irq_action = threadfn flags
pstate, daif = 1 serror = serror = threadfn
socket_send_request
armv8a socket_send_request thread
pt_regs pt_regs
opcode base length length
\base. \length
\base. \length
深入理解*.s文件 ----- https://blog.csdn.net/jimk1983/category_333384.html
最好手上有一本<ARM920T技术参考手册>,老古开发网上免费下载
cache Cache cache kernel_ventry 1,irq el1_irq el1_irq
second enable_da_f enable_da_f enable_da_f
serror fio irq_handler = irq
《深入理解程序设计使用Linux汇编语言》pdf电子书免费下载---https://www.linuxprobe.com/using-linux-assembly.html
寄存器保存到栈框里
irq
schedule schedule raise _softirq irqoff
ira_stat kernel soft raise
kernel/softirq.c softirq.cache
asmlinkage __visible void do_softirq softirq void
direct compaction compaction
asmlinkage __visible void _do softirq
tasklet task_struct tasklet
task_struct *next need_resched
has leaked window DecorView@8073c51[] that was originally added
task_struct tasklet
declare tasklet disable disable
*head->tail = null
task_struct tasklet task_struct schedule
tasklet under action
tasklet_vec.tail 指向链表头 tasklet_vec.head 指针本身
的地址 。
tl_head->tail = &tl_head->head;
tl_head->tail = &tl_head->head
tasklet ->disable
tasklet tasklet_vec ->disable
以 drivers/char/snsc_event.c drivers/char/snsc_event
snsc_event snsc_event
cpu0 cpu1 cpu0 cpu1
清除 tasklet_state_run
scdrv_event scdrv_event
bottom half work queued
static DEFINE_PER_CPU_SHARED_ALIGNED(struct worker_pool [NR_STD_WORKER_POOLS] , cpU_wor
ker_pools)
define_per_cpu aligned aligned
D:\sraum2.0\linux-5.0\linux-5.0.9\linux-5.0.9\kernel
kthread bind_texture bind_mask
wake_up_process wake
alloc work question/ work queued queued
alloc and link library pwa aligned
work_pool
question/ pool
pool_work_queue
pool_work_pool
apply_work_question/
pwq = pool_work_queue
kernel/work_pool.cache
nice cpumask nice, cpumask
pool_work_pool->refcnt refcnt
schedule_work
#define WORK_DATA_INIT () work data init
atomic lng init
ATOMIC LONG INIT(WORK STRUCT_NO_POOL)
long init
按照 256 字节对齐
queued worker_pool _ on
将List中的某一个元素移动到首位或指定位置 ---https://blog.csdn.net/qq_42524288/article/details/122271226
set_work_pwq set_work_pwq work_struct work_struct data
pwq 指针 和一些标志位设置到 data 成员中 pool_workqueue
pool_work_queue
get_pwq put_pwq put_pwq get_pwq refcnt pool_work_queue
, smp_mb() 内存 屏障指 令保证 wake_up_worker() 函 数唤醒 worker 时 ,在
_schedule()->wq_worker_sleeping()® 数 中看到这里的 list_add_tail() 函数 添加链 表已经完成 。
nr_running>= 1
smp_mb wake_up_worker worker schedule-?wq_worker_sleeping list_add_tail
smp_mb内存屏障 _schedule ->wq_worker_sleeping list_add_tail
smp_mb
找到 pool_workqueue, 也就找到对应的 workerjool 和对应的 PENDING 链表 。
pool_workqueue work_pool pending链表
need_more_worker
worker scheduled scheduled work_pool->nr_idle work_pool->nr_idle
manage_workers() manage_workers manage_workers
nr_running
work_pool-> nr_running
nr_running>= 1 nr_running >=1
need_more_worker need_more_worker
nr_running>= 1
pending smb pending
keeping work keeping work
flush_work flush_work
pending process one work
pending process one work flush_work keeping work
pending process one work flush_work kk
进程b获取pending 位
在 _ schedule () 函数中 , prev 指当前进程 , 即执行 work 的工作线程
schedule work
PF_WQ_WORKER pf_wa_worker pf_wa_worker pf_wa_worker
unbound unbound queued标签处去排队 queued_work_on queued_work_on
① 要 了解如何使用 BusyBox 来打造一个简单的文件系统 , 请参考 《 奔 跑吧 Linux 内核入门篇 》 一书
debian 标准教程(王旭) pdf文字格式 --
debian unbound question/
net_9p net_9p
使用Qemu在Windows上模拟arm平台并安装debian10 arm系统(cd镜像) 安装记录 --https://blog.csdn.net/binnygoal/article/details/128476686
KVM虚拟化技术基础与实践第五章 QEMU虚拟.pdf ---- https://max.book118.com/html/2018/0415/161595696.shtm
debian 标准教程(王旭) pdf文字格式 --
“ /lib/modules/$(shell uname -r)/build^^ 是一个 链接文
件 , 用来指向具体内核源代码路径
/lib/modules/$ (shell uname -r)/build
head.S
加载地址 运行地址 链接地址
最先启动 的部分 要实现代码复 制功能 ( 把 整个 ROM
代码 复制到 DDR 内存中 )
最先启动 的部分
rom代码复制到DDR内存中
vmlinux vmlinux stext
<arch/arm64/kernel/head.S>
arch/arm64/kernel/head.S
nor flash -> sdram-> ddr
ddr->内核虚拟地址 head.S head.S
(1) 在 QEMU 虚拟机上 , DDR 内存 的起始地址是 0x4000 0000
.init .text
./run debian
。head.text .text .rodata = true
.init.text
./run_debian_Arm64.sh run debug debug
ftrace ftrace ftrace
trace trace
do task start seq seq_read seq
cmd = ps trace
update
update_curr update_curr
trace _event trace_event event
sys节点 qemu qemu samples/trace_event
samples/trace_event
event-samples/trace_event-fn
trace.cmd kernelshark
be-differenet trace.cmd trace.cmd
kernelshark kernelshark kernelshark
report report
<Andcoid/systen/core/libcutils/trace . c>
android/system/core/libcutils/trace.c
# 清空 kernel log 和 ftrace log, 等待下一次条件触发
kernel log ftrace log
kasan ---lockdep
// 调用函数,重新分配内pages为起始地址的前new_size个字节的内容不改变
char * addr = __krealloc( pages, new_size, GFP_KERNEL);
_krealloc _krealloc krealloc krealloc new_size
lockdep lockdep
lockdep 已经很清晰地显示了死锁发生的路径和发生时函数调用的栈信息 , 开发者根据这些
信息可以罹快速地定位问题和解决问题
lockdep lockdep
cancel_delayed_work_sync(&delay_task) cancel_delayed_work_sync (&delay_task)
schedule_delayed_work ( &delay_task, 10);
cancel_delayed_work_sync work_sync flush_work
cancel_delayed_work_sync lockdep
vmlinux vmlinux
在 QEMU 虚拟机 +Debian 实验平台上安装 perf 工具
perf stat perf start start
sudo perf top
sraum2.0
空气质量 》=65535
二氧化碳 =>=65535 = ""
https://tools.liumingye.cn/music/#/ ----免费歌曲下载Whistle - Flo Rida
apt-get install systemap systemap
elf
①在 QEMU 虚拟机 +Debian 实验平台上运行 BCC 会比较慢 , 读者需要耐心等待 , 也可以直接在 Linux 主机上运行 BC
qemu debian bcc
system_call_fastpath system_call_fastpath machine_kexec
sym sym
list -s -h sudo install insmod oops. insmod
crash > hex output radix 16 (hex)
crash> struct -o vma_area_struct struct
slab slab delay_task spinlock spinlock kernel modules/$
, 装载内核模块并捕获内核崩溃
时转储的 core 信息 core
regmap regmap
rax rsi
可以推断出 RAX 寄存器的值可能是一个空指针
misc_register_device
rbp -》 rsp 98 个字节 栈保存局部变量
和临时变量
crash> struct mydev_priv ffff8c4bc4aefcc8
crash> struct mydev_priv
struct mydev_priv (
char name [64];
int i ;
struct inm_struct *mm;
struct rw_semaphore *sem;
rw_semaphore *sem;
mm_struct mm_struct rw_semaphore *sem 信号量
最后 , Oxfl0B8c4bc4aefa38 - 0x8 - 0x80 =0xflB38c4bc4aefcb0o 地址 0xffi8c4bc4aefcb0 存放的是 mm
数据结构的指针
指针地址 -》存放在栈寄存器地址中
Oxffff8c4b45b06478
Unable to resolve dependency for ':app@debugUnitTest/compileClasspath': Failed to transform artifact 'annotation-experimental.aar (androidx.annotation:annotation-experimental:1.3.0)' to match attributes {artifactType=jar}
AndroidX使用过程中的疑难杂症 --- https://blog.csdn.net/kenkao/article/details/126935455
Remove them from the classpath or use '-Xskip-metadata-version-check' to suppress errors
/* 虚拟 FIFO 设备的缓冲区* /
static char *device_buffer;
fifo 设备的缓冲区*
Unable to find method 'org.gradle.api.tasks.TaskInputs.property(Ljava/lang/String;Ljava/lang/Object;)Lorg/gradle/api/tasks/TaskInputs;'.
Possible causes for this unexpected error include:
Gradle's dependency cache may be corrupt (this sometimes occurs after a network connection timeout.)
Re-download dependencies and sync project (requires network)
The state of a Gradle build process (daemon) may be corrupt
ps -aux
ps
some kotlin libraries attached to this project were compiled can‘t read please update kotlin plugin --
https://blog.csdn.net/weixin_42199290/article/details/127422105
crash> bt 5523
down_read down_read
down_Read down_Read
计算 RAX 寄存器的值 ,
其中栈返回地址为 0xffff949412e83ed8 。 计算公式如下
rax 寄存器保存到栈框里
[ffff949412e83e28] down_read at ffffffffb3766f 00
#5 [ffff949412e83e40] proc_pid_cmdline_read at ffffffffb32bba02
#6 [0xffff949412e83ed8] vfs_read at ffffffffb324117f
static ssize_t proc_pid_cmdline_read (struct file *file, char
size_t _count, loff_t *pos)
_ user *buf ,
tsk = get_proc__task (file_inode (file) );
mra = get_task_ram(tsk) ;
page = (char *)_ get_free_page 《 GFP_TEMPORARY) ;
down_read ( &mm->mmap_sem)
栈返回地址 0xffff949412e83ed8 = proc_pid_cmdline_read 计算 RAX 寄存器的值
rax 寄存器
void _sched down_read(struct rw_semaphore *sem)
void __sched down_read(struct rw_semaphore *sem) //rw_semaphore *sem,
(2) 编译测试程序并运行 。
# ./test &
(3) 运行 ps -aux 命令来查看进程 。
# ps -aux
./test &
ps -aux test进程 ps进程 mmap_sem
mmap_sem
其中 vm_mmap_pgoff() 函数的栈 帧中的
返回地址为 0xfffi94941535bee0
vm_mmap_pgoff
mm_struct mm_struct
vmcore runq-t runq-t vmcore vmcore
关于 Crash 工具的调试计巧汇总 crash crash
crash ps | grep grep
ARM64 寄存器和函数调用规则 。
□ 搭建 QEMU 虚拟机 +Debian 实验平台的方法 。
□ Kdump 和 Crash 工具的使用方法
要运行 crash 命令 , 首先 , 在 Linux 主机中 , 复制带调试符号信息的 vmlinux 文件到共享文
件夹 kmodules 目录 。 在 QEMU 虚拟机的 mnt 目录可以访问该文件
vmlinux kmodules quemu mnt
wyongch
/
IPCameraDemo---https://github.com/wyongch/IPCameraDemo
crash bt pc lr sp sp lr
指 的是父函数栈 空间的 FP, 也称为 P_FP (Previous FP)
crash = bt = pc = lr
从发生系统崩溃的现场和寄存器 x29 可知, create_oops 函数栈空间的 FP 为 Oxfi0BroOOOOb9O3b2
求解函数栈空间的 FP ,求解函数栈空间的FP create_oops
create_icon_bitmap
create_oops fp
威视大康 视频解决方案
, 如 do_oneinitcall() do_oneinitcall FP
函数栈空间的 FP
FP_f = *(FP_c) -> FP 可以找到父函数栈的 FP
PC_f = *LR_c-4 = *(FP_c + 8)-4
LR 可以间接获取父函数调 用子函数时的 PC 值 dis
QEMU 虚拟机 +Debian 来启动一个 ARM64 架构的虚拟----
dis create_oops
20 = baf0 ps =
dis命令 反汇编 mmap_sem 读写锁
mmap_sem
mm->pgd ttbr0 ttbr1 asid asid mm->pgd mm-?pgd pte pte
mmu mm->pgd mm->pgd
内核页表 swapper_pg_dir swapper_pg_dir
跳转页表 tramp_pg_dir
arm64
vectors vectors
pms vectors
service manage_workers bind server server ipc server manage_workers
server sm client
proxy binder binder stub proxy
ibinder ibinder iinterface iinterface
stub是server proxy 是client代理
stub是server client代理
instrumemtation memtation
binder binder -> client handler_message handler_message
context_impl context_wraper
stub start prev
stub是server onTransact
proxy 是client代理 transact transact
stub是server client代理
ams 里面 调用 proxy(service) transact-> conn
app onTransact -> conn
broadcast_receiver_receiver
inner_receiver inner_receiver IIntentReceiver stub
stub是 binder对象的接收端。
cursor_window
curr_node- cursor_window binder对象的接收端。
stub binder对象的接收端。
ams broadcast_receiver_receiver
content provider ams content_provider ams
通信
package_ parser package_parser
android stub
asm broadcast_receiver_receiver content provider ams
activity_thread package_manager
apk dex apk dex
Constructor ctor = r.ge tDe claredCons tru ctor (p 3 );
Object obj = ctor . newinstance(l ,” b ] q ” ) ;
getDeclared _constructor
getDeclared constructor constructor jOOR
reflect refcnt getDeclared jOOR
reflect reflect = reflect.call.get
mInstance mInstance reflect = constructor jOOR jOOR
mordifers mordifers mordifers
?(onCreate
ref_invoke ref_invoke object
ref_invoke invoke_state_method
jOOR jOOR hook
Handler handler handler = mBase ,mBase
hook 动态 hook 接口
new Activity hook
provider provider
provider
compile provider provider compile compile
dynalmic dynalmic
R 文件 的 apk
resource.arsc resource.arsc
Android Camera --- https://blog.csdn.net/u013904227/category_9316022.html
get package-info package-info
loadedapk loadedapk camera camera loadedapk loadedapk
launchMode = launchMode = camera standard standard singletop singletop singletask singletask singleinstance
singleinstance singleinstance
singleinstance launchMode camera loadedapk onCreate onCreate
onNewIntent onNewIntent
QEMU 虚拟机 +Debian 来启动一个 ARM64 架构的虚拟----
KVM虚拟化技术基础与实践第五章 QEMU虚拟.pdf ---- https://max.book118.com/html/2018/0415/161595696.shtm
debian 标准教程(王旭) pdf文字格式 --
《深入理解程序设计使用Linux汇编语言》pdf电子书免费下载---https://www.linuxprobe.com/using-linux-assembly.html
onCreate
mh mCallBack mCallBack handler_message handler_create_service
handler_create_service
java.lang.IllegalStateException: Fragment FragmentMain{bbc0469 (806e65e9-e7ce-4d92-b781-a1a5c387a4d2)} not attached to a context.
handler_message_message onCreate
hook
pms
pms
AMN .get defalt debian .regitster ocnre
filter amn amn
Object getFieldObject(Object obj ,string file_name)
getFieldObject(obj.getClass ,obj,string file_name)
clazz = obj.getClass
Field field= clazz.getDeclaredField(filedName);
field.setAccessible(true) ;
return field.get(obj) ;
} catch {Exception e)
meta_data meta_data
meta_data meta_data
<receiver>
<meta-data android:name =”oldAction” android:value=”jianqiang2” ></meta-data>
</receiver>
Refinvoke.getFieldObject(DexClassLoader .c lass .
getSuperclass () , cl ,” pathList ”) ;
gDefault是一个 android.util.singleton<T>对象,superclass superclass
Object mInstance = Refinvoke.getFieldObject("android.util.singleton",gDefault ,” mInstance " ) ;
静态代理理想的Proxy Receiver receiver receiver proxy proxy
content provider provider
content provider provider
that 框架 that 框架 that 框架
ProxyActivity ProxyActivity ProxyActivity
就
host app plugin platform
host1 platform plugin1
local class class platform invoke_state_method
ivkode invoke_state_method
onResume.invoke invoke
base plugin activity base plugin activity
dexPath dexPath dexPath
MyPlugins MyPlugins MyPlugins
MyPlugins invoke dexPath
插座当前版本比 最新版本高
launchMode = "singletask"
singleinstance
singleinstance singleinstance
that框架 that框架
service service broadcast_receiver_receiver
host_app host_app
host_app plugin2
service activity action_notify
component_name, component_name,
proxy service 与 service manager
service manage_workers
proxy
manage_workers
manage_workers
manage_workers send
dex_output_dir
jarsigner jarsigner
zipalign zipalign dex_output_dir
BaoBaoJianqiang
gradle zipalign
plugin_manager
claredCons.debian .dex multidex
multidex
classes2.dex classes2.dex multidex multidex
classes.dex classes2.dex
proguard proguard proguard
bsdiff bsdiff .apk
windows windows
https://files.cnblogs.com/files/Jax/patchl.zip
abiList abiList
https://github.com/BaoBaoJianqiang
gradle task after
gradle
resource.arsc
resource.ar1
_ap javac ap .claredCons .dex .dex
_ap .debian task
.calre libraries plugin
resources.arsc resources.arsc
resources.arsc resources.arsc
android 如何正确使用 泛型 和 多参数 “偷懒” ----https://www.cnblogs.com/linguanh/p/5051346.html
android
hook call backupAgent
gradle small gradle small 框架 hook small
exit.s/1PHD6LqFylKzjm_6Opj-KkQ
small hook
ebi当前位置 eax当前值 ebx当前最大值
move loop
数据栈向下增长;
处理器的堆栈是向下增长的, 栈区示意图:汇编从右往左读,入栈顺序为R12(10),R3(9),
R2(8),R1,R0,LR
%ebx %ecx ecx ebx
通用寄存器就是最基础的寄存器,在程序执行的过程中,绝大部分时间多在操作这些寄存器实现指令功能
eax(32位)/rax(64位):
通常用来执行加法,函数调用的返回值一般也放在这里面
ebx(32位)/rbx:
通常用来数据存取
ecx(32位)/rcx:
通常用作for循环的计数器
edx(32位)/rdx(64位):
读取I/O端口时,存放端口号
esp(32位)/rsp(64位):
栈顶指针,指向栈的顶部
ebp(32位)/rbp(64位):
栈底指针,指向栈的底部,用ebp+偏移量的形式来定位函数存放在栈中的局部变量
esi(32位)/rsi(64位):
字符串操作时,用于存放数据源的地址
edi(32位)/rdi(64位):
字符串操作时,用于存放目的地址的,和esi两个经常搭配一起使用,执行字符串的复制等操作
x64架构比X86多了8个新的通用寄存器:分别为r8-r15通用寄存器
在X86时代,函数调用时,通用寄存器少,参数绝大多数时候是通过线程的栈来进行传递(当然也有使用寄存器传递的, 比如著名的C++ this指针使用ecx寄存器传递,不过能用的寄存器毕竟不多)
进入x64时代,寄存器资源富裕了,参数传递绝大多数都是用寄存器来传了。寄存器传参的好处是速度快,减少了对内存的读写次数。
push1 %ebp push1 %ebp保存栈底
%ebp %eax当前值
ebp %ebp %eax %eax
_start .global表 factorial factorial
_start .global表 .global表
je end_factorial end_factorial
push1 %eax
call factorial
.equ ST_write_buffer equ
.section .text
.rept .second .text
/etc/ld.so.config /etc/ld.so.config 环境变量 ld_library_path ld_library_path
.section .data
printf
字节, 字
x86, 。text段 .data .bss .bss
keytool -list -v -keystore D:\greenland\GreenVLand\greenVland\greens.jks
D:\greenland\GreenVLand\greenVland
http://www.manongjc.com/detail/56-bzahljroynjecdr.html---gpio口控制
gnu push1 btn gpio口控制
关于汇编:addl指令说明 --- https://www.codenong.com/31916614/
寄存器(2)汇编常用指令/寄存器 --- https://blog.csdn.net/lqy971966/category_10002137.html
通用寄存器就是最基础的寄存器,在程序执行的过程中,绝大部分时间多在操作这些寄存器实现指令功能
eax(32位)/rax(64位):
通常用来执行加法,函数调用的返回值一般也放在这里面
ebx(32位)/rbx:
通常用来数据存取
ecx(32位)/rcx:
通常用作for循环的计数器
edx(32位)/rdx(64位):
读取I/O端口时,存放端口号
esp(32位)/rsp(64位):
栈顶指针,指向栈的顶部
ebp(32位)/rbp(64位):
栈底指针,指向栈的底部,用ebp+偏移量的形式来定位函数存放在栈中的局部变量
esi(32位)/rsi(64位):
字符串操作时,用于存放数据源的地址
edi(32位)/rdi(64位):
字符串操作时,用于存放目的地址的,和esi两个经常搭配一起使用,执行字符串的复制等操作
x64架构比X86多了8个新的通用寄存器:分别为r8-r15通用寄存器
在X86时代,函数调用时,通用寄存器少,参数绝大多数时候是通过线程的栈来进行传递(当然也有使用寄存器传递的, 比如著名的C++ this指针使用ecx寄存器传递,不过能用的寄存器毕竟不多)
进入x64时代,寄存器资源富裕了,参数传递绝大多数都是用寄存器来传了。寄存器传参的好处是速度快,减少了对内存的读写次数。
Linux命令大全 ---- https://blog.csdn.net/lqy971966/category_10131106.html
linux-5
linguanh/p/5051346
regirster read
有八个常用程序寄存器%eax、%ecx、%edx、%ebx、%esi、%edi、%espρ和%ebp文章来源:https://www.toymoban.com/news/detail-411484.html
eax ecx esp ebp edx ebx esp esi堆栈指针 基值指针寄存器文章来源地址https://www.toymoban.com/news/detail-411484.html
到了这里,关于Linux大全的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!