# برنامه نویسی سطح پایین > توسعه‌ی هسته‌ی سیستم عامل >  تبدیل یک درایور 32 بیتی به 64 بیتی

## Moharram

سلام

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

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

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

با تشکر

----------


## MSK

اگه یه درایور کامل شرکتی باشه فکر نکنم به این سادگی ها بتونی برای 64 بیتی تبدیلش کنی و کامپایلش کنی. پیچیده تر از این حرفهاست و بنظر بنده ی حقیر دنبال ورژن 64 بیتیش بگردی زحمتش کمتره!!

----------


## Moharram

> اگه یه درایور کامل شرکتی باشه فکر نکنم به این سادگی ها بتونی برای 64 بیتی تبدیلش کنی و کامپایلش کنی. پیچیده تر از این حرفهاست و بنظر بنده ی حقیر دنبال ورژن 64 بیتیش بگردی زحمتش کمتره!!


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

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

----------


## Moharram

با تابع *MmAllocateContiguousMemory*  مشکل دارم...

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

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

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

----------


## MSK

منظورم مثلاً درایور های عظیمیه که شرکتهایی مثل انویدیا برای گرافیک و ... در سیستم عامل های اپن سرسی مثل لینوکس ارایه میشن. اگه همچی چیزی باشه (که من چند وقت پیش با گرافیکم همچین مشکلی پیدا کردم).

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

----------


## Moharram

> منظورم مثلاً درایور های عظیمیه که شرکتهایی مثل انویدیا برای گرافیک و ... در سیستم عامل های اپن سرسی مثل لینوکس ارایه میشن. اگه همچی چیزی باشه (که من چند وقت پیش با گرافیکم همچین مشکلی پیدا کردم).


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

* 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

من هم فکر می کردم که با توجه به اینکه رجیستر دستور(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

احتمالا شما می خواهید بیشتر ازحجم nonpaged pool و  unused pages استفاده کنید که نمی شه!
msdn را بخوانید

----------


## joker

> با تابع *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.

----------

