MOV X16, #0
SVC 0x80
上面两句实际使用的是syscall,命令 ,此时寄存器x0是syscall指令参数。
例如x0是202,执行得是命令SYS_sysctl
x1 = 0x1700b5e50
第一个参数 =
0x1700b5e50: 01 00 00 00 0e 00 00 00 01 00 00 00 c2 16 00 00 ............?...
0x1700b5e50 = 0x00000001 可能表示
0x1700b5e54 = 0x0000000e = 14
#define KERN_PROC 14 /* struct: process entries */
0x1700b5e58 = 0x00000001
#define KERN_PROC_PID 1 /* by process id */
0x1700b5e5c = 0x000016c2 这个应该是进程ID
int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PID ,0x000016c2}
//调用CTL_KERN接口下的KERN_PROC功能,获取所有的进程信息(其实只有pid groupid uid session ruid lcid tty这七种信息)
x2 = 4//应该表示x1数组有几个参数
x3 = 0x00000001700b5bc0
x4 = 0x00000001700b5bb0
x5 = 0
x6 = 0
int st = sysctl(mib, miblen, NULL, &size, NULL, 0);//第一次调用sysctl,返回输出流的size,用来进行结构体对齐。
nt mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0};//mib数组中第一个元素是CTL_KERN,这事最高级别的信息,所有的最高级别的名称中都有CTL前缀,定义再/usr/include/sys/sysctl.h文件中。数组第二个元素被设为KERN_PROC,这表示sysctl将再输出流中返回一个程序入口的结构体。数组的第三个元素是KERN_PROC_ALL是全部进程。最后数组元素是进行的PID号,0代表全部。 它实际是要查询的name数组。
size_t miblen = 4;//mib的长度
size_t size; //输出流中的大小