PDA

View Full Version : تبدیل یک درایور 32 بیتی به 64 بیتی



Moharram
یک شنبه 08 اردیبهشت 1387, 18:29 عصر
سلام

من یک driver دارم با سورس کامل که در ویندوز 32 بیتی کار میکنه...
و حالا میخوام در ویندوز 64 بیتی هم همون درایور رو نصب کنم.

چه تغییراتی باید انجام بدم.

البته با اون کامپایل کنسولی DDK برای 64 بیتی کامپایل میکنم (چون هنوز نتونستم DDK رو با VS.NET پیوند بزنم حتی با نصب DDKWizaed) ولی کلی Error در مورد Type Cast میده.

با تشکر

MSK
سه شنبه 10 اردیبهشت 1387, 19:50 عصر
اگه یه درایور کامل شرکتی باشه فکر نکنم به این سادگی ها بتونی برای 64 بیتی تبدیلش کنی و کامپایلش کنی. پیچیده تر از این حرفهاست و بنظر بنده ی حقیر دنبال ورژن 64 بیتیش بگردی زحمتش کمتره!!

Moharram
چهارشنبه 11 اردیبهشت 1387, 07:24 صبح
اگه یه درایور کامل شرکتی باشه فکر نکنم به این سادگی ها بتونی برای 64 بیتی تبدیلش کنی و کامپایلش کنی. پیچیده تر از این حرفهاست و بنظر بنده ی حقیر دنبال ورژن 64 بیتیش بگردی زحمتش کمتره!!

نمیدونم منظور از شرکتی چیه... ولی سورس 32 بیتی کاملا در اختیار منه و حتی میتونم کامپایل کنم، ولی وقتی با کامپایلر 64 بیتی DDK کامپایل میکنم Error میگیرم.

در ضمن این درایور ورژن 64 بیتی نداره... چون Device مربوط بهش خاصه..

Moharram
دوشنبه 16 اردیبهشت 1387, 07:45 صبح
با تابع MmAllocateContiguousMemory مشکل دارم...

این تابع دو تا پارامتر میگیره:
1- حجم حافظه
2- یک UpperLimit برای این حافظه

مثلا اگه بزنیم UpperLimit = 0xFFFFFFFF یعنی حجم حافظه رو از 4GB اول Ram بگیر...
حالا من میخوام Ram زیاد بذارم و حجم زیادی از Ram بگیرم که این تابع False بر میگردونه

:گریه::گریه::گریه::گریه::گریه:

MSK
دوشنبه 30 اردیبهشت 1387, 17:38 عصر
منظورم مثلاً درایور های عظیمیه که شرکتهایی مثل انویدیا برای گرافیک و ... در سیستم عامل های اپن سرسی مثل لینوکس ارایه میشن. اگه همچی چیزی باشه (که من چند وقت پیش با گرافیکم همچین مشکلی پیدا کردم).

اما در مورد شما مگه مشکل آپر لیمیت دارید که میخواهید آپر لیمیتتون رو عوض کنید؟ فکر می کنم برای هر درایوری همون حد اکثر 2GB کافی باشه. اما در هر صورت من نمی دونم مشکل تابع شما چیه!!

Moharram
چهارشنبه 01 خرداد 1387, 14:04 عصر
منظورم مثلاً درایور های عظیمیه که شرکتهایی مثل انویدیا برای گرافیک و ... در سیستم عامل های اپن سرسی مثل لینوکس ارایه میشن. اگه همچی چیزی باشه (که من چند وقت پیش با گرافیکم همچین مشکلی پیدا کردم).

نه!!! من که گفتم سورس رو دارم در حالیکه در درایورهای شرکتی سورس در اختیار ما نیست.

