阅读:3476回复:43
还是跟虚拟磁盘有关的问题
上次的问题解决了
又有新问题,继续来问 我的代码基本上跟ramdisk差不多的(under 9x),唯一的差别就是在处理IOR的时候它把请求重定向到buffer,而我是重定向到disk file(用R0_FileIO) 现在我的虚拟磁盘能够被FSD识别并且在\"我的电脑\"显示出来,也能看到盘上的文件.比较不正常的是当虚拟磁盘驱动被加载之后系统变得很不稳定,很多操作会导致98跟死了一样,又没有异常发生,总之就是没什么反应了.比如双击虚拟盘上的文件,甚至不做任何跟它相关的操作都会导致系统没反应 我不知道这是什么问题,也不知道从何查起,希望有人指点一下,谢谢! 附: 我做了试验,改动我的代码,把请求重定向到buffer里面的话(把FILE_IO改成memcpy) 这样一切都是很正常的 |
|
最新喜欢:TOMG20...
|
沙发#
发布于:2002-12-09 18:11
DEAD LOCK IN VFAT.
|
|
|
板凳#
发布于:2002-12-09 18:14
谢谢版主
可以说的详细点吗? |
|
|
地板#
发布于:2002-12-10 12:01
Oney的ramdisk没有对iop进行排队
而98DDK中的block port driver的例子使用ILB_enqueue_iop和ILB_dequeue_iop来管理iop队列 我的问题跟这个有关系吗? |
|
|
地下室#
发布于:2002-12-10 13:38
lu0说得很对
我找到相关的资料了 谢谢你! 不过班门弄斧一下,原文上是\"Blocking in VFAT\",呵呵! 不过好像不是很容易解决的 [编辑 - 12/10/02 by JungleBoy] |
|
|
5楼#
发布于:2002-12-10 15:28
我也碰到了这个情况了!现在是一筹莫展啊!老兄能否相告如何解决啊!
|
|
6楼#
发布于:2002-12-10 15:44
我也还没有完全解决,只是知道大概的原因
这个问题产生的原因就是在IOS Port Driver里面不可以调用IFSMgr_Ring0_FileIO Service,因为VFAT不允许重入.一旦重入就会死锁(blocking,应该是这个意思吧?) 推荐几个连接给你看看先: http://groups.google.com/groups?hl=zh-CN&lr=&ie=UTF-8&inlang=zh-CN&selm=01bbaa74%24f0d2dda0%2437f91fcc%40%23mhervin.ix.netcom.com&rnum=7 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/iosguide/hh/iosguide/iosguide95_4i09.asp 可以发邮件讨论一下:JungleKnight@163.com |
|
|
7楼#
发布于:2002-12-11 11:18
呵呵!我也看到了!
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/iosguide/hh/iosguide/iosguide95_4i09.asp 请看这个 Here is a reportedly successful implementation of an IOS port driver that uses the above R0_MM_READ_WRITE Ring0_FileIo to access a local FAT file: Open the file with the following flags: R0_OpenFile(R0_NO_CACHE | R0_MM_READ_WRITE) CreateSemaphore() VWIN32_CreateRing0Thread() Set_Thread_Win32_Pri(16) - other values may work Set a worker thread running: Thread() while not stop Wait_Semaphore(BLOCK_THREAD_IDLE) Dequeue IOP Do R0 file I/O Do CallBack endwhile The IOP Handler: IOHandler(IOP) if read or write Enqueue IOP Signal_Semaphore() return endif Also, the developer reported the need to do periodic forced volume flushes to the memory mapped file (virtual drive) when a long file is being copied to it. This is done using IFSMGR_InstallFileSystemApiHook. After write operations to the virtual volume, a data byte counter is incremented and direct calls to volume\'s flush function through its function table occur if the counter = 1Mb. Without this, the reading of the file from system volume slows down and would ultimately result in being locked up in Ring0_FileIo. When R0_NO_CACHE is used, the system does not do any buffering during I/O. For example, the buffer address goes directly to the ESDI port driver. |
|
8楼#
发布于:2002-12-11 11:33
说老实话我没有完全搞懂这段话.
我做了相关的试验:在R0_OpenCreateFile的时候给flags与上一个R0_MM_READ_WRITE,没有任何变化,系统照旧在驱动加载后过一会儿就没有反应 我想应该是要启一个线程的,所有的R0_File I/O都在这个线程里面去完成.IOP routine只是起个通知线程有request到来的作用. 这样是否能够解决重入的问题呢? 昨天我问了一个高手他说IOS port driver里面是不可以调R0_File IO service的,我不知道他考虑过上面那个途径没有.他提出了两个方案: 1.在Pagable memory中分配内存buffer,然后在init的时候把文件内容读到buffer中去;(这个方法似乎不好,因为我们的image file可能会很大) 2.用绝对磁盘读写.也就是说我们得知道image file所在的扇区.这个是比较麻烦的.并且如果在mount上virtual disk之后万一有人在image file所在的磁盘上做defragment操作就完蛋了. 我很想知道能否通过启动一个Ring0线程来完成这项工作.可惜暂时还没有人来指点我.只能自己摸索了 [编辑 - 12/11/02 by JungleBoy] |
|
|
9楼#
发布于:2002-12-11 22:49
直接调用FSD的对应的routine,不要用Ring0 File I/O。
|
|
|
10楼#
发布于:2002-12-12 09:14
??
可以说的详细点吗? |
|
|
11楼#
发布于:2002-12-12 11:33
每个FSD都有一组Volume Function Table。比如,你想打开FAT上的一个文件,就应该先得到VFAT的FS_OpenFile的指针,然后自己构造一个ifsreq(ioreq的超集),把里面的数据自己构造好,最后直接调用那个FS_OpenFile即可。
以后要对这个文件进行读写,就要用Open File时得到的另外一组Handle Based Function。 具体的细节,应该去看Inside the Windows 95 File System,虽然里面没有直接的实现方法,但看过之后肯定就明白了。 |
|
|
12楼#
发布于:2002-12-12 12:04
那你能不能够解释一下FSD的routine跟R0 File I/O有什么不同呢?
我觉得原先产生死锁的原因是这样的: 1、FSD(VFAT) send IOP 给我的驱动(因为我的虚拟设备是FAT格式的); 2、在我的IOP routine里面调用R0_File I/O; 3、R0_File I/O又会send IOP给VFAT; 这样就造成VFAT重入了,然而VFAT是不可以重入的。所以系统被hang住 这是我的理解,可能有些偏差。 按照我这样理解的话,如果不是做虚拟磁盘,而是虚拟光驱的话在IOP routine里面应该是可以使用R0_File I/O的(因为CD_ROM的I/O请求是由CDFS发过来的,所以不会造成VFAT重入),但是我没做过,所以不知道。 我目前的做法是计算磁盘镜像文件的sectors,然后用0环下的磁盘读写进行I/O。这个方法不是很好,首先计算sector就是一件很麻烦的事情,而且不同的文件系统计算方法也不一样,我做了FAT32的,根本不知道NTFS的怎么算。麻烦! 我觉得这个问题虽然有些过时,但是涵盖了9x IOS的许多方面,希望高手们来讨论一下解决方案。谢谢! |
|
|
13楼#
发布于:2002-12-12 12:45
我做了创建线程的方法!可是在创建线程的时候就有问题啊!
基本的结构和CreateSemaphore() VWIN32_CreateRing0Thread() Set_Thread_Win32_Pri(16) - other values may work Set a worker thread running: Thread() while not stop Wait_Semaphore(BLOCK_THREAD_IDLE) Dequeue IOP Do R0 file I/O Do CallBack endwhile The IOP Handler: IOHandler(IOP) if read or write Enqueue IOP Signal_Semaphore() return endif 说的一样 可是不管我在驱动程序的初始化里面创建线程还是在onrequest里面创建线程都不行!线程体现出来的是同步的!就是说当调用 VWIN32_CreateRing0Thread的时候,线程运行,而我在线程里面是 while(1) { Wait_Semaphore(pSemHandle, BLOCK_POLL); 。。。。。。。。。。。。。 } 结果系统也是死等了! 以下是我创建线程的代码,不知道错在哪里呢! hThread = VWIN32_CreateRing0Thread(4096,(ULONG)pDCB,(PVOIDFUNCOFDW)ProcessThread,OnCallBack,&hRing3Thread); if(hThread) { LOCK_Set_Thread_Win32_Pri(hThread,16); //LOCK_Set_Thread_Static_Boost(hThread,16); } |
|
14楼#
发布于:2002-12-12 12:55
我觉得你这样的话不会死啊?
你的线程一直在Wait_Semaphore 当有IOP需要处理的时候,IOP routine调用Signal_Semaphore.然后线程就开始处理了 //你用VTools的吗?好爽!我不能用.不知道应该怎么写VWIN32_CreateRing0Thread的Wrapper,所以没有尝试这个办法 |
|
|
15楼#
发布于:2002-12-12 13:11
啊!你没有vtools吗?ds里面带有的啊!
|
|
16楼#
发布于:2002-12-12 13:12
对了!98DDK里面带有的那个port例子,里面提供了一个isr的函数呢!
|
|
17楼#
发布于:2002-12-12 13:15
我有,不过我不能用
我只能用DDK 你那边的情况怎么样了? |
|
|
18楼#
发布于:2002-12-12 13:37
呵呵!持续的郁闷中啊!只好自己再看看了!
|
|
19楼#
发布于:2002-12-12 14:39
int
installthread( void* t ) { _asm { mov ecx, 4096 mov edi, 0 mov ebx, [t] xor esi, esi } VxDCall (_VWIN32_CreateRing0Thread) } void __Ring0Thread( void ) { nSemaphore = Create_Semaphore(1); while (1) { Wait_Semaphore(nSemaphore, BLOCK_THREAD_IDLE); if (terminatethread) break; DeQueueIOP(); if (terminatethread) break; } threadid = -1; Destroy_Semaphore(nSemaphore); } void InstallR0Thread( void ) { if (threadid == -1) threadid = installthread(&__Ring0Thread); } 在 Control_Dispatch W32_DeviceIoControl 里面创建R0Thread。所有变量为注明的都是全局int。 |
|
上一页
下一页