मैं अपनी निजी मौज-मस्ती के लिए कर्नेल इंटर्न को संशोधित करने, पैच लगाने, डिवाइस ड्राइवरों और मॉड्यूल को संभालने में रुचि रखता हूं।
क्या कर्नेल हैकिंग के लिए एक व्यापक संसाधन है, जिसका उद्देश्य अनुभवी प्रोग्रामर के लिए है?
मैं अपनी निजी मौज-मस्ती के लिए कर्नेल इंटर्न को संशोधित करने, पैच लगाने, डिवाइस ड्राइवरों और मॉड्यूल को संभालने में रुचि रखता हूं।
क्या कर्नेल हैकिंग के लिए एक व्यापक संसाधन है, जिसका उद्देश्य अनुभवी प्रोग्रामर के लिए है?
जवाबों:
**TODO** +editPic: Linux Kernel Developer -> (Ring Layer 0)
+addSection: Kernel Virtualization Engine
KERN_WARN_CODING_STYLE: Do not Loop unless you absolutely have to.
Uninitialized के लिए अनुशंसित पुस्तकें
void *i
"पुरुष पुस्तकों को तब तक नहीं समझते हैं जब तक उनके पास एक निश्चित मात्रा में जीवन नहीं होता है, या किसी भी दर पर कोई भी व्यक्ति एक गहरी पुस्तक को नहीं समझता है, जब तक कि वह अपनी सामग्री का कम से कम हिस्सा नहीं देख और जी लेता है"। -ईज़रा पाउंड
एक हजार कोड-मील की यात्रा एक कदम के साथ शुरू होनी चाहिए। यदि आप असमंजस में हैं कि निम्नलिखित में से कौन सी किताब शुरू करें, तो चिंता न करें, अपनी पसंद का कोई भी विकल्प चुनें। भटकने वाले सभी लापता नहीं हुए हैं। जैसा कि सभी सड़कें अंततः राजमार्ग से जुड़ती हैं , आप अपनी कर्नेल यात्रा में नई चीजों का पता लगाएंगे क्योंकि पृष्ठ बिना किसी मृत छोर को पूरा किए प्रगति करते हैं, और अंततः से कनेक्ट होते हैं code-set
। सतर्क दिमाग के साथ पढ़ें और याद रखें: कोड साहित्य नहीं है ।
जो बचा है वह कोई चीज या भाव या छवि या मानसिक चित्र या स्मृति या विचार भी नहीं है। यह एक समारोह है। किसी प्रकार की एक प्रक्रिया। जीवन का एक पहलू जिसे कुछ "बड़े" के कार्य के रूप में वर्णित किया जा सकता है। और इसलिए, ऐसा प्रतीत होता है कि यह वास्तव में उस चीज़ से "अलग" नहीं है। चाकू के कार्य की तरह - कुछ काटना - वास्तव में, चाकू से खुद को अलग करना नहीं है। फ़ंक्शन इस समय उपयोग में हो सकता है या नहीं भी हो सकता है, लेकिन यह संभवतः अलग है।
सोलोवे स्ट्रैसेन डेराइज्ड अल्गोरिद्म फॉर प्राइमलिटी टेस्ट :
विरोधाभास और विवाद न पढ़ें; न मानना और न लेना; बात और प्रवचन खोजने के लिए नहीं; लेकिन तौलना और विचार करना। कुछ पुस्तकों को चखा जाना है, दूसरों को निगला जाना है, और कुछ को चबाया और पचाया जाना है: अर्थात्, कुछ किताबें केवल कुछ हिस्सों में पढ़ी जानी हैं, दूसरों को पढ़ी जानी हैं, लेकिन उत्सुकता से नहीं, और कुछ को पूरी तरह से पढ़ने के लिए , और परिश्रम और ध्यान के साथ।
static void tasklet_hi_action(struct softirq_action *a)
{
struct tasklet_struct *list;
local_irq_disable();
list = __this_cpu_read(tasklet_hi_vec.head);
__this_cpu_write(tasklet_hi_vec.head, NULL);
__this_cpu_write(tasklet_hi_vec.tail, this_cpu_ptr(&tasklet_hi_vec.head));
local_irq_enable();
while (list) {
struct tasklet_struct *t = list;
list = list->next;
if (tasklet_trylock(t)) {
if (!atomic_read(&t->count)) {
if (!test_and_clear_bit(TASKLET_STATE_SCHED,
&t->state))
BUG();
t->func(t->data);
tasklet_unlock(t);
continue;
}
tasklet_unlock(t);
}
local_irq_disable();
t->next = NULL;
*__this_cpu_read(tasklet_hi_vec.tail) = t;
__this_cpu_write(tasklet_hi_vec.tail, &(t->next));
__raise_softirq_irqoff(HI_SOFTIRQ);
local_irq_enable();
}
}
कोर लिनक्स (5 -> 1 -> 3 -> 2 -> 7 -> 4 -> 6)
“प्रकृति में न तो कर्नेल है और न ही शेल; वह एक ही बार में सब कुछ है - जोहान वोल्फगैंग वॉन गोएथे
रीडर को ऑपरेटिंग सिस्टम अवधारणाओं के साथ अच्छी तरह से वाकिफ होना चाहिए ; लंबे समय तक चलने वाली प्रक्रियाओं की उचित समझ और निष्पादन की छोटी फटने वाली प्रक्रियाओं के साथ इसके अंतर; नरम और कठोर वास्तविक समय की कमी को पूरा करते हुए गलती सहनशीलता। पढ़ते समय, यह समझना महत्वपूर्ण है और n/ack
कोर सबसिस्टम में लिनक्स कर्नेल स्रोत द्वारा किए गए डिज़ाइन विकल्प।
थ्रेड्स [और] सिग्नल [हैं] दुख, निराशा, डरावनी और पागलपन के एक प्लेटफ़ॉर्म-आश्रित निशान हैं (~ एंथनी बैक्सटे)। कहा जा रहा है कि आपको कर्नेल में गोता लगाने से पहले एक स्व-मूल्यांकन सी विशेषज्ञ होना चाहिए। आपके पास लिंक्ड लिस्ट्स, स्टैक्स, क्यूज़, रेड ब्लैक ट्रीज़, हैश फंक्शन्स, एट अल के साथ भी अच्छा अनुभव होना चाहिए।
volatile int i;
int main(void)
{
int c;
for (i=0; i<3; i++) {
c = i&&&i;
printf("%d\n", c); /* find c */
}
return 0;
}
लिनक्स कर्नेल स्रोत की सुंदरता और कला जानबूझकर उपयोग किए जाने वाले कोड ऑबफ्यूज़ेशन में निहित है। यह अक्सर साफ और सुरुचिपूर्ण तरीके से दो या अधिक संचालन को शामिल करने वाले कम्प्यूटेशनल अर्थ को व्यक्त करने के लिए आवश्यक है। मल्टी-कोर आर्किटेक्चर के लिए कोड लिखते समय यह विशेष रूप से सच है।
रियल-टाइम सिस्टम , टास्क शेड्यूलिंग , मेमोरी कम्प्रेशन , मेमोरी बैरियर , एसएमपी पर वीडियो लेक्चर
#ifdef __compiler_offsetof
#define offsetof(TYPE,MEMBER) __compiler_offsetof(TYPE,MEMBER)
#else
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#endif
लिनक्स डिवाइस ड्राइवर (1 -> 2 -> 4 -> 3 -> 8 -> ...)
"संगीत आपको साथ नहीं ले जाता है। आपको अपनी भावनाओं और कहानी के उस छोटे छोटे कर्नेल पर ध्यान केंद्रित करने की अपनी क्षमता के साथ इसे सख्ती से साथ रखना होगा"। - डेबी हैरी
आपका कार्य मूल रूप से हार्डवेयर डिवाइस और सॉफ़्टवेयर कर्नेल के बीच एक उच्च गति संचार इंटरफ़ेस स्थापित करना है। आपको डिवाइस के व्यवहार को समझने के लिए हार्डवेयर संदर्भ डेटाशीट / मैनुअल पढ़ना चाहिए और यह नियंत्रण और डेटा स्टेट्स और भौतिक चैनल प्रदान करता है। आपके विशेष आर्किटेक्चर के लिए असेंबली का ज्ञान और वीएलएसआई हार्डवेयर का उचित ज्ञान वर्णन वीएचडीएल या वेरिलॉग जैसी भाषाएं आपको लंबे समय तक मदद करेगी।
प्रश्न : लेकिन, मुझे हार्डवेयर चश्मा क्यों पढ़ना है?
A : क्योंकि, "कार्बन और सिलिकॉन का एक सांचा है जो सॉफ्टवेयर नहीं चला सकता है" - राहुल सोननद
हालाँकि, ऊपर कम्प्यूटेशनल एल्गोरिदम ( ड्राइवर कोड - बॉटम-हाफ प्रोसेसिंग ) के लिए कोई समस्या नहीं है , क्योंकि यह एक यूनिवर्सल ट्यूरिंग मशीन पर पूरी तरह से नकली हो सकता है । यदि गणना परिणाम गणितीय डोमेन में सही है , तो यह निश्चित है कि यह भौतिक डोमेन में भी सही है ।
लिनक्स डिवाइस ड्राइवर्स पर वीडियो लेक्चर्स (Lec। 17 & 18), एंबेडेड ऑफ एंबेडेड केएमएस ड्राइवर , पिन कंट्रोल एंड जीपीआईओ अपडेट , कॉमन क्लॉक फ्रेमवर्क , एक वास्तविक लिनक्स ड्राइवर लिखें - ग्रेग केएच
static irqreturn_t phy_interrupt(int irq, void *phy_dat)
{
struct phy_device *phydev = phy_dat;
if (PHY_HALTED == phydev->state)
return IRQ_NONE; /* It can't be ours. */
/* The MDIO bus is not allowed to be written in interrupt
* context, so we need to disable the irq here. A work
* queue will write the PHY to disable and clear the
* interrupt, and then reenable the irq line.
*/
disable_irq_nosync(irq);
atomic_inc(&phydev->irq_disable);
queue_work(system_power_efficient_wq, &phydev->phy_queue);
return IRQ_HANDLED;
}
कर्नेल नेटवर्किंग (1 -> 2 -> 3 -> ...)
"इसे एक कबीला कहें, इसे एक नेटवर्क कहें, एक जनजाति कहें, इसे एक परिवार कहें: जो भी आप इसे कहते हैं, जो भी आप हैं, आपको एक की आवश्यकता है।" - जेन हावर्ड
कर्नेल में एक पैकेट वॉक-थ्रू समझना कर्नेल नेटवर्किंग को समझने की कुंजी है। अगर हम नेटफिल्टर या IPSec इंटर्नल को समझना चाहते हैं, तो इसे समझना बहुत जरूरी है। लिनक्स कर्नेल नेटवर्क परत की दो सबसे महत्वपूर्ण संरचनाएँ हैं: struct sk_buff
औरstruct net_device
static inline int sk_hashed(const struct sock *sk)
{
return !sk_unhashed(sk);
}
कर्नेल डिबगिंग (1 -> 4 -> 9 -> ...)
जब तक इसके साथ संवाद करने में कोई नहीं कहता है, तब तक जिसके परिणामस्वरूप परेशानी होती है। ~ एलन ट्यूरिंग, कंप्यूटर के बारे में
पेपर यूनिक्स फॉर बिगिनर्स (1979) में ब्रायन डब्ल्यू कार्निघन ने कहा, "सबसे प्रभावी डिबगिंग टूल अभी भी सावधानी से सोचा गया है, जो विवेकपूर्ण रूप से रखे गए प्रिंट स्टेटमेंट के साथ मिलकर है"। तेजी से निदान के लिए सही डेटा प्राप्त करने में मदद करने के लिए आपको क्या करना है, यह जानना। महान कंप्यूटर वैज्ञानिक Edsger Dijkstra ने एक बार कहा था कि परीक्षण कीड़े की उपस्थिति को प्रदर्शित कर सकते हैं लेकिन उनकी अनुपस्थिति को नहीं। अच्छी जांच प्रथाओं को समस्याओं को जल्दी से हल करने, अपने कौशल का निर्माण करने की आवश्यकता और विषय विशेषज्ञों के प्रभावी उपयोग की आवश्यकता को संतुलित करना चाहिए।
कई बार जब आप रॉक-बॉटम मारते हैं, तो कुछ भी काम नहीं करता है और आप अपने सभी विकल्पों से बाहर निकल जाते हैं। इसके बाद ही असली डिबगिंग शुरू होती है। एक बग आपको अप्रभावी समाधान पर एक निर्धारण से विघटित करने की आवश्यकता को प्रदान कर सकता है।
कर्नेल डिबग और प्रोफाइलिंग पर वीडियो व्याख्यान , कोर डंप विश्लेषण , GDB के साथ मल्टीकोर डिबगिंग , मल्टी-कोर रेस की शर्तों को नियंत्रित करना , इलेक्ट्रॉनिक्स को डीबग करना
/* Buggy Code -- Stack frame problem
* If you require information, do not free memory containing the information
*/
char *initialize() {
char string[80];
char* ptr = string;
return ptr;
}
int main() {
char *myval = initialize();
do_something_with(myval);
}
/* “When debugging, novices insert corrective code; experts remove defective code.”
* – Richard Pattis
#if DEBUG
printk("The above can be considered as Development and Review in Industrial Practises");
#endif
*/
फ़ाइल सिस्टम (1 -> 2 -> 6 -> ...)
"मैं वर्चुअल मेमोरी लेना चाहता था, कम से कम यह फाइल सिस्टम के साथ युग्मित है"। - केन थॉम्पसन
UNIX सिस्टम पर, सब कुछ एक फाइल है; अगर कुछ फ़ाइल नहीं है, तो यह एक प्रक्रिया है, नामांकित पाइप और सॉकेट को छोड़कर। एक फाइल सिस्टम में, एक फाइल का प्रतिनिधित्व किया जाता है inode
, एक प्रकार का क्रम संख्या जिसमें वास्तविक डेटा के बारे में जानकारी होती है जो फ़ाइल बनाती है। लिनक्स वर्चुअल फ़ाइल सिस्टम VFS
प्रत्येक फ़ाइल सिस्टम से मेमोरी में सूचना को कैश करता है क्योंकि यह माउंट और उपयोग किया जाता है। फ़ाइल सिस्टम को सही ढंग से अपडेट करने के लिए बहुत सावधानी बरतनी चाहिए क्योंकि इन कैश के भीतर डेटा को संशोधित किया जाता है क्योंकि फाइलें और निर्देशिकाएं बनाई जाती हैं, जिन्हें लिखा और हटाया जाता है। इन कैश में सबसे महत्वपूर्ण है बफ़र कैश, जिसे इस तरह से एकीकृत किया जाता है कि अलग-अलग फ़ाइल सिस्टम अपने अंतर्निहित ब्लॉक स्टोरेज डिवाइस तक पहुंचते हैं।
भंडारण प्रणालियों पर वीडियो व्याख्यान , फ्लैश फ्रेंडली फ़ाइल सिस्टम
long do_sys_open(int dfd, const char __user *filename, int flags, umode_t mode)
{
struct open_flags op;
int fd = build_open_flags(flags, mode, &op);
struct filename *tmp;
if (fd)
return fd;
tmp = getname(filename);
if (IS_ERR(tmp))
return PTR_ERR(tmp);
fd = get_unused_fd_flags(flags);
if (fd >= 0) {
struct file *f = do_filp_open(dfd, tmp, &op);
if (IS_ERR(f)) {
put_unused_fd(fd);
fd = PTR_ERR(f);
} else {
fsnotify_open(f);
fd_install(fd, f);
}
}
putname(tmp);
return fd;
}
SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode)
{
if (force_o_largefile())
flags |= O_LARGEFILE;
return do_sys_open(AT_FDCWD, filename, flags, mode);
}
सुरक्षा (1 -> 2 -> 8 -> 4 -> 3 -> ...)
"यूनिक्स को अपने उपयोगकर्ताओं को बेवकूफ चीजें करने से रोकने के लिए नहीं बनाया गया था, क्योंकि यह उन्हें चतुर चीजें करने से भी रोक देगा"। - डग Gwyn
यदि इसका उपयोग नहीं किया जाता है तो कोई तकनीक काम नहीं करती है। तकनीक के साथ नैतिकता बदलती है।
" एफ × एस = के " स्वतंत्रता और सुरक्षा का उत्पाद एक स्थिर है। - निवेन के नियम
क्रिप्टोग्राफी ऑनलाइन ट्रस्ट का आधार बनाती है। हैकिंग तकनीकी, भौतिक या मानव-आधारित तत्व में सुरक्षा नियंत्रण का शोषण कर रहा है। कर्नेल को अन्य चल रहे कार्यक्रमों से सुरक्षित करना एक सुरक्षित और स्थिर प्रणाली की ओर पहला कदम है, लेकिन यह स्पष्ट रूप से पर्याप्त नहीं है: अलग-अलग उपयोगकर्ता-भूमि अनुप्रयोगों के बीच सुरक्षा की कुछ डिग्री मौजूद होनी चाहिए। शोषण स्थानीय या दूरस्थ सेवाओं को लक्षित कर सकता है।
"आप अपने भाग्य को हैक नहीं कर सकते, जानवर बल ... आपको जीवन में एक पीछे के दरवाजे, एक साइड चैनल की आवश्यकता है।" - क्लाइड शेज़ा
कंप्यूटर समस्याओं को हल नहीं करते हैं, वे समाधान निष्पादित करते हैं। प्रत्येक गैर-नियतात्मक एल्गोरिथम कोड के पीछे , एक निर्धारित दिमाग होता है। - / var / लॉग / dmesg
क्रिप्टोग्राफी और नेटवर्क सुरक्षा पर वीडियो व्याख्यान , सुरक्षा के लिए नाम स्थान , दूरस्थ हमलों के खिलाफ सुरक्षा , सुरक्षित एंबेडेड लिनक्स
env x='() { :;}; echo vulnerable' bash -c "echo this is a test for Shellsock"
कर्नेल स्रोत (0.11 -> 2.4 -> 2.6 -> 3.18)
"शराब की तरह, कर्नेल प्रोग्रामिंग की महारत समय के साथ परिपक्व होती है। लेकिन, शराब के विपरीत, यह प्रक्रिया में मीठा हो जाता है"। - लवलीन मुछेका
आप यह नहीं सोच सकते हैं कि प्रोग्रामर कलाकार हैं, लेकिन प्रोग्रामिंग एक अत्यंत रचनात्मक पेशा है। यह तर्क-आधारित रचनात्मकता है। कंप्यूटर विज्ञान की शिक्षा किसी को भी एक विशेषज्ञ प्रोग्रामर नहीं बना सकती है जो ब्रश और रंगद्रव्य का अध्ययन करने से ज्यादा किसी को विशेषज्ञ चित्रकार बना सकता है। जैसा कि आप पहले से ही जानते हैं, पथ को जानने और मार्ग पर चलने के बीच अंतर है; अपनी आस्तीन को रोल करने और कर्नेल स्रोत कोड के साथ अपने हाथों को गंदा करने के लिए यह अत्यंत महत्वपूर्ण है। अंत में, इस प्रकार आपके द्वारा प्राप्त कर्नेल ज्ञान , जहां भी आप जाएंगे, आप चमक जाएंगे ।
अपरिपक्व कोडर नकल करते हैं; परिपक्व कोडर चोरी; खराब कोडर्स खराब होते हैं जो वे लेते हैं, और अच्छे कोडर्स इसे कुछ बेहतर या कम से कम कुछ अलग बनाते हैं। अच्छा कोडर अपनी चोरी का पूरे मनोयोग से स्वागत करता है, जो अनोखा है, उससे बिल्कुल अलग, जहां से यह फटा था।
कर्नेल व्यंजनों पर वीडियो व्याख्यान
linux-0.11
├── boot
│ ├── bootsect.s head.s setup.s
├── fs
│ ├── bitmap.c block_dev.c buffer.c char_dev.c exec.c
│ ├── fcntl.c file_dev.c file_table.c inode.c ioctl.c
│ ├── namei.c open.c pipe.c read_write.c
│ ├── stat.c super.c truncate.c
├── include
│ ├── a.out.h const.h ctype.h errno.h fcntl.h
│ ├── signal.h stdarg.h stddef.h string.h termios.h
│ ├── time.h unistd.h utime.h
│ ├── asm
│ │ ├── io.h memory.h segment.h system.h
│ ├── linux
│ │ ├── config.h fdreg.h fs.h hdreg.h head.h
│ │ ├── kernel.h mm.h sched.h sys.h tty.h
│ ├── sys
│ │ ├── stat.h times.h types.h utsname.h wait.h
├── init
│ └── main.c
├── kernel
│ ├── asm.s exit.c fork.c mktime.c panic.c
│ ├── printk.c sched.c signal.c sys.c system_calls.s
│ ├── traps.c vsprintf.c
│ ├── blk_drv
│ │ ├── blk.h floppy.c hd.c ll_rw_blk.c ramdisk.c
│ ├── chr_drv
│ │ ├── console.c keyboard.S rs_io.s
│ │ ├── serial.c tty_io.c tty_ioctl.c
│ ├── math
│ │ ├── math_emulate.c
├── lib
│ ├── close.c ctype.c dup.c errno.c execve.c _exit.c
│ ├── malloc.c open.c setsid.c string.c wait.c write.c
├── Makefile
├── mm
│ ├── memory.c page.s
└── tools
└── build.c
Linux_source_dir/Documentation/*
Linux कर्नेल Newbies एक महान संसाधन है।
मेरा सुझाव है कि आप ग्रेग क्रोहा-हार्टमैन द्वारा " लिनक्स कर्नेल को संक्षेप में पढ़ें" और " लिनक्स कर्नेल को समझना ", रॉबर्ट लव द्वारा। अवश्य पढ़े :)
लिनक्स डिवाइस ड्राइवर्स एक और अच्छा संसाधन है। यह आपको आंतरिक कामकाज में शामिल होने का एक और तरीका देगा। प्रस्तावना से:
यह सतह पर, लिनक्स सिस्टम के लिए डिवाइस ड्राइवर लिखने के बारे में एक किताब है। यह एक योग्य लक्ष्य है, निश्चित रूप से; नए हार्डवेयर उत्पादों का प्रवाह जल्द ही कभी भी धीमा होने की संभावना नहीं है, और किसी को उन सभी नए गैजेट्स को लिनक्स के साथ काम करना होगा। लेकिन यह पुस्तक इस बारे में भी है कि लिनक्स कर्नेल कैसे काम करता है और अपनी जरूरतों या रुचियों के लिए अपने कामकाज को कैसे अनुकूलित करता है। लिनक्स एक खुली प्रणाली है; इस पुस्तक के साथ, हमें उम्मीद है, यह डेवलपर्स के एक बड़े समुदाय के लिए अधिक खुला और सुलभ है।
लिनक्स प्रलेखन परियोजना देखें । विशेष रूप से "लिनक्स कर्नेल मॉड्यूल गाइड"।
लिनक्स कर्नेल 2.4 आंतरिक एक और ऑनलाइन संसाधन है जिसे देखने के लिए। यह बूटिंग के साथ शुरू करते हुए एक सुंदर 'ग्राउंड अप' दृष्टिकोण लेता है। यहाँ TOC:
और, इसे और भी मीठा बनाने के लिए, रॉबर्ट लव आउट द्वारा एक नया लिनक्स कर्नेल डेवलपमेंट थर्ड एडिशन है और स्लैशडॉट की समीक्षा है।
क्लाउडिया साल्ज़बर्ग एट अल द्वारा लिनक्स कर्नेल प्राइमर के साथ शुरू करें। शुरुआती लोगों के लिए शुरू करने के लिए अच्छा है। रॉबर्ट लव की पुस्तक निश्चित रूप से वह पुस्तक नहीं है जिसे शुरुआती लोगों को शुरू करना चाहिए। लैटर बुक मध्यवर्ती स्तर से ऊपर है।