के साथ उपयोगकर्ता-स्तरीय थ्रेड बनाने के लिए मैं कुछ असाइनमेंट का उपयोग करके कुछ ओएस मूलभूत सिद्धांतों को समझने की कोशिश कर रहा हूं। मैंने पहले से ही एक समान प्रश्न पोस्ट कर लिया है और मुझे संतोषजनक उत्तर मिल गए हैं। लेकिन यह थोड़ा अलग है लेकिन मैं इसे डीबग करने में सक्षम नहीं हूं। तो यहां मैं क्या करता हूं:सेगमेंटेशन गलती सी और असेंबली
मैं एक मुख्य प्रोग्राम शुरू करने के लिए क्या करना चाहता हूं, एक स्थान malloc, उपयोगकर्ता स्तर के धागे को शुरू करने के लिए इसे एक ढेर के रूप में उपयोग करें। मेरी समस्या वापसी पते के साथ है। यहाँ कोड अब तक बताया गया है:
[मैं अपने कोड का संपादन कर रहा हूँ इसे करने की तारीख मेरा उत्तर की वर्तमान स्थिति के लिए बनाने के लिए]
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#define STACK_SIZE 512
void switch_thread(int*,int*);
int k = 0;
void simple_function()
{
printf("I am the function! k is: %d\n",k);
exit(0);
}
void create_thread(void (*function)())
{
int* stack = malloc(STACK_SIZE + 32);
stack = (int*)(((long)stack & (-1 << 4)) + 0x10);
stack = (int*) ((long)stack + STACK_SIZE);
*stack = (long) function;
switch_thread(stack,stack);
}
int main()
{
create_thread(simple_function);
assert(0);
return 0;
}
switch_thread एक विधानसभा कोड मैं के रूप में लिखा गया है इस प्रकार है:
.text
.globl switch_thread
switch_thread:
movq %rdi, %rsp
movq %rsi, %rbp
ret
इस कोड GDB के तहत अच्छी तरह से वास्तव में चलाता है और उम्मीद उत्पादन देता है (जो, simple_function और मुद्रण करने के लिए नियंत्रण गुजर "मैं समारोह हूँ कश्मीर है: 0"। लेकिन जब अलग से चलाने, इस एक सेगमेंटेशन गलती देता है। मैं इस परिणाम से परेशान हूं।
किसी भी मदद की सराहना की जाएगी। अग्रिम में धन्यवाद।
क्या आपको नहीं लगता कि आपको फ़ंक्शन कॉल पर अन्य रजिस्टरों की परवाह करनी चाहिए? – Alex
अपने स्टैक को 16 तक संरेखित करना न भूलें। –
@AkiSuihkonen यह एक बिंदु है जिसे मैं स्पष्ट करना चाहता हूं। क्या आप कृपया बता सकते हैं कि इसे 16 तक क्यों गठबंधन किया जाना चाहिए? – user2290802