关于multibin的启动。。。

0123456789   2009-11-25 16:41 楼主
我现在已经能启动BINFS+multibin+hive。。。。。
但是有一点很奇怪。。我只是copy了xipkernel的那段到RAM。。但是启动的时候还是会跟以前一样。。所有的DLL都会被加载。。。不知道是为什么。。。我真的只是copy了。。xipkernel。。才1.5M。。。

回复评论 (12)

这种方式下,xipkernel需要你程序中直接拷贝,其他的dll会通过binfs根据需要load进来,是这样的呀
有问题么
点赞  2009-11-25 17:45
你如何判断所有的DLL被加载了?
点赞  2009-11-25 17:47
这个是正确的啊,你觉得有问题吗?
如果不想让那些DLL加载的话就需要把你platform.reg中的驱动内容都删掉,然后用某个AP去加载那些驱动。否则DEVICE.EXE不会自动加载那些驱动,加载的时候也就自动把它们读到RAM中去。


所以大多数情况下multibin的主要作用是使剩余内存更大一些,而开机时间是没什么影响的。
点赞  2009-11-25 17:48
这就是它的作用。
点赞  2009-11-25 20:55
引用: 引用 2 楼 yashi 的回复:
你如何判断所有的DLL被加载了?


不是说所有。。只是跟以前一样。。。以前加载了多少。。现在就加载了多少。。比如说声卡。。。网卡。。。还有其他的一些。。。这能从打印信息看的到
点赞  2009-11-26 09:14
引用: 引用 3 楼 veabol 的回复:
这个是正确的啊,你觉得有问题吗?
如果不想让那些DLL加载的话就需要把你platform.reg中的驱动内容都删掉,然后用某个AP去加载那些驱动。否则DEVICE.EXE不会自动加载那些驱动,加载的时候也就自动把它们读到RAM中去。


所以大多数情况下multibin的主要作用是使剩余内存更大一些,而开机时间是没什么影响的。



如果真是那样的话。。我倒是真是感到很欣慰了。。照你的意思是说只要device。exe起来了就会去加载所有builtin下面的饿驱动吗??。。。。。那这些加载on demand有什么意义呢。。如果是做AP的话。。有什么思路呢
点赞  2009-11-26 09:17
引用: 引用 6 楼 unsway123 的回复:
引用 3 楼 veabol 的回复:
这个是正确的啊,你觉得有问题吗?
如果不想让那些DLL加载的话就需要把你platform.reg中的驱动内容都删掉,然后用某个AP去加载那些驱动。否则DEVICE.EXE不会自动加载那些驱动,加载的时候也就自动把它们读到RAM中去。


所以大多数情况下multibin的主要作用是使剩余内存更大一些,而开机时间是没什么影响的。



如果真是那样的话。。我倒是真是感到很欣慰了。。照你的意思是说只要device。exe起来了就会去加载所有builtin下面的饿驱动吗??。。。。。那这些加载on demand有什么意义呢。。如果是做AP的话。。有什么思路呢

不太清楚你on demand的意思
但是“照你的意思是说只要device。exe起来了就会去加载所有builtin下面的饿驱动吗”这个说法是肯定的
点赞  2009-11-26 09:21
帮你顶下,xip没弄过!呵呵!
点赞  2009-11-26 09:28
引用: 引用 7 楼 guopeixin 的回复:
引用 6 楼 unsway123 的回复:
引用 3 楼 veabol 的回复:
这个是正确的啊,你觉得有问题吗?
如果不想让那些DLL加载的话就需要把你platform.reg中的驱动内容都删掉,然后用某个AP去加载那些驱动。否则DEVICE.EXE不会自动加载那些驱动,加载的时候也就自动把它们读到RAM中去。


所以大多数情况下multibin的主要作用是使剩余内存更大一些,而开机时间是没什么影响的。


如果真是那样的话。。我倒是真是感到很欣慰了。。照你的意思是说只要device。exe起来了就会去加载所有builtin下面的饿驱动吗??。。。。。那这些加载on demand有什么意义呢。。如果是做AP的话。。有什么思路呢

不太清楚你on demand的意思
但是“照你的意思是说只要device。exe起来了就会去加载所有builtin下面的饿驱动吗”这个说法是肯定的


on demand 就是说当你要使用哪个驱动的时候。。binfs才会把它加载到RAM里面。。不需要就不加载
点赞  2009-11-26 09:31
引用: 引用 9 楼 unsway123 的回复:
引用 7 楼 guopeixin 的回复:
引用 6 楼 unsway123 的回复:
引用 3 楼 veabol 的回复:
这个是正确的啊,你觉得有问题吗?
如果不想让那些DLL加载的话就需要把你platform.reg中的驱动内容都删掉,然后用某个AP去加载那些驱动。否则DEVICE.EXE不会自动加载那些驱动,加载的时候也就自动把它们读到RAM中去。


所以大多数情况下multibin的主要作用是使剩余内存更大一些,而开机时间是没什么影响的。


如果真是那样的话。。我倒是真是感到很欣慰了。。照你的意思是说只要device。exe起来了就会去加载所有builtin下面的饿驱动吗??。。。。。那这些加载on demand有什么意义呢。。如果是做AP的话。。有什么思路呢