1- هدف نهایی اینه که بتونیم در ویندوز 64 بیتی که RAM بیشتری رو Support میکنه درایور نصب بشه. مثلا 4 تا ماژول 2GB ایی و در مجموع 8GB حافظه داشته باشیم. از طرف دیگه نحوه کار این درایور اینجوریه که فضا از RAM سیستم میگیره و در اختیار سخت افزار قرار میده تا بتونه بصورت DMA دیتای پرسرعت رو از بیرون تحویل بگیره.

برای گم نشدن دیتا بهنگام Capture باید حجم زیادی حافظه داشته باشیم و برای بهینه شدن درایور اگه این حجمها تعدادشون بیشتر باشه بهتره!!!

در این راستا من میخوام 4 تا فضای 500MB رو Allocate کنم که احتمالا از UpperLimit چهار گیگابایتی میزنه بالاتر.... (با توجه به اینکه RAM هم در طول عمر سیستم Fragmented میشه)

2- در ضمن یک سوال کلی تر اینکه در ویندوز 64 بیتی ما 64 آدرسهای 64 بیتی داریم (Physical Address)
آیا Virtual Address و User Address هم 64 بیتی میشن با نه؟

3- یک سوال هم اینکه من شنیدن درایور نویسی در لینوکس راحت تره !!! آیا این درسته

MSK
چهارشنبه 08 خرداد 1387, 13:20 عصر
من هم فکر می کردم که با توجه به اینکه رجیستر دستور(ip) هم 64 بیتی می شه معقوله که فضای آدرسدهی هم به همون تناسب برای پروسس ها افزایش پیدا کنه.

اما این تاپیک + چند دا تاپیک دیگه که مشکلاتی از این قسم داشتند منو به شک انداخته. من یه رفرنس قدیمی در مورد تفاوت های اصلی win 32 asm و win 64 asm داشتم که البته مریوط به قبل از پیدایش رسمی ویندوز های 64 بیتی می شه. و تو اون دیده بودم که فضای آدرس دهی برای پروسس ها هم افزایش پیدا می کنه.
اما فکر کنم که توی masm 64 یه وارنیگ دیدم برای اینکه برای افزایش فضای آدرس دهی باید از آپشن largeaddressaware یا یه همچین چیزی استفاده کنم. میدونم این آپشن که براحتی با دستور masm64 /? توی bin ویژوال استودیو 2008 درستشو پیدا می کنی؛ توی 32 بیتی فضارو از 2GB به 3 تا 3.5 گیگ افزایش میده. اما فکر نکنم حتی توی ویندوز 64 هم (اگه پیشفرض همون 2 گیگ باشه) بتونی بیش از 4 گیگ فضا اختصاص بدی.

این تاپیک خوبیه چون به یکی از مشکلات من هم اشاره می کنه که اگه کسی بدونه و بهش جواب بده، به من هم لطف کرده. درواقع اگه کسی specipication خوبی برای تفاوت های پلتفرم 32 و 64 داره اگه لطف کنه و لینکشو اینجا بزاره خیلی لطف کرده.

با تشکر

pe32_64
جمعه 18 شهریور 1390, 21:07 عصر
احتمالا شما می خواهید بیشتر ازحجم nonpaged pool و unused pages استفاده کنید که نمی شه!
msdn را بخوانید

joker
شنبه 19 شهریور 1390, 21:06 عصر
با تابع MmAllocateContiguousMemory مشکل دارم...

این تابع دو تا پارامتر میگیره:
1- حجم حافظه
2- یک UpperLimit برای این حافظه

مثلا اگه بزنیم UpperLimit = 0xFFFFFFFF یعنی حجم حافظه رو از 4GB اول Ram بگیر...
حالا من میخوام Ram زیاد بذارم و حجم زیادی از Ram بگیرم که این تابع False بر میگردونه

:گریه::گریه::گریه::گریه::گریه:

همینجوری یه سرچ زدم روی گوگل ظاهرا خیلیا این مشکل را دارند :)
یکی گفته بود :
If you are using the memory for DMA transfer then you should use
AllocateCommonBuffer() from the dma adapter object to allocate contiguous
memory. Try that first and let me know if the system blue screens.