Linux大全

 
奔跑吧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

eax ecx  esp  ebp  edx  ebx  esp esi堆栈指针  基值指针寄存器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值