- 博客(318)
- 资源 (5)
- 收藏
- 关注
原创 从Wifi接口调用看AIDL
1. App调用WifiManager.java中的connect方法,调用的是IWifiManager.aidl的接口。
2024-10-25 17:19:59 800
原创 Andriod连上wifi后未弹出登录弹窗问题处理
然后CaptivePortalState状态先调用enter(), 在调用exit(). 由于有addState(mCaptivePortalState, mMaybeNotifyState);登录界面被拉起的起始点: WifiEntry.SignIn方法, 最终调用startActivity. 发出android.net.conn.CAPTIVE_PORTAL, 这样的action .addState(A, B);4. 根据原生的CarSetting,知道在一个已连接的Wifi上点击连接,调用的是。
2024-10-18 17:42:58 911
原创 Android12的netd分析
system/netd/server/目录下的main.cpp和Android.bp 可知编译会生成netd的可执行程序。
2024-09-26 17:13:05 876
原创 xv6---Lab4 traps
0x00000064用字符串打出来,发现解释的方向是64 00 00 00 即r\0\0\0 而不是 \0\0\0r这就是小端。当printf执行完成后,会让pc=寄存器ra的值,然后程序会执行main函数中的0x38这行的代码。Q:在main的程序集代码中,函数f的调用在哪里?A:查看asm文件,发现没有对f,g的调用,g被内联f函数,f函数被内联到main函数。Q:main中,jalr跳转到printf之后,ra的值是多少?A:ra的值是0x38, 对应的0x34的下一条指令。
2022-12-20 15:00:15 1198 1
原创 xv6---Lab3: page tables
程序在系统上执行,操作的是虚拟内存地址,而虚拟内存到物理内存的映射需要一个函数f(var1, var2);其中var1是页表,而var2是偏移量,于是当需要操作一个变量的时候,操作系统可通过函数f(var1, var2);的实现(kernel/exec.c),系统调用exec将存储在文件系统上的,新的用户程序装载进内存里,然后执行它。系统之上的内存分配叫虚拟内存,通过内核的MMU单元去管理并映射到物理内存。,然后我们将物理内存看成是定长槽块的阵列,这些槽块大小与页相同,每个槽块叫做。
2022-12-07 23:59:02 1991 1
原创 内存管理---分页机制
这一样的实现是 physical_addr = flash[virtual_addr];综上:可通过32位的虚拟地址,通过二级页表访问4GB的物理内存,
2022-12-02 12:33:21 1113
原创 xv6---Lab2: system calls
执行syscall函数的时候,会将num赋值为寄存器a7的值,并通过num找到syscalls中的系统调用号对应的函数指针。至此可以去调用sys_trace函数了,这里需要关注:trace如何拿到传入的参数。而执行trace系统调用(li a7 22 和 ecall之后,),程序会跳转到syscall.c的void syscall(void)函数,这里就可理解为什么要把a7赋值为22了。具体实现如下:argint用于拿到系统调用传递的参数,0-5的参数,对应寄存器a0-a5。
2022-11-29 16:27:29 2447
原创 linux时区相关
--->一步步跟进去发现是调用timekeep的 nsecs = timekeeping_get_ns(&tk->tkr_mono);gettimeofday和settimeofday可读取/设置时间,时区。而时区可通过tzset和设置环境变量去影响localtime。需要注意图中虚线的部分表示这个时间受到时区的影响!工具timedatectl 即可查看系统时间和时区。glibc源码和官方文档。
2022-11-18 14:34:21 1318
原创 图解https读书笔记
client的公钥加密,server持有client的私钥解密。为了解决这个问题:client应该用client的私钥签名,server用client的公钥解签。client用server的公钥加密原文,用client的私钥签名。综上两种情况,client和server之间需要有两对公私钥:各自持有对方的公钥和自己的私钥。公开秘钥加密处理相对复杂,会降低通信效率,所以通信的时候希望使用共享密钥加密方式。client用server公钥加密,server持有server的私钥解密。
2022-11-18 11:18:46 1336
原创 xv6---Lab1: Xv6 and Unix utilities
sleep.c中的sleep--->/user/usys.S的调用--->调用/kernel/syscall.c的syscall函数--->调用到/kernel/sysproc.c的sys_sleep函数。(0)通过int pipe(int fd[2])创建管道,fd参数返回两个文件描述符,fd[0]指向管道的读端,fd[1] 指向管道的写端。/user/usys.S文件为sleep函数的实现,调用了/kernel/定义在user/user.h的int sleep(int);
2022-11-15 18:36:24 1476
原创 xv6---spinlock自旋锁
release一次就减1,直到为0才恢复中断(不一定会打开,需要根据,int old = intr_get()的值判断,old == 1代表acquires spinlock之前中断是打开的,反之用完了锁不打开)。可知:如果在release的时候打开了中断,那么其他cpu会立刻拿到spinlock, 且这个时候已经关闭过了中断,然后中断又被打开了,这肯定不行!进程A:键盘打字---产生中断---acquired 等待spinlock----写入数据。避免编译优化改变代码执行顺序。------>产生死锁。
2022-11-04 00:40:00 534
原创 RAW socket
当网卡处于这种“混杂”模式时,它对所有遇到的每一个数据帧都产生一个硬件中断,以提醒操作系统处理流经该物理媒体上的每一个报文包。要注意的是send/recv函数使用MSG_WAITALL的时候,sockfd 必须是处于阻塞模式下,否则WAITALL不能起作用。socket(PF_PACKET, SOCK_RAW, htons(ETH_P_XXX)) // 发送、接收数据链路层。查资料发现:默认情况下,网卡接收一个包,网卡只把发给本机的包(包括广播包)传到上层的APP。【以ptp报文帧为例】
2022-10-19 12:01:03 2641
原创 printf是如何打印到终端
打开了控制台的设备: /dev/consloe,并通过int fd = open ("/dev/consloe")往这个设备写数据,通过内核的调用栈:ttycore层--->ldisc层--->和设备匹配上的驱动的write方法。
2022-10-16 18:46:29 902
原创 ubuntu在recovery模式下备份文件
mount /dev/sda1 /root/u_bak //挂载u盘到/root/u_bak目录下。cp /home/pc123/test /root/u_bak //考本test文件到u盘。按住shift打开ubuntu,进入recovery模式的root选项。mkdir /root/u_bak //创建本地备份文件夹。umount /root/u_bak/ //取消挂载。fdisk -l //找到虚拟机识别到的u盘。在windows打开u盘即可看到需要的文件。
2022-10-10 14:13:11 1288
原创 IGMP协议
IGMP是组播原理涉及到的协议。IGMP协议作用于:主机和组播路由器之间。①Router发送普遍组查询报文(General Query)G1/G2/G3都会收到此报文。周期默认是60s。②Client发送:响应报文 (Report报文) 发送给RouterA(RTA)③G1发送的响应报文RouterA和G2,G3也会收到,当G3收到此响应报文,G3不会再向RouterA发送响应报文。当新的client加入网络,client可主动发送Report报文给Router。
2022-10-06 16:48:14 1625
原创 NXP的IPCF
IPCF通信原理:消息队列;环形,buffer descripter来维护两个OS之间的通信。OS1上的内存池(共享内存):OS1发送的时候ipc_shm_acquire_buf()【即从共享内存拿一片数据】,然后发送数据【往共享内存写数据】,并同步到这片内存到OS2的共享内存。产生中断通知对端OS。OS2收到中断:拷贝OS1调用ipc_shm_acquire_buf()操作的共享内存的数据,释放这片共享内存pc_shm_release_buf(),并同步到OS1的共享内存。
2022-10-06 15:25:52 2920
原创 strncpy和strcpy和memcpy
但memcpy会把字符的 0 和\0一起拷贝到buffer里,用%s打印依旧会打不出 789a,strncpy的源码也是依据0的结束符来判断是否拷贝完成,只是限定了拷贝的个数。但memcpy会根据个数来定需要拷贝多少字节,不会因为0而不拷贝。上面的方案都有毛病,那解决方案就是memcpy。拷贝abc到str数组,能正常输出。如上,结果为ab ,并没有被完全拷贝。
2022-09-30 00:28:53 458
原创 makefile的常用配置变量
将系统默认依赖的路径从/usr, /usr/local,/usr/bin等的路径前加上 /home/pc123。-Werror = error 要求GCC将所有的警告当成错误进行处理,让带有warning的编译不可以通过。chrdevbase.o 生成chrdevbase.ko文件。当一个没有定义的符号出现在 #if 中时,给出警告。将最后生成的文件放到/usr/local文件夹。指定编译时arm架构(即代码要运行的架构)默认的是gcc ,交叉编译需要指定编译器。CC = gcc //编译器。
2022-09-29 17:42:52 1105
原创 make install在makefile的写法
p,--preserve-timestamps:以文件的访问/修改时间作为相应的目的地文件的时间属性。-s,--strip:用strip命令删除symbol table,只适用于第一及第二种使用格式。-m,--mode=模式:自行设定权限模式 (像chmod),而不是rwxr-xr-x。-d,--directory:所有参数都作为目录处理,而且会创建指定目录的所有主目录。-g,--group=组:自行设定所属组,而不是进程目前的所属组。-S,--suffix=后缀:自行指定备份文件的。...
2022-09-29 17:34:19 2018
转载 mDNS协议
比如,A 主机进入局域网,开启了 mDNS 服务,并向 mDNS 服务注册以下信息:我提供 FTP 服务,我的 IP 是 192.168.1.101,端口是 21。如果理解了 DNS 协议,再去理解 mDNS 协议就很简单了,区别只是 mDNS 一般作用在一个局域网内的,有特定的 IP 地址,也就是 224.0.0.251,有特定的端口 5353,mDNS 的作用是实现局域网内的服务发现,查询,注册,DNS 作用是实现域名的解析,作用大概是一样的。当然,具体实现要比这个复杂点。
2022-09-29 00:24:59 963
转载 vLan的概念
首先,在一台未设置任何VLAN的二层交换机上,任何广播帧都会被转发给除接收端口外的所有其他端口(Flooding)。VLAN间路由,可以使用普通的路由器,也可以使用三层交换机。同时设置端口1、2属于红色VLAN、端口3、4属于蓝色VLAN。同样,C发送广播信息时,只会被转发给其他属于蓝色VLAN的端口,不会被转发给属于红色VLAN的端口。上图中为了便于说明,以红、蓝两色识别不同的VLAN,在实际使用中则是用“把它转发给同属于一个VLAN的其他端口——也就是同属于红色VLAN的端口2,就这样,VLAN通过。
2022-09-28 23:24:04 155
原创 从零开始使用Vscode调试XV6
针对makefile: 安装compiledb【git clone https://github.com/nickdiego/compiledb.git】来自动生成compile_commands.json。注意:由于有 "miDebuggerServerAddress": "127.0.0.1:26000", //所以需要吧.gdbinit 中 target remote xxxx:xx改为。一天时间的教训---系统要ubuntu20.04的 ,用ubuntu18.04的搞了一天。
2022-09-18 10:24:57 2589
原创 qemu 内核调试环境搭建
kernel /path/to/kernel/dir/arch/arm/boot/zImage 告诉qemu单板运行内核镜像路径。用的版本是ubuntu 18.04 ,qemu是6.0 ,按照下面的步骤做完了,提示-kernerl参数不对,不知怎么解决。安装完成后,会在busybox目录下生成_install目录,该目录下的程序就是单板运行所需要的命令。生成的内核镱像位于arch/arm/boot/zImage, 后续qemu启动时需要使用该镜像。-nographic 不使用图形化界面,只使用串口。
2022-09-15 15:22:27 1271
原创 Ubuntu搭建Mqtt服务器
比如机器0订阅了msg1, 于是机器1/机器2发布msg1,机器0都会收到。每个机器可以订阅,发布。谁订阅了某个topic,消息就会发给谁。config文件如下。
2022-09-15 12:59:58 2467
原创 Linux应用程序的启动流程
_libc_start_main函数的运行的顺序为:__libc_csu_init->main->__libc_csu_fini,__libc_csu_init叫构造函数,__libc_csu_fini叫析构函数,在代码中可通过__attribute__ ((constructor))标记构造函数,__attribute__ ((destructor))来标记析构函数 有这样的例子。在main.s文件找到地址为0x540的代码。看到一篇好文:摘抄记录--
2022-09-14 11:22:55 1448
Linux+虚拟机安装步骤
2018-10-28
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人