या अधिक आम तौर पर, क्या होता है यदि एक ऑपोड के साथ एक स्विई निर्देश! = 0 ऐसे कर्नेल पर निष्पादित किया जाता है? क्या यह संकेत उत्पन्न करता है? मैं पूछता हूं क्योंकि मैं इसे फंसाना चाहता हूं।क्या होता है यदि कोई प्रोग्राम ईएबीआई-केवल कर्नेल में ओएबीआई स्टाइल सिस्कल बनाता है?
उत्तर
कोड जो swi
फ़ील्ड फ़ील्ड यहां है: http://lxr.linux.no/linux+*/arch/arm/kernel/entry-common.S#L335। मैं एआरएम विशेषज्ञ नहीं हूं, लेकिन ऐसा प्रतीत होता है कि सीपीयू swi
तर्क को तब भी नहीं दबाता है जब कर्नेल इसे प्राप्त कर सकता है; अगर कर्नेल जानना चाहता है, तो उसे कॉलिंग प्रोग्राम की रनटाइम छवि से निर्देश प्राप्त करना होगा। यह हर सिस्टम को अधिक महंगी कॉल करता है, इसलिए (यदि मैं चीजों को सही तरीके से पढ़ रहा हूं) कर्नेल केवल यह जानने के लिए परेशान है कि swi
तर्क यह है कि यह CONFIG_OABI_COMPAT
के साथ संकलित है।
संपादित करें: ARM ARM पुष्टि करता है कि एसडब्ल्यूआई इसके तर्क के साथ कुछ भी उपयोगी नहीं करता है। (भौतिक पृष्ठ 634/तार्किक पृष्ठ ए 7-118।)
से एक निश्चित उत्तर नहीं मिला। आप सही हैं। यह (http://www.gossamer-threads.com/lists/linux/kernel/970771?do=post_view_threaded#970771) सबसे नज़दीकी चीज है जो मुझे मिल सकती है, मैं इसे हाथ और हालिया कर्नेल में बंदरगाह करने की कोशिश कर रहा हूं। – Alberto
तो मैंने यह देखने की कोशिश की कि क्या होगा। मैं निम्नलिखित कार्यक्रम संकलित और यह भाग गया:
#include <stdio.h>
#include <signal.h>
void traphandler(int signum, siginfo_t *info, void *context)
{
puts("trap");
}
int main()
{
struct sigaction sa;
sa.sa_sigaction = traphandler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_RESTART | SA_SIGINFO;
sigaction(SIGTRAP, &sa, NULL);
puts("begin");
asm("swi 1");
puts("after swi 1");
asm("swi 255");
puts("after swi 255");
}
और आउटपुट था:
begin
after swi 1
after swi 255
संकेत हैंडलर नहीं बुलाया गया था, और न ही कार्यक्रम की मौत हो गई। काफी निराशाजनक।
मैं कर्नेल स्रोत-पेड़ में चारों ओर खुदाई करने की सिफारिश करता हूं। एसआरआई जाल, शायद आश्चर्य की बात नहीं है, एआरएम असेंबलर में कर्नेल के बहुत कम हिस्सों में से एक है। – marko
सुझाव के लिए धन्यवाद, मैंने स्रोत को देखा लेकिन यह बिल्कुल आसान नहीं है :-) इसलिए मुझे – Alberto