5. 服务使用过程

test_client进程:

用户态:

(1)已结获得了“hello”服务,handle=1;

(2)构造数据:code(那个函数)和函数参数

(3)发送ioctl后进入内核态,先写后读

(15)取出返回值

内核态:

(4)binder_ioctl被调用,根据handle在binder_proc中根据refs_by_desc找到binder_ref,在根据node找到服务的binder_node结构体,在根据proc找到目的进程test_server

(5)把数据放入test_server的todo链表

(6)唤醒test_server进程,然后在binder_thread_read中休眠

(17)被唤醒后把数据返回给用户空间

test_server进程:

用户态:

(8)取出数据,根据code调用哪个函数,并把参数给函数

(9)把返回值构造为数据

(10)调用ioctl来发送返回数据

内核态:

(7):被唤醒后把数据返回用户空间

(11)找到要回复的进程test_client

(12)把数据放入test_client的todo链表

(13)唤醒test_client进程

使用服务

构造数据(参数),格式:四字节全零+四字节字符串长度+字符串("weidongshan")

txn.code 表示的是哪个函数,就是个整数,为双方约定其代表某个函数

接着调用ioctl先写后读,把数据放入test_server的todo结构体,接着唤醒test_server,然后自身休眠
[ 1580.379989] test_client (1381, 1381), binder_thread_write : BC_TRANSACTION
[ 1580.386741] binder: 1381:1381 BC_TRANSACTION 9 -> 1373 - node 3, data beb20a5c-beb20a4c size 32-0
[ 1580.395634] test_client (1381, 1381), binder_transaction , print data :
[ 1580.402184] 0000: 00 . 00 . 00 . 00 . 0b . 00 . 00 . 00 . 77 w 00 . 65 e 00 . 69 i 00 . 64 d 00 .
[ 1580.411029] 0016: 6f o 00 . 6e n 00 . 67 g 00 . 73 s 00 . 68 h 00 . 61 a 00 . 6e n 00 . 00 . 00 .

[ 1580.419888] test_client (1381, 1381), binder_thread_read : BR_NOOP

test_server被唤醒后返回用户控件,取出code和参数后调用函数执行,得到返回值后构造BC_REPLY类型数据调用ioctl回复给test_client,
[ 1580.426103] test_server (1373, 1373), binder_thread_read : BR_TRANSACTION
[ 1580.432828] test_server (1373, 1373), binder_thread_read , print data :
[ 1580.439419] 0000: 00 . 00 . 00 . 00 . 0b . 00 . 00 . 00 . 77 w 00 . 65 e 00 . 69 i 00 . 64 d 00 .
[ 1580.448263] 0016: 6f o 00 . 6e n 00 . 67 g 00 . 73 s 00 . 68 h 00 . 61 a 00 . 6e n 00 . 00 . 00 .
[ 1580.457129] test_client (1381, 1381), binder_thread_read : BR_TRANSACTION_COMPLETE

//用户空间处理完数据后,把内核态保存数据的buffer释放掉
[ 1580.464710] test_server (1373, 1373), binder_thread_write : BC_FREE_BUFFER
[ 1580.471541] test_server (1373, 1373), binder_thread_write : BC_REPLY
[ 1580.477877] binder: 1373:1373 BC_REPLY 10 -> 1381:1381, data be857a5c-be857a4c size 4-0
[ 1580.485859] test_server (1373, 1373), binder_transaction , print data :
[ 1580.492455] 0000: 01 . 00 . 00 . 00 .
[ 1580.496109] test_client (1381, 1381), binder_thread_read : BR_NOOP
[ 1580.502282] test_server (1373, 1373), binder_thread_read : BR_NOOP

test_client收到BR_REPLY类型数据,返回数据1
[ 1580.508436] test_client (1381, 1381), binder_thread_read : BR_REPLY
[ 1580.514684] test_client (1381, 1381), binder_thread_read , print data :
[ 1580.521301] 0000: 01 . 00 . 00 . 00 .
[ 1580.524929] test_server (1373, 1373), binder_thread_read : BR_TRANSACTION_COMPLETE
[ 1580.532489] test_client (1381, 1381), binder_thread_write : BC_FREE_BUFFER
[ 1580.539345] test_server (1373, 1373), binder_thread_read : BR_NOOP
[ 1580.545510] test_client (1381, 1381), binder_thread_write : BC_RELEASE

最新文章

  1. [Oracle](不会的是三炮)把状态列表作为存储过程参数这件小事
  2. html5的小知识点小集合
  3. dede表单修改默认必填
  4. [转]Sql server2005中如何格式化时间日期
  5. Spark on yarn配置项说明与优化整理
  6. springmvc(3)--数据类型转换
  7. java 全角、半角字符串转换
  8. Servlet实现文件的下载
  9. python 安装ssh和Scrapy
  10. MFC模板CArray及其派生类
  11. Request.getparameternames 获取form表单里面所有的请求参数 。 返回一个Enumeration类型的枚举.
  12. Scala - 快速学习05 - 数据结构
  13. [APIO2012]派遣
  14. Java.util.properties读取配置文件分析
  15. Codeforces 985 E - Pencils and Boxes
  16. DirectX10安装路径自动生成DXSDK_DIR
  17. PowerDesigner使用笔记
  18. 字蛛fontSpider的使用
  19. antd-mobile的按需加载
  20. v-model的双向数据绑定(表单)

热门文章

  1. eclipse部署maven web项目到tomcat服务器时,没有将lib、web.xml复制过去的解决办法
  2. 72.调用req.flash('error', '用户已存在!'); 时候 报错 "req.flash is not a function"
  3. 码农Coding Peasant(s):一般指从事没有发展前景的软件开发职位
  4. 多重背包模板 51Nod 1086
  5. Linux 内建命令和系统命令
  6. VBA调试利器debug.print
  7. Android学习笔记进阶15之Shader渲染
  8. 3.SOAP和WSDL的一些必要知识
  9. Linux中iptables学习
  10. C#操作SQLite方法实例详解