الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيف يتم اغلاق الحاسب

بدأه MohamedIBrahim في 6 أغسطس 2011 · 7 رد · 653 مشاهدة · في الأخبار والنقاشات التقنية
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمه الله وبركاته

اولا اعتذر اذا كان المكان خاطئ للموضوع لكنني احترت اين اضعه

انني اريد معرفة الفكرة البرمجية التي يمكننا بها اغلاق الجهاز

سأعطي مثال

لنتفرض انني فى تصميم نظام التشغيل اريد عمل زر لاغلاق الحاسب من النظام نفسه مثل ويندوز ولينكس الخ

تقريبا لم أجد الا هذه الفكرة

باستخدام

S5 state .

	#define SLP_EN  (1 << 13)
	void shutdown() // دالة الاغلاق
	{
    unsigned int i, j, len, count, found, *ptr, *rsdp = 0, *rsdt = 0, *facp = 0, *dsdt = 0;
	    unsigned char *data, slp_typ[2];

	    // find acpi RSDP table pointer
	    for(ptr = (unsigned int *)0x000E0000; ptr < (unsigned int *)0x000FFFFF; ptr++){
	        if(*ptr == ' DSR' && *(ptr + 1) == ' RTP'){ // "RSD PTR "
	            if(crc8((unsigned char *)ptr, 20)) continue;
	            rsdp = ptr;
	            break;
	        }
	    }
	    if(!rsdp) goto haltonly;

	    // find RSDT table pointer
	    ptr = (unsigned int *)*(ptr + 4);
	    if(crc8((unsigned char *)ptr, *(ptr + 1))){
	        printf("Error: RSDT checksum mismatch.\n");
	        goto haltonly;
	    }
	    rsdt  = ptr;
	    count = (*(ptr + 1) - 36) / 4;

	    // find FACP table pointer
	    ptr += 9; // skip RSDT entries
	    for(i = 0; i < count; i++){
	        for(j = 0; j < 24; j++){
	            if(*(unsigned int *)*ptr == 'PCAF'){ // "FACP"
	                facp = (unsigned int *)*ptr;
	                i = count;
	                break;
            }
	        }
	    }
    if(!facp){
	        printf("Error: Could not find FACP table.\n");
	        goto haltonly;
	    }
	    if(crc8((unsigned char *)facp, *(facp + 1))){
	        printf("Error: FACP checksum mismatch.\n");
	        goto haltonly;
	    }

	    // find DSDT table pointer
    ptr = (unsigned int *)*(facp+10); // DSDT address
    if(*ptr != 'TDSD'){ // "DSDT"
        printf("Error: Could not find DSDT table.\n");
	        goto haltonly;
	    }
	    if(crc8((unsigned char *)ptr, *(ptr + 1))){
	        printf("Error: DSDT checksum mistmatch.\n");
       goto haltonly;
	    }
	    dsdt = ptr;

	    // Search DSDT byte-code for ACPI _S5 signature
	    found = 0;
	    len   = *(dsdt + 1) - 36;
	    data  = (unsigned char *)(dsdt + 36);
    while(len--){
	        if((*(unsigned int *)data & 0x00FFFFFF) == 0x0035535F){ // "_S5"
            data += 4;
	            if(*data == 0x12){ // 0x012 = package opcode
	                data += 3; // 0x0A = 8bit integer opcode
	                slp_typ[0] = (*data == 0x0A) ? *++data : *data;
	                data++;
	                slp_typ[1] = (*data == 0x0A) ? *++data : *data;
                found = 1;
	            }
	            break;
	        }
	        data++;
	    }
	    if(!found) goto haltonly;

	    // execute the actual shutdown and power-off
	    outw(*(facp + 16), slp_typ[0] | SLP_EN);     // FACP[64] = PM1a_CNT_BLK
	    if(*(facp + 17))
	        outw(*(facp + 17), slp_typ[1] | SLP_EN); // FACP[68] = PM1b_CNT_BLK
	    printf("Shutting down...\n");
	    halt();

	haltonly:
	    printf("It is now safe to turn-off your computer.\n");
	    halt();

	}

فمل هى الطريقة التي تعرفها

ملاحظة ليست على منصة معينة بل فى مرحلة انشاء نظام مثلا

تم تعديل هذه المشاركة بواسطة MohamedIBrahim في 6 أغسطس 2011 في 18:24

1

GoodBye

#2

عند اغلاق نظام التشغيل يقوم بمهمتين

1 - على مستوى ال Software

اغلاق البرامج والملفات والمهام

( طبعا لايحتاج لمسح الذاكرة memory لانها تمسح تلقائيا مع اغلاق الجهاز واعادة التشغيل - ولكن ال Virtual Memory التى تستخدم القرص الصلب مطلوب مسحها )

2 - على مستوى ال Hardware

يصدر اوامر لل BIOS لاطفاء الجهاز

مصادر تفيديك ان شاء الله رب العالمين

http://compbio.cs.toronto.edu/repos/snowflock/xen-3.0.3/xen/arch/x86/shutdown.c

http://en.wikipedia.org/wiki/BIOS

http://stackoverflow.com/questions/678458/shutdown-the-computer-using-assembly

ومن المصدر الاخير تجد الكود التالى

;Connect to APM API
MOV     AX,5301
XOR     BX,BX
INT     15

;Try to set APM version (to 1.2)
MOV     AX,530E
XOR     BX,BX
MOV     CX,0102
INT     15

;Turn off the system
MOV     AX,5307
MOV     BX,0001
MOV     CX,0003
INT     15

;Exit (for good measure and in case of failure)
RET

