CPU में “You” डालना
(cpu.land)- यह एक व्यक्तिगत learning project की भूमिका है, जिसका उद्देश्य आखिर तक समझना है कि कंप्यूटर में कोई program चलाने पर असल में क्या होता है
- मुख्य सवाल यह है कि क्या program सीधे CPU पर execute होता है, system call कैसे काम करता है, और कई program एक साथ कैसे चलते हैं
- विश्वविद्यालय की कक्षाओं के बाहर व्यापक system materials मिलना मुश्किल था, इसलिए अलग-अलग quality वाले स्रोतों और टकराती जानकारी को खुद छांटना पड़ा
- कई हफ्तों तक शोध करके और लगभग 40 पन्नों के notes बनाकर, लेखक को कंप्यूटर के start होने से लेकर program execution तक की प्रक्रिया बेहतर समझ में आई
- लेखक कहता है कि जिन्हें लगता है कि वे यह सब पहले से जानते हैं, वे भी कुछ नया सीख सकते हैं, और अगर समय कम हो तो पहले अध्याय 3 पढ़ने की सलाह देता है
program execution को समझने की शुरुआत
- कंप्यूटर में कोई program चलाते समय ठीक-ठीक क्या होता है, यही इस लेख की शुरुआत का बिंदु है
- low-level ज्ञान कुछ हद तक था, लेकिन कई टुकड़ों को एक ही flow में जोड़ना मुश्किल था
- सवाल तीन दिशाओं में आगे बढ़ता है
- क्या program सचमुच सीधे CPU पर execute होता है
- system call क्या है और यह वास्तव में कैसे काम करता है
- कई program एक साथ कैसे चलते हैं
शोध प्रक्रिया और पढ़ने का क्रम
- व्यापक system materials ज्यादा नहीं थे, इसलिए कई स्रोतों की खुद जांच करनी पड़ी, और हर सामग्री की quality और contents अलग थे
- कई हफ्तों की जांच और लगभग 40 पन्नों के notes के जरिए, startup process से लेकर program execution तक कंप्यूटर कैसे काम करता है, यह बेहतर समझ में आया
- लक्ष्य था वह एक ठोस explanatory article खुद लिखना, जिसे लेखक शुरू से खोजना चाहता था
- जिन पाठकों को लगता है कि वे पहले से यह विषय जानते हैं, या जिनके पास समय कम है, उन्हें पहले अध्याय 3 पढ़ने की सलाह दी जाती है
- अगला लेख अध्याय 1: The “Basics” से जारी रहता है
1 टिप्पणियां
Hacker News राय
इसे बनाने वाला मैं ही हूं। पढ़ने और Hacker News की तरह ढेरों सुधार बताने के लिए धन्यवाद। Putting the "You" in CPU अभी भी काम में है, और मूल रूप से मेरा इरादा था कि इसे और पॉलिश करके, कंटेंट जोड़कर अगले हफ्ते के आसपास HN पर डालूं
मैं 17 साल का हूं, और 1 साल पहले हाई स्कूल छोड़कर Hack Club(https://hackclub.com/) में फुल-टाइम काम करना शुरू किया। जब से याद है, तब से प्रोग्रामिंग करता आया हूं, और करीब 6 साल पहले प्रोग्रामिंग और अपनी दूसरी रुचियों पर ज्यादा ध्यान देने के लिए होमस्कूलिंग शुरू की
सब कुछ खुद से सीखा है, इसलिए मैंने यूनिवर्सिटी का systems course कभी नहीं लिया, और “जब कुछ चलाते हैं तो क्या होता है” इस सवाल पर अपना जवाब मुझे संतोषजनक नहीं लगता था। इसलिए मैंने बहुत समय लगाकर जितनी गहराई तक हो सके सीखा, और इस दौरान समझ आया कि operating systems और hardware सीखना वाकई मजेदार है, लेकिन इस विषय पर online resources अक्सर बहुत खराब होते हैं
रिसर्च करते हुए अक्सर 2014 के lecture slides PDF या StackOverflow के ऐसे जवाब मिलते थे जो असल में गलत होते थे या जरूरत से ज्यादा सरल बना दिए गए होते थे। इसलिए इस क्षेत्र को खुद से सीखने वालों के लिए बेहतर resource बनने की उम्मीद से मैंने Putting the "You" in CPU लिखा। अभी SMP पर कुछ और पैराग्राफ लिखने बाकी हैं, इसलिए यह परफेक्ट नहीं है, लेकिन मुझे लगता है कि मैंने जो ज्यादातर resources देखे हैं, उनसे यह काफी बेहतर है। diagrams और schematics भी पहली बार बनाए, और बाद के chapters में वे बेहतर होते गए; आखिर के कुछ diagrams पर मुझे काफी गर्व है
पूरा GitHub पर open source में उपलब्ध है: https://github.com/hackclub/putting-the-you-in-cpu
कभी-कभी Reddit threads में जवाब मिल जाते हैं, लेकिन आम तौर पर उनमें noise मिला होता है, और यह भी संदेह रहता है कि ज्ञान को संरक्षित करने के लिए Reddit भरोसेमंद जगह है या नहीं। StackOverflow खास task हल करने वाले सवालों पर केंद्रित है, इसलिए जवाब भी स्वाभाविक रूप से छोटे होते हैं और खास मददगार नहीं होते
सामान्य जानकारी के लिए अब मैं Google की खराब हो चुकी search को छोड़कर सीधे Wikipedia पर जाता हूं, लेकिन तकनीकी विषयों को कितनी गहराई तक कवर करना है, इस पर Wikipedia की भी सीमा है। शायद computer internals की details को व्यापक रूप से इकट्ठा करने वाला कोई wiki चाहिए। बिखरे हुए resources बहुत हैं, लेकिन अगर वे एक जगह आ जाएं तो सच में अच्छा होगा
वह documentation आज दुनिया कैसी है, इससे ज्यादा यह बताता है कि दुनिया कैसी हो सकती है। OSDEV करने पर 32-bit processors द्वारा PAE से 36-bit addressing करने का तरीका, 64-bit processors द्वारा और पैसा निकालने के लिए 52-bit addressing करने का तरीका जैसी कई मजेदार चीजें सीखने को मिलती हैं
यह भी समझ आता है कि computer 16-bit mode से शुरू होकर long mode तक पहुंचने के लिए system-level assembly acrobatics क्यों करता है, और 8-bit mode क्यों बचा हुआ है। अगर आपको binary loading सीखना अच्छा लगा था, तो अभी भी हैरान करने वाली बहुत चीजें हैं। उदाहरण के लिए, 64-bit mode में भी memory segmentation मौजूद है, लेकिन long mode में flat mapping को force किया जाता है
मुझे ऐसे resources पसंद हैं। इन दिनों मैं RISC-V दुनिया में कदम रख रहा हूं, और साफ दिखता है कि free और open-source software को आगे बढ़ाने वाले लोगों को नए-नए single-board computers पर software सही से चलाने के लिए ऐसा ज्ञान चाहिए
मेरे मामले में computer कैसे काम करता है यह सीखते हुए instruction set architecture define करना, simulator और assembler implement करना, और assembly खुद लिखना आम बात थी। ज्यादा मेहनती लोग इसे FPGA पर implement करते हैं या LLVM backend लिखते हैं
operating systems में भी यही बात है। खुद kernel implement करके सीखना, या कम से कम मौजूदा kernel modify करना, काफी common process है
अगर आप बहुत basic level पर computer कैसे काम करता है, यह और जानना चाहते हैं, तो Charles Petzold की किताब Code की मैं सच में सिफारिश करता हूं। यह first principles से शुरू करके काफी ऊंचे level तक जाती है
इस resource की अच्छी बातों में से एक यह है कि जानकारी जुटाने की प्रक्रिया में expected vs actual learning outcomes को दिखाता है। जैसे “y की वजह से मुझे लगा था कि x होगा, लेकिन असल में b की वजह से a था!”
गलतफहमियां हटाना अक्सर नया ज्ञान बनाने का अहम चरण होता है, और जब लेखक यह स्वीकार करता है कि reader को जानकारी process करते हुए अपनी गलतफहमियों से पार पाना होगा, तो मदद मिलती है। यह “यही सही जवाब है, और अगर आपने अलग सोचा तो आप बेवकूफ हैं” वाले रवैये से कहीं ज्यादा reader-friendly है
Chapter 6 में fork() return value की explanation गलत है। जो लिखा है उसके उलट, parent में child का PID return होना चाहिए और child में 0 return होना चाहिए। मैंने इस हिस्से के लिए pull request बनाया है
add eax, 512को05 00 02 00 00में translate किया जाता है—इस explanation में कहा गया है कि पहला byte05, EAX register में 16-bit number जोड़ने वाला opcode है और बाकी bytes little-endian में 512 (0x200) हैंलेकिन यह explanation 5-byte instruction में से सिर्फ़ पहले 3 bytes को explain करता है। बचे हुए
00क्या हैं, यह समझ नहीं आ रहा। शायद यह लिखना था कि opcode EAX में 32-bit number जोड़ता है?axकहा जाता हैअच्छा लेख है। एक self-taught web developer के रूप में मुझे ऐसे resources बहुत valuable लगते हैं। ये कई abstractions से बाहर निकलकर यह ज़्यादा ठोस तौर पर समझने में मदद करते हैं कि चीज़ें असल में कैसे काम करती हैं
अच्छा resource लगता है, core मुद्दे पर काफ़ी जल्दी आता है, और थोड़ा मज़ेदार भी है। जितना मैंने सोचा था, उतना “monad tutorial” जैसा नहीं है। आगे पढ़ने का सोच रहा हूँ
अच्छा resource है। हालांकि kernel को लेकर एक सवाल रह जाता है। [0] में बताया गया है कि shebang kernel में handle होता है और पूरा file load नहीं करता, बल्कि
bufसे लेता है, इसलिए वह हमेशाbuflength पर truncate हो जाता है4 साल पहले किसी को kernel द्वारा 128 characters से लंबे paths काट देने से चिढ़ हुई, तो उसने buffer size को दोगुना करके truncation point भी दोगुना कर दिया। इसलिए आज Linux पर अगर shebang line 256 characters से ज़्यादा हो, तो 256 के बाद सब कुछ पूरी तरह गायब हो जाता है
समझ नहीं आता कि कोई किसी के file path को चुपचाप क्यों काटेगा। और वह भी kernel को तो बिल्कुल ऐसा नहीं करना चाहिए। 256-byte का file path अव्यावहारिक हो सकता है, लेकिन 256-byte का path+argument string किसी न किसी दिन लगभग पक्का बनेगा। scripts को चुपचाप तोड़ना गलत है
[0]: https://cpu.land/how-to-run-a-program
कुछ साल पहले किसी ने बहुत लंबे shebang के case में कम-से-कम चुपचाप fail होने के बजाय साफ़ तौर पर fail कराने के लिए kernel patch की कोशिश की थी। लेकिन NixOS में समस्या आ गई। Nix के अंदाज़ में, वह पहले से ही बहुत लंबे nix-store paths वाले excessive shebangs काफ़ी इस्तेमाल कर रहा था। पहले वे चुपचाप truncate होते थे लेकिन फिर भी काम करते थे; अचानक वे सभी scripts fail होने लगे और backward compatibility टूट गई। इसलिए patch revert करना पड़ा, और उसके बाद वैसा कोई बदलाव नहीं आ पाया
details के लिए https://lwn.net/Articles/779997/ देखें
shebang अपने-आप एक से ज़्यादा arguments भी ठीक से handle नहीं कर पाता। अगर
#!/bin/program -args somescriptलिखा जाए, तो यह['/bin/program','-args somescript']में split होता है, जो लगभग हमेशा desired result नहीं होता। यह Linux-specific है, और shebang सभी Unix पर universally portable भी नहीं हैअगर complex काम करना है, तो
#!/bin/shरखें और current file से ज़रूरी arguments के साथexecकरना बेहतर हैlink में एक बात छूट गई है कि
envका इस्तेमाल करके current path में interpreter खोजा जा सकता है। उदाहरण के लिए#!/usr/bin/env python3user के इस्तेमाल वालेpython3को location जाने बिना ढूंढ देता हैयह virtual environments में चलने वाली scripts के लिए useful हो सकता है, जहाँ Python interpreter के लिए
PATHoverride करके काम कराया जाता है। हालांकि installed programs में ऐसा नहीं करना चाहिए। installed program को यह control नहीं करने देना चाहिए कि user कौन-सा interpreter इस्तेमाल करेगा, इसलिए absolute path इस्तेमाल करना चाहिएenvमें-Soption होता है, जिससे इस limit से निपटने के लिए एक single string से command line parse की जा सकती है। फिर भी, वर्षों से shebang line में tricks से बचते आए किसी व्यक्ति के तौर पर, यह ज़्यादा-से-ज़्यादा doubtful practice लगती है