Part5
代码是:
g_callback_tracker->SimulatePacketArrival(NCI_MT_NTF, 0, NCI_GID_CORE, NCI_MSG_CORE_RESET, reset_core.data(),reset_core.size());std::vector
这段代码关闭了NFC,目的是从i93顺利切换到T3T。
Part 6
std::vector
part5中从I93 tag中读取了数据,并且启动定时器,我们必须在定时器过期前立即调用pe通知NFCC终止立即I93 Tag,并激活T3T Tag 。
g_callback_tracker->SimulatePacketArrival(NCI_MT_NTF,0,NCI_GID_RF_MANAGE,NCI_MSG_RF_INTF_ACTIVATED,activate_another_rf.data(),activate_another_rf.size());
就调用了pe,
pe 代码为:
tNFC_STATUS RW_SetActivatedTagType(tNFC_ACTIVATE_DEVT* p_activate_params,tRW_CBACK* p_cback) {...memset(&rw_cb.tcb, 0, sizeof(tRW_TCB));...
原来从一个状态切换到另一个状态的方法是调用(&rw_cb.tcb,0,())将TCB控制块全部置零清空,虽然看起来没错,但是把控制块清空并不等价于将上个状态的上下文被全部重置,他忽略了之前启动的定时器此时仍在工作,但新的tag也会启动自己的定时器,并改写TCB中相同偏移的数据 。
TCB是被复用的,我们使用而非free,说明状态切换后,这块内存仍然存放的是TCB,所以此时系统里会出现两个定时器改写同一地址的情景 。
以下是T3T tag下定时器向TCB中写入数据时代码:
2367*p_b = rw_t3t_mrti_base[e] * b; /* (B+1) * base (i.e T/t3t * 4^E) */
汇编是:
1: x/5i $pc=> 0x5de2a3 <_Z13rw_t3t_selectPhhh+787>:mov%r12d,%eax0x5de2a6 <_Z13rw_t3t_selectPhhh+790>:shr$0x6,%al0x5de2a9 <_Z13rw_t3t_selectPhhh+793>:movzbl %al,%eax0x5de2ac <_Z13rw_t3t_selectPhhh+796>:lea0x813de0(,%rax,4),%rdi0x5de2b4 <_Z13rw_t3t_selectPhhh+804>:mov%rdi,%rax
调用栈是:
#0rw_t3t_select (peer_nfcid2=
- 悲催的宋仁宗:挨了皇后的打后竟然向宰相去告状
- 世界上最惨烈的水库溃坝悲剧,河南“75-8”洪灾,究竟有多恐 世界之最不少于75字
- A股历史上十大牛股竟有6成都来自这个板块 中国股市历年十大牛股
- 这么多世界之最竟然都在山西,少看一个都很遗憾!#山西dou知道 历史十个世界之最
- 拜登罕见说实话,承认美国基建不如中国,中国基建究竟有多强? 中国基建处于世界之最吗
- 奇闻:刘备拿下蜀川后第一件事竟是娶个寡妇回家
- 悲情太子:竟然被亲生母亲用卑劣手段废除
- 大将*年羹尧极致荣宠竟仍逃不过命丧黄泉
- 历史上汉代皇帝竟都是*:汉哀帝竟独宠董贤
- 慈禧缘不做汽车的原因竟是不想司机坐她前面!