والله الموفق

تم تعديل هذه المشاركة بواسطة PWCT Maker في 6 أغسطس 2011 في 19:19

2
#3

ان لم تخني معلوماتي هذه النقطة التي تبحث عنها لها براءة اختراغ لميكروسوفت .. ولطالما نشبت نزاعات حولها ..

لذلك اعتقد انه ليس من السهل ان تجد شئ يخدمك .. هذا ماأعرفه ..

تحياتي العطرة ..

يَارَبُ إِن ضَاقَت قُلُوُب الْنَّاسٍ عَنْ مّافِي .. مِنْ خَيْرٍٍ فَعَفْوكَ لَا يَضِيْقْ ..

#4
اقتباس

ان لم تخني معلوماتي هذه النقطة التي تبحث عنها لها براءة اختراغ لميكروسوفت .. ولطالما نشبت نزاعات حولها ..

لذلك اعتقد انه ليس من السهل ان تجد شئ يخدمك .. هذا ماأعرفه ..

اخى الحبيب سنان

براءة الاختراع التى تتحدث عنها تتعلق بامور تفصيلية عن الية الاغلاق (مثل اغلاق البرامج ... ولو كان هناك برامج تعمل يخير المستخدم هل تغلق ام لا وهكذا .... وامور اخرى)

المصدر http://itwadi.com/node/1408

والله الموفق

2
#5
سنان محمد صالح كتب:

ان لم تخني معلوماتي هذه النقطة التي تبحث عنها لها براءة اختراغ لميكروسوفت .. ولطالما نشبت نزاعات حولها ..

لذلك اعتقد انه ليس من السهل ان تجد شئ يخدمك .. هذا ماأعرفه ..

تحياتي العطرة ..

لماذا هل لو أنني اردت عمل اغلاق لنظام التشغيل احتاج الى الذهاب الى المحاكم

اظن ان البراءة هى فكرة معينة لميكروسوفت وليس الاغلاق نفسه والا مثلا كيف يتم اغلاق انظمة مثل لينكس وbsd

ذكرتني أخي الكريم

بقضية x86 بين AMD و Intel وما ذكره القاضي فى القضية عندما رفض دعوة انتل على 86 كعلامة تجارية

ووقتها قال القاضي

هل لو عندي سيارة 86 هل ستأخذها انتل كحق لها :lol:

على العموم شكرا لردك

وشكرا على ردك يا محمود وهطلع على المصادر ولى عودة ان شاء الله لو وصلت لنتيجة

GoodBye

#6

حسب فكرة توصلت لها من قراءة Ralf Brown's interrupt list

اننا اذا اردنا اغلاق الجهاز انه علينا محاولة الوصول الى APM interface فى البيوس وتحديدا INT 15 FN 5300-5310h ويمكننا مراجعة قائمة المقاطعات Ralf Brown's interrupt list

ويمكننا استخدام هذا الكود كفكرة مبدئية

mov ax, 5300h        ; check for existance of APM
mov bx, 0
int 15h              ; returns version in AL and AH
jc APM_Missing

; open an interface with APM
mov ax, 5301h
mov bx, 0
mov cx, 0
int 15h
jc interfaceFailed

; do a power off
mov ax, 5307h
mov cx, 3
mov bx, 1
int 15h

GoodBye

#7
MohamedIBrahim كتب:

لماذا هل لو أنني اردت عمل اغلاق لنظام التشغيل احتاج الى الذهاب الى المحاكم

اظن ان البراءة هى فكرة معينة لميكروسوفت وليس الاغلاق نفسه والا مثلا كيف يتم اغلاق انظمة مثل لينكس وbsd

ذكرتني أخي الكريم

بقضية x86 بين AMD و Intel وما ذكره القاضي فى القضية عندما رفض دعوة انتل على 86 كعلامة تجارية

ووقتها قال القاضي

هل لو عندي سيارة 86 هل ستأخذها انتل كحق لها :lol:

على العموم شكرا لردك

وشكرا على ردك يا محمود وهطلع على المصادر ولى عودة ان شاء الله لو وصلت لنتيجة

يا اخي كنت اقصد شئ بعيدا عن هذا ..

فهمه محمود واجاب عليه ..

البراءة منسوبة الى طريقة العمل .. وهي امر بالفعل موجود .. وهذا لا يعني انك ستدخل السجن .. لكن اقصد ان هذه الامور لن تجدها بشكل مباشر ..

يَارَبُ إِن ضَاقَت قُلُوُب الْنَّاسٍ عَنْ مّافِي .. مِنْ خَيْرٍٍ فَعَفْوكَ لَا يَضِيْقْ ..

#8
سنان محمد صالح كتب:

يا اخي كنت اقصد شئ بعيدا عن هذا ..

فهمه محمود واجاب عليه ..

البراءة منسوبة الى طريقة العمل .. وهي امر بالفعل موجود .. وهذا لا يعني انك ستدخل السجن .. لكن اقصد ان هذه الامور لن تجدها بشكل مباشر ..

وانا ايضا فهمت مقصدك ولاحظ جملتي تلك

اقتباس

اظن ان البراءة هى فكرة معينة لميكروسوفت وليس الاغلاق نفسه والا مثلا كيف يتم اغلاق انظمة مثل لينكس وbsd

فهى نفس مقصدك

وهو ان ميكروسوفت لها افكار وتفاصيل معينة كبراءة

لكن عملية الاغلاق موجودة من قبل وجود شركة ميكروسوفت فى انظمة

8/16 bit

وان كان هناك اختلافات شاسعة

GoodBye

مواضيع مشابهة