> 文章列表 > Linux大全

Linux大全

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堆栈指针  基值指针寄存器