不太清楚你on demand的意思
但是“照你的意思是说只要device。exe起来了就会去加载所有builtin下面的饿驱动吗”这个说法是肯定的


on demand 就是说当你要使用哪个驱动的时候。。binfs才会把它加载到RAM里面。。不需要就不加载

哦,明白
共产主义,按需分配,呵呵
点赞  2009-11-26 09:33
哥们。。能有个思路吗?
点赞  2009-11-26 09:36

  1. HANDLE HandleDriver = INVALID_HANDLE_VALUE;                /* 驱动程序句柄     */
  2. HANDLE hFile = INVALID_HANDLE_VALUE;                        /* 设备文件操作句柄 */
  3. HKEY hDrvKey = NULL;                                                        /* 注册表操作句柄   */

  4. // Simple Driver 注册表信息
  5. WCHAR *szRegKey = L"Drivers\\BuiltIn\\SPL";
  6. WCHAR *szPrefix = L"SPL";
  7. WCHAR *szDLL = L"\\SimpleDriver.dll";
  8. WCHAR *szFriendlyName = L"Simple Driver";
  9. DWORD DrvIndex = 1;
  10. DWORD DrvOrder = 0;

  11. /*
  12. ; Simple Driver 注册表信息
  13. [HKEY_LOCAL_MACHINE\Drivers\BuiltIn\SPL]
  14.         "Prefix"="SPL"
  15.         "Dll"="\\SimpleDriver.dll"
  16.         "FriendlyName"="Simple Driver"
  17.         "Index"=dword:0
  18.         "Order"=dword:0
  19. */

  20. // 向注册表写入一个字符串
  21. #define WRITE_REG_SZ(Name, Value) RegSetValueEx(hDrvKey, Name, 0, REG_SZ, (LPBYTE)Value, \
  22.                                                                   (wcslen(Value)+1)*sizeof(WCHAR))

  23. // 向注册表写入一个 DWORD 型的值
  24. #define WRITE_REG_DWORD(Name, Value) {DWORD dwValue = Value; RegSetValueEx( hDrvKey, Name, \
  25.                                                                           0, REG_DWORD, (LPBYTE)&dwValue, sizeof(DWORD)); }


  26. // "加载驱动"按键单击事件代码
  27. void CSPLLoaderDlg::OnLoadDriver()
  28. {
  29.         LONG nErr;
  30.         DWORD dwDisp;

  31.         // 创建注册表键HKEY_LOCAL_MACHINE\Drivers\BuiltIn\SPL
  32.     nErr = RegCreateKeyEx(HKEY_LOCAL_MACHINE, szRegKey, 0, L"", 0, 0, NULL, &hDrvKey, &dwDisp);
  33.         if (nErr != ERROR_SUCCESS)
  34.         {
  35.                 MessageBox(_T("创建驱动注册表子键失败!"));       
  36.                 return;
  37.         }
  38.         else
  39.         {       
  40.                 // 往注册表添加内容
  41.         WRITE_REG_SZ( L"Prefix", szPrefix);                                                /* 写入 "Prefix"="SPL" */
  42.         WRITE_REG_SZ( L"Dll", szDLL);                                                        /* 写入 "Dll"="\\SimpleDriver.dll" */
  43.         WRITE_REG_SZ( L"FriendlyName", szFriendlyName);                        /* 写入 "FriendlyName"="Simple Driver" */
  44.         WRITE_REG_DWORD( L"Order", DrvOrder);                                        /* 写入 "Index"=dword:0 */
  45.         WRITE_REG_DWORD( L"Index", DrvIndex);                                        /* 写入 "Order"=dword:0 */
  46.         }

  47.         HandleDriver = ActivateDeviceEx(szRegKey, NULL, 0, NULL);        /* 加载 SimpleDriver 驱动 */
  48.         if (HandleDriver == INVALID_HANDLE_VALUE)
  49.                 MessageBox(_T("加载SimpleDriver失败."));
  50.         else
  51.                 MessageBox(_T("加载SimpleDriver成功."));
  52. }


  53. // "卸载驱动"按键单击事件代码
  54. void CSPLLoaderDlg::OnUnloadDriver()
  55. {
  56.         if (HandleDriver != INVALID_HANDLE_VALUE)
  57.         {
  58.                 OnCloseDriver();                                                                                        /* 关闭驱动 */
  59.                 BOOL ret = DeactivateDevice(HandleDriver);                                        /* 卸载 SimpleDriver 驱动 */
  60.                 if (ret == TRUE)
  61.                 {       
  62.                         RegCloseKey(hDrvKey);                                                                        /* 关闭注册表键                  */
  63.                         RegDeleteKey(HKEY_LOCAL_MACHINE, szRegKey);                                /* 删除注册表键的内容 */
  64.                         HandleDriver = INVALID_HANDLE_VALUE;
  65.                         MessageBox(_T("卸载SimpleDriver成功."));
  66.                 }
  67.                 else
  68.                 {
  69.                         MessageBox(_T("卸载SimpleDriver失败."));
  70.                 }
  71.         }
  72. }

这是AP加载驱动的示例代码。
但是这样挺烦的,如果是HIVE注册表的话每次AP加载后关机的时候还要删除注册表中的值,如上边卸载中的代码,否则由于注册表中保存了相应的值,下载启动的时候device.exe还是会自动加载。
点赞  2009-11-26 14:20
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复