免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: EncoreDeng
打印 上一主题 下一主题

[高级应用] 关于AIX 虚拟文件系统 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2014-07-10 11:13 |只看该作者
if ( (abc & B_READ) == B_WRITE)   啊?!

根据我拦截的数据
dev=8000000a00000005, flag=80c8000, offset=4310, len=1000
dev=8000000a00000005, flag=80c8000, offset=4318, len=1000
dev=8000000e00000001, flag=c8008, offset=6e91128, len=1000
dev=8000001700000000, flag=c8008, offset=6e91128, len=1000
dev=8000000a00000005, flag=80c8000, offset=10028, len=1000
dev=8000000e00000001, flag=c8008, offset=6e91138, len=1000
dev=8000001700000000, flag=c8008, offset=6e91138, len=1000
dev=8000000a00000005, flag=80c8000, offset=10038, len=1000
dev=8000000e00000001, flag=c8008, offset=6e91460, len=1000
dev=8000001700000000, flag=c8008, offset=6e91460, len=1000
dev=8000000a00000005, flag=80c8000, offset=10360, len=1000
dev=8000000e00000001, flag=c8008, offset=6ed1110, len=1000

这个判断永远是真啊...
不可能我只拦截到写数据吧...


回复 20# orian


   

论坛徽章:
0
22 [报告]
发表于 2014-07-10 14:55 |只看该作者
重新做了测试,发现确实最后一个bit为0就是写,为1就是读{:3_189:}

论坛徽章:
0
23 [报告]
发表于 2014-07-13 07:45 |只看该作者
不这样就出鬼了

论坛徽章:
0
24 [报告]
发表于 2014-07-13 10:17 |只看该作者
关于 struct buf, 还是有一个疑问
我尝试拦截iodone, 发现当b_flgs & B_AGE为真的时候, b_baddr指向的数据与真是io的数据不一样.

在buf.h中
#define B_AGE                (long)0x0080        /* put at hd of freelst when released */
而官方文档对B_AGE的说明为
The data is not likely to be reused soon, so prefer this buffer for reuse. This flag suggests that the buffer goes at the head of the free list rather than at the end.

而官网提及
These buffers are allocated in blocks of 4096 bytes. At any given time, each memory block is a member of one of two linked lists that the device driver and the kernel maintain:

而通常B_AGE设定之后, buf的b_count都大于4K.

我希望能够弄明白, B_AGE设定之后,IO的数据如何在struct buf中体现?

回复 23# orian


   

论坛徽章:
0
25 [报告]
发表于 2014-07-13 11:49 |只看该作者
首先,你截获的入口数据不一定是struct buf
其次,buf是链表结构,大于4096无所谓,buf中有forward和reward指针,能遍历全部链表。

但最关键的是入口不是struct buf,是和buf差不多的另一个结构,要你自己研究。

论坛徽章:
0
26 [报告]
发表于 2014-07-13 12:07 |只看该作者
拦截到的是buf应该没错了,因为其他信息,例如b_dev b_blkno b_count都没错,而且b_baddr只有在B_AGE设定了之后才有错.

关于
        struct        buf *b_forw;                /* hash list forward link         */
        struct        buf *b_back;                /* hash list backward link         */
        struct        buf *av_forw;                /* free list forward link         */
        struct        buf *av_back;                /* free list backward link         */

如何可以遍历全部链表呢?按我理解,是知道数值为0表示链表的尽头吗?

还是,和buf差不多的另一个结构,是指bufx?

好困惑啊...{:3_188:}


回复 25# orian


   

论坛徽章:
0
27 [报告]
发表于 2014-07-13 23:38 |只看该作者
你没有源码,ibm也没有公开,单看几个数据对上了,并不能说明任何问题,很多structure的大部分内容甚至关键数据的位置都是相同的,但还是有差异,这要自己慢慢琢磨,比较。

那个是典型的链表结构,如果不知道怎么用,看任何一本数据结构的计算机书都有介绍。

学而不思则罔,思而不学则殆。你困惑是思的太多。

论坛徽章:
0
28 [报告]
发表于 2014-07-17 11:31 |只看该作者
似乎我之前搞错了一些东西,所以弄糊涂了.

出现疑问的buf的典型数据

b_dev=8000000a0000000d, b_flags=880c8080, b_blkno=15a00, b_bcount=20000, b_baddr=7e0000, real_mem=17dbf000
遍历其b_back可得到相似的buf数据
b_dev=deadbeef, b_flags=40c0080, b_blkno=3f08, b_bcount=1000, b_baddr=7e1000
b_dev=deadbeef, b_flags=40c0080, b_blkno=3f10, b_bcount=1000, b_baddr=7e2000
b_dev=deadbeef, b_flags=40c0080, b_blkno=3f18, b_bcount=1000, b_baddr=7e3000
...

而普通的buf数据
b_dev=8000000a0000000d, b_flags=80c8000, b_blkno=117b8, b_bcount=1000 b_baddr=f1000a100219f000
b_baddr指向的数据与IO完成后,对应设备的偏移上的数据一致

而第一种有疑问的数,发现其b_flags的B_XPAGER被设定
#define        B_XPAGER        (long)0x80000000        /* D_XPAGER */

尝试xmemdma64(&pbuf->b_xmemd, pbuf->b_baddr, XMEM_HIDE);来获取其数据的真是内存地址, 得到real_mem=17dbf000似乎也不是想要的结果.

实在找不到对这种External pager buffer的相关更详细的说明,希望大神能够给点提示!

论坛徽章:
0
29 [报告]
发表于 2014-07-18 04:23 |只看该作者
ibm不公开的

公开的提示是你看到deadbeef就说明地址错误。

论坛徽章:
0
30 [报告]
发表于 2014-07-18 10:03 |只看该作者
啊?!deadbeef更像是一些magic code之类吧...地址错误怎么其他数据都这么有规律?

不公开的意思是知道了buf head也没办法获得buf的内容?

回复 29# orian


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP