چرا باید حافظه ی سیموس قابل تغییر باشد ؟

در کامپیوترهایXT باتوجه به تعداد محدود پارامترها، پیکربندی سیستم بااستفاده از میکروسوئیچ امکان پذیر می باشد اما در سیستم های AT به دلیل بالا بودن تعداد پارامترهای قابل برنامه ریزی توسط استفاده کننده ، حضور یک منبع که هم به راحتی در دسترس باشد و هم جای کمی اشغال نماید ، ضروری به نظر می رسد. این منبع در کامپیوترهای AT حافظه CMOS نامیده می شود .

حافظه CMOS دارای ۶۴ بایت و یا بیشتر ظرفیت می باشد که توسط دو پورت H70 و H71 قابل دسترسی می باشد. و از آن برای نگهداری ساعت ، تاریخ و پیکربندی سیستم استفاده می شود. همچنین تعدادی از بیت های این حافظه برای چک کردن پیکربندی سیستم تحت عنوان CHECKSUM استفاده می شود.

محتویات این حافظه در زمان خاموش بودن سیستم توسط یک باطری پشتیبان ۶/۳ ولتی نگهداری می شود. این باطری ممکن است در داخل و یا در خارج از مادربورد قرار داشته باشد . البته در بعضی از سیستمها مجموعه باطری و حافظه به صورت یکپارچه ارائه شده که نمونه آن مارک DALLAS می باشد.

از نظر عملکرد و نحوه دستیابی هیچ تفاوتی بین انواع متفاوت CMOS وجود ندارد و همگی با استفاده از دو پورت یادشده قابل دسترسی و برنامه ریزی می باشند.

تغییر در محتویات CMOS بطور معمول از طریق برنامه SETUP امکان پذیر است اما در صورتی که در ست آپ سیستم رمز تعریف شده باشد و رمز مربوطه را هم در اختیار نداشته باشید در اینصورت امکان ورود به برنامه ست آپ و تغییر در پیکر بندی سیستم ( اطلاعات CMOS ) امکان پذیر نخواهد بود . در این موارد راهی جز پاک کردن محتویات CMOS نداریم . دراین مواقع در احتمال وجود دارد .

 

۱) برای وارد شدن به سیستم رمز تعریف شده باشد.
۲) برای وارد شدن به ست آپ رمز تعریف شده باشد.
در حالت اول با توجه به بوت نشدن کامپیوتر کاری از نرم افزارها ساخته نیست و باید اقدام به پاک کردن محتویات CMOS به صورت سخت افزاری نمود .
این کار معمولا با برداشتن باطری پشتیبان ست آپ برای چند دقیقه ، یااتصال کوتاه بر روی جامپر مربوطه ( J8 ) و یا تعویض تراشه CMOSامکان پذیر می باشد . البته این روشها در صورتی کارآمد خواهد بود که شما مجاز به بازکردن کیس کامپیوتر باشید که البته در اکثر مواقع این امکان وجود ندارد .
شایان ذکر است در صورتی که اعمال فوق درست صورت نگیرد احتمال سوختن و خراب شدن CMOS وجود دارد بنابراین تا حد امکان باید از کاربرد این روش اجتناب شود مگر در مواقعی که ضرورت ایجاب نماید.
در حالت دوم با توجه به بوت شدن کامپیوتر نیازی به اقدامات فوق نبوده و می توان با استفاده از نرم افزارهای مناسب اقدام به پاک کردن و یا ذخیره اطلاعات CMOS نماییم . از آنجایی که همیشه نرم افزار مناسب وجود ندارد و یا در دسترس نیست بعنوان یک مهندس نرم افزار باید قادر باشیم تا با استفاده از امکانات موجود بر روی کامپیوتر این کار را انجام دهیم . با استفاده از برنامه DEBUG.EXE که همراه فایلهای سیستم عامل DOS و ویندوز وجود دارد می توان با خواندن و یا نوشتن در پورت های H70 و H71 تغییرات لازم را در محتویاتCMOS اعمال نمود
از دو پورت فوق پورت H70 بعنوان گذرگاه آدرس( ADDRESS BUS ) و پورت H71 بعنوان گذرگاه داده بکار می رود. الگوریتم کلی کار به این صورت است که CMOS را بعنوان یک آرایه یک بعدی در نظر می گیریم که دارای ۲۵۶ خانه می باشد . برای دسترسی به هر خانه باید ابتدا اندیس ( آدرس ) خانه را در پورت H70 بنویسیم و بعد از دسترسی به خانه مورد نظر می توان دادة دلخواه را درآن نوشت و یا از آن خواند . دسترسی به داده ها نیز فقط از طریق پورت H71 امکان پذیر می باشد . آخرین نکته اینکه عمل نوشتن و یا خواندن از پورت ها به کمک ثبات AL و توسط دستورهای IN و OUT مربوط به زبان اسمبلی امکان پذیر است

تفاوت BIOS و CMOS چيست؟
افراد زيادي كه با كامپيوتر سر وكار دارند دو اصطلاح BIOS (كه مخفف basic input/output system است) و CMOS (كه مخفف complementary metal oxide semiconductor است) را با هم اشتباه مي گيرند و به يك معنا به كار مي برند. البته اين دو به هم مرتبطند ولي دو جزء مشخص و مجزا از هم هستند كه وجودشان براي كامپيوتر ضروري است. BIOS برنامه اي است كه يك كامپيوتر را استارت مي كند، در حاليكه CMOS جايي است كه برنامه BIOS اطلاعات و جزئيات مورد نيازش از قبيل تاريخ، زمان و تنظيمات سيستم را ذخيره مي كند.

BIOS يك برنامه كوچك است كه كنترل سيستم را از زمانيكه كامپيوتر روشن مي شود تا زمانيكه سيستم عامل كنترل را بدست مي گيرد در اختيار دارد. BIOS يك Firm ware (برنامه اي كه در حافظه فقط خواندني ROM قرار دارد) است.

CMOS يك نوع تكنولوژي از حافظه است كه مي تواند تنظيمات مورد نيازش را براي راه اندازي كامپيوتر در خود ذخيره كند. و در صورت نياز كاربر مي تواند اطلاعات يا تنظيماتي را اصلاح كند. BIOS كامپيوتر قطعاتي مانند فلاپي ديسك درايو و هارد ديسك و سرعت كلاك سخت افزاري را كنترل و راه اندازي مي كند.اما پارامترهاي خاصي براي راه اندازي كامپيوتر مورد نياز است كه بايد در جايي ذخيره و نگهداري شود. اينجا همان حافظه CMOS است و برنامه BIOS هر بار براي انجام وظايف خود از اين اطلاعات استفاده مي كند. بنابراين مشاهده مي كنيد كه اين دو به هم مرتبطند ولي دو واحد جداگانه هستند.

چند وقت پیش یکی از دوستان پرسیده بودند که ” اگر حافظه بایوس از نوع Rom ( فقط خواندنی ) می باشد و امکان تغییر آن وجود ندارد چگونه می توان با فشار دادن دکمه Del در هنگام بالا آمدن سیستم وارد پنجره setup بایوس شد و برخی از تنظیمات آن را تغییر داد ؟ ” . برای پاسخ به این سوال ابتدا کمی در مورد بایوس توضیح می دهم :

بایوس ( BIOS ) مخفف کلمه basic input output system می باشد و یک نرم افزار بسیار حیاتی برای کامپیوتر که این نرم افزار در ارتباط مستقیم با سخت افزار کامپیوتر می باشد . برنامه بایوس بروی یک حافظه از نوع Rom ریخته می شود ( Rom bios ) که شما به راحتی می توانید این حافظه را که عموما عبارت Bios نیز بروی آن درج شده است را بروی مادربورد مشاهده کنید . با توجه به اینکه نرم افزار بایوس بروی حافظه Rom قرار می گیرد امکان تغییر کلی در این نرم افزار توسط کاربر وجود ندارد و شما فقط قادر هستید برخی از قسمت های این نرم افزار که توسط شرکت سازنده تعیین شده است توسط پنجره setup تغییر دهید . حال سوالی که پیش می آید این است که این تغییرات که ما در پنجره Setup ایجاد می کنیم در کجا ثبت می شود با توجه به اینکه می دانیم نرم افزار Bios بروی حافظه Rom قرار دارد و امکان تغغیر آن وجود ندارد !؟

در واقع این تغییرات بروی یک حافظه مجزای دیگر از نوع Ram به نام CMOS قرار می گیرد . CMOS در واقع یک نوع نیمه هادی می باشد که دوستان رشته برق شاخه الکترونیک با این المان کاملا آشنا می باشند . CMOS ارتباط کاملا مستقیم با بایوس دارد و هر نوع تغییری که کاربر بروی برنامه بایوس انجام می دهد در CMOS ذخیره می شود . البته مشکلی که وجود دارد این است که CMOS از نوع RAM می باشد و بعد از خاموش شدن کامپیوتر اطلاعات آن از بین می رود . برای جلوگیری از بروز چنین مشکلی از یک باطری استفاده می شود که قطعا دوستان این باطری را بروی مادربورد دیده اند . این باطری وظیفه تامین برق مورد نیاز CMOS را در شرایطی که کامپیوتر خاموش می باشد بر عهده دارد تا اطلاعات ذخیره شده بروی CMOS به واسطه تغییر در برنامه بایوس از بین نرود . پس در واقع باطری که شما بروی مادربورد مشاهده می کنید برای حفظ اطلاعات CMOS می باشد و معروف به باطری CMOS می باشد که خیلی ها به اشتباه به آن باطری بایوس می گویند .
حال فرض کنیم به اشتباه تغییرات نادرستی را در بایوس ایجاد کردیم مثل تغییر در کلاک ( CLOCK ) و یا فرکانس عملکرد سی پی یو ( CPU ) و RAM که باعث شد کامپیوتر در هنگام بوت هنگ کند و سیستم کامپیوتر به هیچ عنوان اجرا نشود و یا پسوردی بروی بایوس خود قرار داده اید که آنرا فراموش کرده اید و چون می دانیم این اطلاعات بروی CMOS قرار می گیرد . برای پاک کردن این اطلاعات و بازگشت به تنظیمات اولیه بایوس باید CMOS را ریست کرد که برای این کار سه راه وجود دارد :
۱- در آوردن باطری CMOS
2- تغییر جامپر CMOS که عموما این جامپر در نزدیکی باطری CMOS قرار دارد و با نام CLRCMOS می باشد .

۳- فشار دادن دکمه ریست CMOS که این دکمه بروی برخی از مادربورد ها وجود دارد .

در تهیه این مقاله از مطالب سایت tomshardware.com نیز استفاده کردم . فقط در مورد تصویری که در ابتدای آموزش قرار داده ام باید بگم در این تصویر شما CMOS را مشاهده می کنید که برچسب سفید رنگی بروی آن قرار دارد . در سمت راست باطری CMOS و در سمت چپ خازن های الکترولیتی .

پاک کردن اطلاعات حافظه CMOS
در کامپيوترهايXT باتوجه به تعداد محدود پارامترها، پيکربندي سيستم بااستفاده از ميکروسوئيچ امکان پذير مي باشد اما در سيستم هاي AT به دليل بالا بودن تعداد پارامترهاي قابل برنامه ريزي توسط استفاده کننده ، حضور يک منبع که هم به راحتي در دسترس باشد و هم جاي کمي اشغال نمايد ، ضروري به نظر مي رسد. اين منبع در کامپيوترهاي AT حافظه CMOS ناميده مي شود .
حافظه CMOS داراي ۶۴ بايت و يا بيشتر ظرفيت مي باشد که توسط دو پورت H70 و H71 قابل دسترسي مي باشد. و از آن براي نگهداري ساعت ، تاريخ و پيکربندي سيستم استفاده مي شود. همچنين تعدادي از بيت هاي اين حافظه براي چک کردن پيکربندي سيستم تحت عنوان CHECKSUM استفاده مي شود.
محتويات اين حافظه در زمان خاموش بودن سيستم توسط يک باطري پشتيبان ۶/۳ ولتي نگهداري مي شود. اين باطري ممکن است در داخل و يا در خارج از مادربورد قرار داشته باشد . البته در بعضي از سيستمها مجموعه باطري و حافظه به صورت يکپارچه ارائه شده که نمونه آن مارک DALLAS مي باشد.
از نظر عملکرد و نحوه دستيابي هيچ تفاوتي بين انواع متفاوت CMOS وجود ندارد و همگي با استفاده از دو پورت يادشده قابل دسترسي و برنامه ريزي مي باشند.

تغيير در محتويات CMOS بطور معمول از طريق برنامه SETUP امکان پذير است اما در صورتي که در ست آپ سيستم رمز تعريف شده باشد و رمز مربوطه را هم در اختيار نداشته باشيد در اينصورت امکان ورود به برنامه ست آپ و تغيير در پيکر بندي سيستم ( اطلاعات CMOS ) امکان پذير نخواهد بود . در اين موارد راهي جز پاک کردن محتويات CMOS نداريم . دراين مواقع در احتمال وجود دارد .

۱) براي وارد شدن به سيستم رمز تعريف شده باشد.
۲) براي وارد شدن به ست آپ رمز تعريف شده باشد.
در حالت اول با توجه به بوت نشدن کامپيوتر کاري از نرم افزارها ساخته نيست و بايد اقدام به پاک کردن محتويات CMOS به صورت سخت افزاري نمود .

اين کار معمولا با برداشتن باطري پشتيبان ست آپ براي چند دقيقه ، يااتصال کوتاه بر روي جامپر مربوطه ( J8 ) و يا تعويض تراشه CMOSامکان پذير مي باشد . البته اين روشها در صورتي کارآمد خواهد بود که شما مجاز به بازکردن کيس کامپيوتر باشيد که البته در اکثر مواقع اين امکان وجود ندارد .

شايان ذکر است در صورتي که اعمال فوق درست صورت نگيرد احتمال سوختن و خراب شدن CMOS وجود دارد بنابراين تا حد امکان بايد از کاربرد اين روش اجتناب شود مگر در مواقعي که ضرورت ايجاب نمايد.

در حالت دوم با توجه به بوت شدن کامپيوتر نيازي به اقدامات فوق نبوده و مي توان با استفاده از نرم افزارهاي مناسب اقدام به پاک کردن و يا ذخيره اطلاعات CMOS نماييم . از آنجايي که هميشه نرم افزار مناسب وجود ندارد و يا در دسترس نيست بعنوان يک مهندس نرم افزار بايد قادر باشيم تا با استفاده از امکانات موجود بر روي کامپيوتر اين کار را انجام دهيم . با استفاده از برنامه DEBUG.EXE که همراه فايلهاي سيستم عامل DOS و ويندوز وجود دارد مي توان با خواندن و يا نوشتن در پورت هاي H70 و H71 تغييرات لازم را در محتوياتCMOS اعمال نمود

از دو پورت فوق پورت H70 بعنوان گذرگاه آدرس( ADDRESS BUS ) و پورت H71 بعنوان گذرگاه داده بکار مي رود. الگوريتم کلي کار به اين صورت است که CMOS را بعنوان يک آرايه يک بعدي در نظر مي گيريم که داراي ۲۵۶ خانه مي باشد . براي دسترسي به هر خانه بايد ابتدا انديس ( آدرس ) خانه را در پورت H70 بنويسيم و بعد از دسترسي به خانه مورد نظر مي توان دادة دلخواه را درآن نوشت و يا از آن خواند . دسترسي به داده ها نيز فقط از طريق پورت H71 امکان پذير مي باشد . آخرين نکته اينکه عمل نوشتن و يا خواندن از پورت ها به کمک ثبات AL و توسط دستورهاي IN و OUT مربوط به زبان اسمبلي امکان پذير است .

 

الگوريتم کلي حذف اطلاعات حافظه CMOS

void CLR_CMOS(void){
for(int i=0;i<256;i ++ ){
move value of i to register Al ;
Out Register Al to Port 70h ;
Set register Al to zero ;// Al=0
Out Register Al to Port 71h
}
return ;
}

پياده سازي اين الگوريتم به کمک زبان اسمبلي بسيار آسان مي باشد . اما از آنجا که قرار است اين الگوريتم را با استفاده از debug پياده سازي کنيم قبل از هر چيز بايد با تعدادي از دستورات اين نرم افزار آشنا شويم
با اجراي فايل debug.exe مي توانيد وارد محيط نرم افزار debug شويد محيط اصلي نرم افزار يک علامت خط تيره مي باشد که بعد از اجراي فايل debug.exe ظاهر مي شود.
اين نرم افزار داراي تعدادي دستور مي باشد که با تايپ يک علامت سئوال و فشردن کليد ENTER مي توان ليست فرمانها را مشاهده نمود . در زير تعدادي از فرمانها را که براي پياده سازي اين الگوريتم به آن نياز داريم توضيح مي دهيم و ساير فرامين را به خواننده واگذار مي کنيم تا درصورت نياز با مراجعه به راهنماي نرم افزار با نحوه کار هريک آشنا شود
عملکرد دستور

 

امکان نوشتن کداسمبلي از آدرس مشخص شده در صورت مشخص نکردن آدرس از آدرس موجود در IP بعنوان آدرس شروع استفاده مي شود . در ابتداي کار IP=100 است که همان شروع فايلهاي Com و يا bin مي باشد
A [address]

 

براي نمايش / مقداردهي ثبات ها بکار مي رود. در صورتي که بدون پارامتر استفاده شود محتويات کليه ثبات ها را نشان مي دهد اما در صورتي که با نام يک ثبات بکار رود علاوه بر نمايش مقدار فعلي ثبات مورد نظر امکان تغيير محتويات آنرا نيز فراهم مي آورد.
R [register]

 

براي مشخص نمودن نام و مسير فايل ورودي / خروجي بکار مي رود .
N [pathname]

براي اجراي برنامه تا يک آدرس مشخص بکار مي رود . چنانچه بدون پارامتر بکار رود برنامه را از خط جاري (ip فعلي ) تا انتهاي برنامه اجرا مي کند .
G

براي نوشتن برنامه از آدرس h100 به تعداد بايتهاي مشخص شده در ثبات cx بکار مي رود .
W

براي خروج از محيط DEBUG بکار مي رود
Q

حال با فرض بر اين که شما وارد محيط debug شده ايد مجموعه دستورات لازم براي پياده سازي الگوريتم فوق را در زير مي آوريم .
مرحله ۱

با اجراي دستور a وارد مود برنامه نويسي اسمبلي شويد در اين صورت debug با نشان دادن آدرس xxxx:0100 آمادگي خود را براي دريافت دستورات اعلام مي دارد ( در عمل debug بجاي xxxx سگمنت مربوط به برنامه را نشان مي دهد که توجه به اين موضوع اصلاً در اينجا اهميتي ندارد .)
مرحله ۲

دستورات زير را با دقت تايپ کرده و در انتهاي هر خط کليد ENTER را فشار دهيد ( مواردي که زير آن خط کشيده شده از طرف نرم افزار نشان داده مي شود اين آدرسها در واقع مشخص کننده طول هر دستور و در نهايت طول برنامه مي باشد) .
XXXX:100 MOV CL , FF
XXXX:102 MOV AL , CL
XXXX:104 OUT 70 , AL
XXXX:106 MOV AL , 0
XXXX:108 OUT 71 , AL
XXXX:10A LOOP 102
XXXX:10C INT 20
XXXX:10E