منبع: نوشتهٔ لینوس توروالدز (Linus Torvalds) در ۳۱ ژوئیهٔ ۱۹۹۲، روی صفحه‌ای در دانشگاه کارنگی ملون (Carnegie Mellon University): www.cs.cmu.edu/~awb/linux.history.html. روی این صفحه مجوز جداگانه‌ای اعلام نشده است؛ آنچه می‌خوانید روایت و ترجمهٔ همین نوشتهٔ عمومی و تاریخی است.

در ۳۱ ژوئیهٔ ۱۹۹۲، لینوس توروالدز چند پست قدیمی خودش را کنار هم گذاشت؛ پست‌هایی که لینوکس از دل آن‌ها شکل گرفت. خودش همان اول هشدار می‌دهد که اگر دنبال مطلبی فنی آمده‌اید، می‌توانید با خیال راحت کلید n را بزنید و بروید سراغ پیام بعدی؛ این فقط «سفری احساساتی» به نخستین روزهای لینوکس است. ما هم در این پست همین سفر را با او دنبال می‌کنیم: پست‌های اصلی را روایت می‌کنیم و یادداشت‌هایی را که لینوس در ۱۹۹۲ کنارشان نوشته، جداگانه می‌آوریم.

نامهٔ پوزیکس، ژوئیهٔ ۹۱

ماجرا از ۳ ژوئیهٔ ۱۹۹۱ شروع می‌شود. لینوس از نشانی‌اش در دانشگاه هلسینکی (University of Helsinki) در گروه خبری comp.os.minix نوشت که برای پروژه‌ای که در مینیکس رویش کار می‌کند، به تعریف استاندارد پوزیکس (POSIX) نیاز دارد. پرسید آیا کسی می‌تواند او را به آخرین نسخهٔ قواعد پوزیکس راهنمایی کند، ترجیحاً در قالبی که ماشین بتواند بخواند؛ اگر روی یک سایت FTP باشد، چه بهتر. پوزیکس مجموعه‌ای از استانداردهاست که کمک می‌کند برنامه‌های یونیکسی روی سیستم‌های مختلف یکسان رفتار کنند.

مینیکس (Minix) سیستم‌عامل کوچکی شبیه یونیکس بود که لینوس آن روزها با آن کار می‌کرد. او در یادداشت ۱۹۹۲ می‌نویسد که آن «پروژه» البته همان لینوکس بود. تا ۳ ژوئیه به کارهای واقعی در سطح کاربر فکر می‌کرد: بعضی از درایورهای دستگاه آماده بودند و دیسک سخت هم واقعاً کار می‌کرد، ولی چیز زیاد دیگری در کار نبود.

در همان نامه، خطاب به کسانی که در مینیکس از gcc استفاده می‌کردند، یک گزارش موفقیت هم داده بود: gcc نسخهٔ ۱.۴۰ را با کمک نسخهٔ ۱.۳۷ که آلن دبلیو. بلک (Alan W. Black) و همکارانش ساخته بودند، به مینیکس پورت کرده بود.

پی‌نوشت نامه اما حرف دیگری داشت. لینوس از کسی در آن سوی دنیا خواسته بود با برنامهٔ finger سراغش را بگیرد. او یک فایل ‎.plan «متغیر» ساخته و نصب کرده بود که قرار بود هر بار متن تازه‌ای نشان بدهد، و مطمئن نبود از بیرون دانشگاه هم کار کند. (finger در یونیکس اطلاعات یک کاربر را نشان می‌دهد و ‎.plan متن کوتاهی است که در جواب آن نمایش داده می‌شود.)

لینوس سال بعد اعتراف می‌کند که آن موقع حسابی خام بوده و تازه با لوله‌های نام‌دار (named pipes) آشنا شده بود؛ «حالا هرچه می‌خواهید بگویید!» جالب این‌که همین پی‌نوشت خیلی بیشتر از خود سؤال پوزیکس جواب گرفت. ولی همان سؤال باعث شد arl از گوشه‌ای پیدا شود. چند نامه با هم رد و بدل کردند و نتیجه‌اش شد پوشهٔ لینوکس روی سرور nic.funet.fi.

نزدیک دو ماه بعد، لینوس بالاخره چیزی داشت که کار می‌کرد و حدود همان زمان کد منبع نسخهٔ ۰.۰۱ را روی nic گذاشت. (کد منبع همان متن برنامه است که آدم می‌خواند و نسخهٔ اجرایی از روی آن ساخته می‌شود.) البته کد ۰.۰۱ عملاً قابل اجرا نبود؛ بیشتر حرکتی نمادین بود برای دلخوشی arl، که احتمالاً داشت از رسیدن هر چیزی ناامید می‌شد. پستی که در بخش بعد می‌آید، باید چند هفته پیش از همین انتشار نوشته شده باشد.

فقط یک سرگرمی

۲۵ اوت ۱۹۹۱، باز در همان گروه مینیکس، لینوس پستی با این عنوان گذاشت: «بیشتر از همه دوست دارید چه چیزی را در مینیکس ببینید؟» و در خلاصه‌اش نوشت: «یک نظرسنجی کوچک برای سیستم‌عامل تازه‌ام». این همان پست مشهوری است که این‌طور شروع می‌شد:

سلام به همهٔ کسانی که آنجا مینیکس به کار می‌برند –

Hello everybody out there using minix -

دارم یک سیستم‌عامل (آزاد) برای کلون‌های AT با پردازندهٔ ۳۸۶ (۴۸۶) می‌نویسم (فقط یک سرگرمی است؛ مثل گنو بزرگ و حرفه‌ای نخواهد شد). از آوریل دارد شکل می‌گیرد و کم‌کم آماده می‌شود.

I'm doing a (free) operating system (just a hobby, won't be big and professional like gnu) for 386(486) AT clones. This has been brewing since april, and is starting to get ready.

گنو (GNU) پروژه‌ای برای ساختن یک سیستم‌عامل کاملاً آزاد بود. لینوس در ادامه نوشت که دوست دارد بداند مردم چه چیزهایی را در مینیکس می‌پسندند و چه چیزهایی را نه، چون سیستم‌عامل او تا حدی شبیه مینیکس است؛ از جمله، به دلایل عملی، چیدمان فیزیکی سیستم فایلش با مینیکس یکی است.

تا آن روز bash نسخهٔ ۱.۰۸ و gcc نسخهٔ ۱.۴۰ را پورت کرده بود و به نظر می‌رسید همه‌چیز کار می‌کند. معنایش این بود که ظرف چند ماه چیزی به‌دردبخور خواهد داشت، و حالا می‌خواست بداند بیشتر مردم چه قابلیت‌هایی می‌خواهند. هر پیشنهادی را با روی باز می‌پذیرفت، ولی قول نمی‌داد همه را پیاده کند.

در پی‌نوشت هم توضیح داد: بله، هیچ کدی از مینیکس در آن نیست و سیستم فایلش چندریسمانی (multi-threaded) است. قابل‌حمل نیست، چون از تعویض وظیفهٔ ۳۸۶ و چیزهایی از این دست استفاده می‌کند. و احتمالاً هیچ‌وقت چیزی جز دیسک‌های سخت AT را پشتیبانی نخواهد کرد، چون خودش فقط همین را دارد.

لینوس در یادداشت ۱۹۹۲ می‌گوید از لحن پست پیداست که نسخهٔ ۰.۰۱ هنوز بیرون نیامده بود، ولی نزدیک بود؛ حدس می‌زند اولین نسخه اواسط سپتامبر ۹۱ منتشر شد. چند جواب گرفت که بیشترشان با ایمیل بود و نگهشان نداشته است. حتی چند نفر نامه نوشتند که می‌خواهند آزمایشگر بتای لینوکس باشند.

وابسته به ۳۸۶

فردای آن روز، ۲۶ اوت، یورکی کوپالا (Jyrki Kuoppala) در جواب نوشت: «بیشتر بگو! به MMU نیاز دارد؟» لینوس جواب داد بله، به MMU نیاز دارد (با عذرخواهی از همه)، آن هم مشخصاً MMU پردازنده‌های ۳۸۶ و ۴۸۶. MMU یا واحد مدیریت حافظه بخشی از پردازنده است که حافظه را صفحه‌بندی می‌کند و برنامه‌ها را از هم جدا نگه می‌دارد.

کوپالا پرسیده بود چه مقدار از آن به C نوشته شده و پورت کردنش چه دشواری‌هایی دارد. به شوخی گفته بود هیچ‌کس حرف لینوس را دربارهٔ قابل‌حمل نبودن باور نمی‌کند، و خودش دوست دارد آن را روی آمیگا (Amiga) پورت کند؛ چون Mach به MMU نیاز دارد و مینیکس هم آزاد نیست.

جواب لینوس ساده بود: پورت کردنش غیرممکن است. بیشترش به C است، ولی بیشتر آدم‌ها اسم چیزی را که او می‌نویسد C نمی‌گذارند. از هر قابلیت ۳۸۶ که پیدا کرده بود بهره برده بود، چون این پروژه برای خودش راهی هم بود برای یاد گرفتن ۳۸۶. هم صفحه‌بندی دارد (هنوز نه روی دیسک) و هم قطعه‌بندی (segmentation). همین قطعه‌بندی است که آن را واقعاً به ۳۸۶ وابسته می‌کند: هر وظیفه یک قطعهٔ ۶۴ مگابایتی برای کد و داده دارد، یعنی حداکثر ۶۴ وظیفه در ۴ گیگابایت. «هر کس بیشتر از ۶۴ مگابایت برای هر وظیفه لازم دارد، بدشانسی آورده!»

از هر قابلیت gcc هم که سراغ داشت استفاده کرده بود، به‌خصوص دستور __asm__، تا مجبور نباشد این‌قدر فایل جداگانهٔ اسمبلی بنویسد. بعضی از فایل‌هایی که اسمشان C بود، مخصوصاً mm.c، تقریباً همان‌قدر که C بودند، اسمبلی هم بودند. حتی پورت کردنش به یک کامپایلر دیگر هم «جالب» از آب درمی‌آمد؛ هرچند برای لینوس معما بود که چرا کسی باید چیزی جز gcc بخواهد.

لینوس در ۱۹۹۲ کنار این بخش نوشته است که لینوکس در نسخه‌های تازه‌تر در عمل قابل‌حمل‌تر شده است؛ نسخه‌های اول اسمبلی خیلی بیشتری داشتند و تا آن موقع به معماری‌های دیگری هم پورت شده بود.

او در همان جواب نوشته بود که برخلاف مینیکس، وقفه‌ها را «دوست دارد»، برای همین وقفه‌ها را بدون پنهان کردن دلیلشان مدیریت می‌کند. مخصوصاً به درایور دیسک سختش می‌بالید و می‌پرسید: «کس دیگری هم هست که با وقفه‌ها یک ماشین حالت (state machine) را پیش ببرد؟» خلاصه این‌که برای هر کسی که بخواهد پورتش کند، کابوس است.

کوپالا فهرستی از قابلیت‌ها هم خواسته بود: شبه‌ترمینال‌ها (pseudo ttys)، سوکت‌های BSD، سیستم فایل در حالت کاربر، اندازهٔ پنجره در ساختار tty، فراخوان‌های سیستمی سازگار با POSIX.1 و نام‌های طولانی فایل به سبک BSD. لینوس نوشت بیشترشان شدنی به نظر می‌رسند (ساختار tty همین حالا جای خالی برای اندازهٔ پنجره دارد)، مگر شاید سیستم فایل در حالت کاربر. دربارهٔ پوزیکس هم گفت با کمال میل دوست دارد داشته باشدش، ولی پوزیکس برای اسنادش پول می‌خواهد و فعلاً این گزینه در کار نیست. به هر حال این‌ها تا مدتی پشتیبانی نمی‌شوند: اول قرار است یک سیستم ساده شبیه مینیکس بسازد؛ کلمهٔ کلیدی: ساده.

در پی‌نوشت هم، برای این‌که هیچ ابهامی نماند، نوشت: بله، gcc و bash و بیشتر ابزارهای گنو را رویش اجرا می‌کند، ولی هنوز خیلی اشکال‌زدایی نشده و کتابخانه‌اش واقعاً حداقلی است. حتی از فلاپی هم پشتیبانی نمی‌کند. تا چند ماه آمادهٔ پخش نیست و حتی آن موقع هم احتمالاً کار زیادی بیش از مینیکس از دستش برنمی‌آید و از بعضی جهات هم کمتر. ولی آزاد خواهد بود، احتمالاً با مجوز گنو یا چیزی شبیه آن.

لینوس سال بعد نوشت که پیداست چیزی روی ماشین خودش کار می‌کرده، ولی شک دارد تا آن روز توانسته باشد gcc را زیر لینوکس با خودش کامپایل کند؛ وگرنه آن‌قدر به آن افتخار می‌کرد که حتماً ذکرش را می‌کرد. هنوز هیچ نسخه‌ای منتشر نشده بود.

انتشار ۰.۰۲

بعد، ظاهراً در ۵ اکتبر، نسخهٔ ۰.۰۲ را منتشر کرد. همان‌طور که گفتیم، ۰.۰۱ هیچ فایل اجرایی نداشت و فقط کد منبع بود، برای کسانی که کنجکاو بودند لینوکس چه شکلی است. برای ۰.۰۱ اعلام عمومی هم در کار نبود؛ لینوس می‌گوید زیاد به آن افتخار نمی‌کرد و فکر می‌کند فقط برای کسانی که علاقه نشان داده بودند یادداشتی فرستاد. اما اعلام ۰.۰۲، با عنوان «کد منبع آزاد یک هستهٔ شبیه مینیکس برای 386-AT»، این‌طور شروع می‌شد:

دلتان برای روزهای خوش مینیکس ۱.۱ تنگ شده، وقتی مردها مرد بودند و درایورهای دستگاهشان را خودشان می‌نوشتند؟ پروژهٔ جالبی در دست ندارید و دلتان لک زده برای سیستم‌عاملی که بتوانید با آن دست‌وپنجه نرم کنید و برای نیاز خودتان تغییرش بدهید؟ از این‌که همه‌چیز در مینیکس درست کار می‌کند کلافه‌اید؟ دیگر از شب‌بیداری برای راه انداختن یک برنامهٔ باحال خبری نیست؟ پس شاید این پست دقیقاً برای شما باشد :-)

Do you pine for the nice days of minix-1.1, when men were men and wrote their own device drivers?

لینوس در ادامه نوشت که حدود یک ماه پیش گفته بود روی نسخه‌ای آزاد و شبیه مینیکس برای کامپیوترهای AT-386 کار می‌کند. حالا کار به جایی رسیده بود که حتی قابل استفاده بود (البته بسته به این‌که چه بخواهید، شاید هم نه)، و حاضر بود کد منبع را برای پخش گسترده‌تر منتشر کند. این فقط نسخهٔ ۰.۰۲ بود، به‌اضافهٔ یک وصلهٔ خیلی کوچک، ولی bash و gcc و gnu-make و gnu-sed و compress و برنامه‌های دیگری را با موفقیت رویش اجرا کرده بود.

کد منبع این «پروژهٔ دلی» روی nic.funet.fi در پوشهٔ /pub/OS/Linux بود. در همان پوشه یک فایل README و چند فایل اجرایی برای لینوکس هم بود: bash و update و gcc («دیگر چه می‌خواهید؟»). کد کامل هسته منتشر شده بود، چون هیچ کدی از مینیکس در آن به کار نرفته بود. اما کد کتابخانه فقط تا حدی آزاد بود و فعلاً نمی‌شد پخشش کرد. به گفتهٔ خودش، سیستم «همان‌طور که هست» کامپایل می‌شد و «تا حالا دیده شده که کار کند». کد منبع bash و gcc هم روی همان سرور، در پوشهٔ /pub/gnu بود.

بعد هم با حروف درشت هشدار داده بود: این کد هنوز برای کامپایل به مینیکس-۳۸۶ (و gcc نسخهٔ ۱.۴۰) نیاز دارد، و برای راه‌اندازی و اجرا هم مینیکس لازم است؛ یعنی هنوز سیستمی مستقل نیست و دارد رویش کار می‌کند. برای راه انداختنش باید کمی هکر باشید؛ پس اگر دنبال جایگزینی برای مینیکس-۳۸۶ هستید، فعلاً این پست را نادیده بگیرید. فعلاً برای هکرهایی است که به سیستم‌عامل و ۳۸۶ علاقه دارند و به مینیکس دسترسی دارند. سخت‌افزار لازم هم یک دیسک سخت سازگار با AT (IDE هم خوب است) و کارت گرافیک EGA یا VGA بود.

و بعد جمله‌هایی که امروز معروف‌اند: «تقریباً می‌شنوم که از خودتان می‌پرسید: چرا؟ هرد (Hurd) تا یک سال دیگر می‌آید (یا دو سال دیگر، یا ماه بعد، کسی چه می‌داند)، و مینیکس را هم که دارم.» هرد هستهٔ پروژهٔ گنو بود که آن موقع هنوز آماده نشده بود. لینوس جواب خودش را این‌طور داد: «این برنامه‌ای است برای هکرها، به دست یک هکر.» از ساختنش لذت برده بود و فکر می‌کرد شاید کسی هم از نگاه کردن به آن و حتی تغییرش برای نیاز خودش لذت ببرد. هنوز آن‌قدر کوچک بود که بشود فهمیدش، به کارش برد و تغییرش داد.

از کسانی که برای مینیکس ابزار یا تابع کتابخانه نوشته بودند هم خواست اگر کارشان آزادانه قابل پخش است (با حق نشر یا حتی در مالکیت عمومی)، با او تماس بگیرند تا آن را به سیستم اضافه کند. آن موقع از estdio نوشتهٔ ارل چو (Earl Chew) استفاده می‌کرد و قول داد اعلان‌های حق نشر همه دست‌نخورده بمانند. پی‌نوشت پست هم پیامی برای فیل نلسون (Phil Nelson) بود: نامه‌هایش به او نمی‌رسید و مدام خطایی شبیه «forward error - strawberry unknown domain» می‌گرفت.

لینوس در ۱۹۹۲ دربارهٔ این نسخه نوشت: «به نظر سیستم چندانی نمی‌آید، نه؟» ولی کار می‌کرد و بعضی‌ها حتی امتحانش کردند. چند باگ بد داشت؛ نه درایور فلاپی داشت، نه حافظهٔ مجازی، نه هیچ چیز دیگر، و ۰.۰۲ واقعاً چندان قابل استفاده نبود.

۰.۰۳ کمی بعد منتشر شد؛ حتی آن موقع هم فاصلهٔ انتشارها حداکثر دو سه هفته بود. ۰.۰۳ نسبتاً قابل استفاده بود، و چون اوضاع واقعاً داشت خوب پیش می‌رفت، لینوس نسخهٔ بعدی را ۰.۱۰ نام‌گذاری کرد.

بتا، ۰.۱۱ و نسخهٔ ۰.۱۲

۱۹ دسامبر ۱۹۹۱، میکل فن اسمورنبورگ (Miquel van Smoorenburg) در گروه نوشت شنیده است عده‌ای روی سیستم‌عامل آزادی به نام لینوکس برای ۳۸۶ و ۴۸۶ کار می‌کنند. هر از گاهی به nic.funet.fi سر می‌زد، ولی فعلاً به FTP دسترسی نداشت و می‌خواست بداند اوضاع از چه قرار است. لینوس جواب داد که لینوکس هنوز در مرحلهٔ بتاست (هرچند برای آدم‌های جسور از راه FTP در دسترس است) و به نسخهٔ ۰.۱۱ رسیده است. هنوز به جامعیت مینیکس-۳۸۶ نیست، ولی از بعضی جهات بهتر است.

اول خبرهای بد را گفت. هنوز SCSI ندارد؛ عده‌ای رویش کار می‌کنند، ولی تاریخی در کار نیست، پس دیسکی با رابط AT لازم است. هنوز init و login هم ندارد و بعد از بوت، مستقیم با کاربر ریشه (root) وارد bash می‌شوید؛ لینوس می‌گوید این وضع در نسخهٔ بعدی هم همین‌طور ماند. حافظهٔ مجازی، یعنی صفحه‌بندی روی دیسک، تا حدی کار می‌کند ولی آماده نیست؛ برای همین لینوکس دست‌کم ۴ مگابایت حافظه می‌خواهد تا برنامه‌های گنو، به‌خصوص gcc، را اجرا کند. با ۲ مگابایت بوت می‌شود، ولی نمی‌توانید کامپایل کنید.

لینوس در یادداشت ۱۹۹۲ اضافه می‌کند که درست پیش از کریسمس ۹۱ نسخه‌ای از ۰.۱۱ را همراه با حافظهٔ مجازی منتشر کرد. خودش به آن نیازی نداشت، ولی عده‌ای می‌خواستند هسته را با ۲ مگابایت حافظه کامپایل کنند و موفق نمی‌شدند، پس مجبور شد پیاده‌اش کند. این نسخه فقط به دست چند نفری رسید که می‌خواستند آزمایشش کنند، و لینوس هنوز تعجب می‌کند که چطور آن‌قدر خوب کار کرد.

خبرهای بد ادامه داشت: مینیکس هنوز کاربران خیلی بیشتر و در نتیجه پشتیبانی بهتری دارد، و لینوکس سال‌ها آزمایش هزاران نفر را پشت سر ندارد، پس احتمالاً هنوز باگ‌های زیادی در آن هست.

بعد نوبت خبرهای خوب بود. اول این‌که آزاد است: حق نشرش با خود لینوس است، ولی با مجوزی بسیار سهل‌گیرانه آزادانه پخش می‌شود. لینوس در ۱۹۹۲ توضیح می‌دهد که این مجوز اولیه در واقع خیلی محدودکننده‌تر از کپی‌لفت گنو (GNU copyleft) بود: اجازه نمی‌داد هیچ پولی به‌خاطر لینوکس دست‌به‌دست شود. این وضع از نسخهٔ ۰.۱۲ عوض شد.

خبرهای خوب دیگر: ور رفتن با آن کیف دارد؛ سیستم فایلش «واقعاً» چندریسمانی است؛ و از قابلیت‌های ۳۸۶ استفاده می‌کند. همین آن را به خانوادهٔ ۳۸۶ و ۴۸۶ محدود می‌کند، ولی وقتی مجبور نباشی حواست به تراشه‌های دیگر هم باشد، کارها روشن‌تر پیش می‌رود. و جمع‌بندی‌اش:

من فکر می‌کنم از مینیکس بهتر است، ولی خب، کمی طرف‌دار خودم هستم. هیچ‌وقت آن نوع سیستم‌عامل حرفه‌ای‌ای نمی‌شود که هرد خواهد شد (در قرن آینده یا همین حدودها :)، ولی ابزار یادگیری خوبی است (به نظر من حتی بیشتر از مینیکس)، و کار کردن روی آن لذت‌بخش بود و هست.

It will never be the kind of professional OS that Hurd will be (in the next century or so :)

لینوس متن فایل ‎.plan خودش را هم در همان پست گذاشته بود. عنوانش این بود: «یونیکس آزاد برای ۳۸۶؛ در راه است: سه‌ماههٔ چهارم ۹۱ یا سه‌ماههٔ اول ۹۲». نسخهٔ فعلی ۰.۱۱ بود و بیشتر چیزهایی را که یک هستهٔ یونیکس لازم دارد، داشت؛ احتمالاً به‌محض این‌که کمی بیشتر آزمایش می‌شد و init و login راه می‌افتادند، با نام ۱.۰ منتشر می‌شد. فعلاً بعد از بوت، مستقیم با کاربر ریشه وارد پوسته (shell) می‌شدید. در همان پوشهٔ nic.funet.fi چند برنامهٔ اجرایی هم برای لینوکس بود: gcc، bash، update، uemacs، tar، make و fileutils. چند نفر سیستمی راه انداخته بودند که کار می‌کرد، ولی هنوز «هستهٔ هکرها» بود.

چون عده‌ای در وصل شدن به nic مشکل داشتند، لینوکس روی دو سایت دیگر هم بود: سروری در دانشگاه آخن آلمان و tsx-11.mit.edu در MIT. یک فهرست پستی هم به نام Linux-activists روی niksula.hut.fi راه افتاده بود. لینوس تأکید کرده بود که ایمیل زدن به خودش برای عضویت فایده‌ای ندارد، چون جز این‌که خودش هم عضو است، ارتباطی با گردانندگی فهرست ندارد.

نسخهٔ ۰.۱۱ این چیزهای تازه را داشت: بارگذاری بر حسب تقاضا (demand loading)، اشتراک کد و داده میان فرایندهای بی‌ربط، درایورهای فلاپی خیلی بهتر («که بیشتر وقت‌ها واقعاً کار می‌کنند»)، رفع باگ، پشتیبانی از کارت‌های گرافیک Hercules و MDA و CGA و EGA و VGA، کنسولی که بوق هم می‌زد («وای! هستهٔ معجزه‌گر :-)»)، برنامه‌های mkfs و fsck و fdisk، صفحه‌کلیدهای آمریکایی و آلمانی و فرانسوی و فنلاندی، و سرعت قابل تنظیم برای درگاه‌های سریال com1 و com2.

لینوس توضیح می‌دهد که ۰.۱۱ در واقع مستقل بود: اولین نسخه‌های mkfs و fsck و fdisk را خودش برایش نوشت تا دیگر برای راه‌اندازی به مینیکس نیازی نباشد. پیش از آن، سرعت خط‌های سریال در کد ثابت و روی ۲۴۰۰ بیت در ثانیه بود، چون خودش چیزی جز آن نداشت.

چیزهایی که هنوز کم داشت: init و login، فراخوان سیستمی rename، لوله‌های نام‌دار و پیوندهای نمادین. لینوس در ۱۹۹۲ می‌نویسد همهٔ این‌ها حالا اضافه شده‌اند: init و login به ۰.۱۲ نرسیدند؛ rename جایی میان ۰.۱۲ و ۰.۹۵ به شکل یک وصله پیاده شد؛ پیوندهای نمادین در ۰.۹۵ آمدند و لوله‌های نام‌دار تا ۰.۹۶ صبر کردند. شمارهٔ نسخه هم از ۰.۱۲ یکراست به ۰.۹۵ پرید، چون نسخهٔ بعد از ۰.۱۲ آن‌قدر پرقابلیت شده بود که سزاوار عددی در حدود ۰.۹۰ باشد.

در ‎.plan آمده بود که ۰.۱۲ احتمالاً در ژانویه (حدود پانزدهم) می‌آید و کنترل کارهای پوزیکس (POSIX job control) به قلم tytso، حافظهٔ مجازی (صفحه‌بندی روی دیسک) و چند اصلاح جزئی خواهد داشت. اما ۰.۱۲ در واقع ۵ ژانویه منتشر شد و اصلاحات عمده‌ای داشت. هستهٔ بسیار پایداری بود: روی سخت‌افزارهای تازهٔ زیادی کار می‌کرد و تا مدت‌ها به وصله نیاز پیدا نکرد. ۰.۱۲ همان هسته‌ای بود که «گرفت» و از آن به بعد لینوکس خیلی سریع‌تر پخش شد. نسخه‌های قبلی تقریباً فقط به درد هکرها می‌خوردند؛ ۰.۱۲ واقعاً خوب کار می‌کرد.

هسته را از صفر چطور نوشت

۵ مه ۱۹۹۲، در فهرست پستی Linux-Activists، کسی که خودش را «تازه‌کار» می‌نامید پرسید یک سیستم‌عامل را چطور «از صفر» می‌نویسند. لینوس دید دیگران جواب داده‌اند، ولی تصمیم گرفت بخش‌های مربوط به لینوکس را خودش جواب بدهد؛ با این توضیح که این‌ها فقط تجربه‌های شخصی اوست و نمی‌داند چقدر عادی‌اند.

سؤال اول این بود که در مرحلهٔ توسعه، هسته را معمولاً چطور اشکال‌زدایی می‌کنند. لینوس گفت بستگی دارد به ماشین و به این‌که کار هسته تا کجا پیش رفته باشد؛ روی سیستم‌های ساده‌تر معمولاً کار راحت‌تر است. بعد تعریف کرد که روی ۳۸۶ در حالت محافظت‌شده (protected mode) چه کرده است.

بدترین قسمت، شروع کار است. وقتی یک سیستم حداقلی داشته باشی، می‌توانی از printf و امثالش استفاده کنی، ولی رفتن به حالت محافظت‌شده روی ۳۸۶ اصلاً سرگرم‌کننده نیست، به‌خصوص اگر اول کار معماری را خوب نشناسی. در این مرحله به‌طرز آزاردهنده‌ای ساده است که سیستم ری‌استارت شود: اگر ۳۸۶ متوجه شود چیزی اشکال دارد، خاموش می‌شود و دوباره بالا می‌آید، بی‌آن‌که حتی فرصت کنی ببینی چه چیزی خراب بوده است.

printf هم کمک چندانی نمی‌کند: ری‌استارت صفحه را هم پاک می‌کند، و تازه برای نوشتن روی صفحه باید به حافظهٔ ویدئو دسترسی داشته باشی، که اگر قطعه‌ها را درست تنظیم نکرده باشی، شکست می‌خورد. به اشکال‌زدا (debugger) هم فکر نکن: هیچ اشکال‌زدایی که لینوس می‌شناخت نمی‌توانست ۳۸۶ را تا داخل حالت محافظت‌شده دنبال کند. شاید یک شبیه‌ساز ۳۸۶ یا سخت‌افزار گران‌قیمت از پسش برمی‌آمد، ولی این معمولاً شدنی نیست.

راه لینوس یک «حلقهٔ مرگ» ساده بود. در جاهای حساس کد چنین دستوری می‌گذاشت:

die:
        jmp die

اگر سیستم همان‌جا قفل می‌شد، یعنی تا آنجا همه‌چیز درست بود؛ اگر ری‌استارت می‌شد، دست‌کم می‌دانستی مشکل پیش از رسیدن به این حلقه رخ داده است. می‌شد از درگاه‌های صدا هم سرنخ صوتی گرفت، ولی لینوس تجربه‌ای با سخت‌افزار پی‌سی نداشت و از آن هم استفاده نکرد. او تأکید می‌کند که نمی‌گوید این تنها راه است:

من قصد نداشتم هسته بنویسم؛ فقط می‌خواستم ابزارهای پایهٔ تعویض وظیفه در ۳۸۶ و چیزهایی از این دست را کشف کنم، و کارم این‌طور شروع شد (حدود آوریل ۹۱).

I didn't start off to write a kernel, I just wanted to explore the 386 task-switching primitives etc, and that's how I started off (in about April-91).

وقتی یک سیستم حداقلی بالا بیاید و بشود روی صفحه چیزی نوشت، کار کمی آسان‌تر می‌شود؛ ولی درست همین‌جاست که باید وقفه‌ها را فعال کنی. و بوم! ری‌استارت فوری و بازگشت به همان روش قدیمی. روی هم رفته حدود دو ماه طول کشید تا لینوس همهٔ کارهای مربوط به ۳۸۶ را درست سر و سامان بدهد، طوری که دیگر هر لحظه نگران ری‌استارت نباشد، و چیزهای پایه هم راه بیفتند: صفحه‌بندی، وقفهٔ تایمر و یک تعویض‌کنندهٔ سادهٔ وظیفه برای آزمودن قطعه‌ها.

سؤال دوم این بود که آیا می‌شود هسته را مثل یک فرایند روی سیستم‌عامل دیگری آزمایش کرد. لینوس گفت برای بعضی چیزها معمولاً بله، ولی مثلاً درایورهای دستگاه معمولاً باید روی خود ماشین، بدون هیچ سیستم‌عامل دیگری، آزمایش شوند. او لینوکس را زیر مینیکس توسعه می‌داد، پس به ثبات‌های ورودی/خروجی و وقفه‌ها و مانند این‌ها دسترسی نداشت. زیر داس (DOS) می‌شد به همهٔ این‌ها دسترسی داشت، ولی آن وقت از حالت ۳۲ بیتی خبری نبود. به گفتهٔ او، اینتل آن‌قدرها هم عالی نیست و احتمالاً روی ۶۸۰۴۰ یا چیزی شبیه آن کار خیلی آسان‌تر می‌بود.

بعد از این‌که یک تعویض‌کنندهٔ ساده برای وظیفه‌ها ساخت، هنوز باید عمدتاً با printf اشکال‌زدایی می‌کرد. آن تعویض‌کننده با کمک وقفهٔ تایمر میان دو فرایند جابه‌جا می‌شد که یکی پشت سر هم AAAA... چاپ می‌کرد و دیگری BBBB... را. لینوس می‌نویسد: «خدایا، چقدر به آن افتخار می‌کردم!» اولین چیزی که نوشت درایور صفحه‌کلید بود، و به همین دلیل هنوز هم تماماً به زبان اسمبلی است: آن موقع جرئت نداشت سراغ C برود، چون هنوز تقریباً در سطح تک‌تک دستورها اشکال‌زدایی می‌کرد.

بعد درایورهای سریال را نوشت و ناگهان یک برنامهٔ پایانهٔ ساده داشت (که به گفتهٔ خودش آن‌قدرها هم ساده نبود). هنوز همان دو فرایند AAAA و BBBB بودند، ولی حالا به‌جای چاپ کردن، از کنسول و خط سریال می‌خواندند و رویشان می‌نوشتند. برای بیرون آمدن از آن باید ری‌استارت می‌کرد، ولی به هر حال هسته‌ای ساده بود.

از آنجا به بعد کار روی غلتک افتاد. کد نوشتن هنوز سخت و پرپیچ‌وخم بود، ولی حالا چند دستگاه در اختیار داشت و اشکال‌زدایی آسان‌تر شده بود. در این مرحله سراغ C رفت، که بی‌تردید سرعت توسعه را بالا برد. همین‌جا بود که ایدهٔ بلندپروازانه‌اش برای ساختن «مینیکسی بهتر از مینیکس» جدی شد. امیدوار بود روزی بتواند gcc را زیر لینوکس دوباره کامپایل کند.

درایور دیسک سخت هم داستان مشابهی داشت، با این تفاوت که این بار مشکل مستندات بد هم پیش آمد. پی‌سی شاید پرکاربردترین معماری دنیا باشد، ولی این به آن معنا نیست که مستنداتش بهترند. لینوس می‌گوید حتی یک کتاب ندیده که به جفت‌شدن عجیب ۳۸۶ و ۳۸۷ در AT اشاره‌ای کرده باشد (و این‌جا از «بروس» تشکر می‌کند).

بعد از آن یک سیستم فایل کوچک نوشت و ناگهان یک یونیکس حداقلی در دست داشت. دو ماه برای راه انداختن چیزهای پایه، و کمی بیشتر تا یک درایور دیسک (به‌شدت پرباگ، ولی روی ماشین خودش کار می‌کرد) و یک سیستم فایل کوچک. حدود همین زمان بود که ۰.۰۱ را منتشر کرد؛ به گفتهٔ خودش «اواخر اوت ۹۱؟ چیزی در همین حدود». (در یادداشت‌های پیشین حدس زده بود اواسط سپتامبر؛ پیداست خودش هم دقیق یادش نبود.) نسخهٔ قشنگی نبود، درایور فلاپی نداشت و تقریباً هیچ کاری از دستش برنمی‌آمد؛ لینوس فکر نمی‌کند کسی اصلاً آن نسخه را کامپایل کرده باشد. ولی تا آن موقع حسابی به این کار دل‌بسته شده بود و نمی‌خواست دست بکشد تا روزی که بتواند مینیکس را کنار بگذارد.

سؤال سوم این بود که آیا پیش از راه انداختن یک هستهٔ پایه، باید پیونددهنده‌ها (linker) و بارکننده‌های (loader) تازه نوشت. لینوس جواب داد همهٔ نسخه‌ها تا حدود ۰.۱۱ زیر مینیکس-۳۸۶ «کراس‌کامپایل» می‌شدند، یعنی روی یک سیستم ساخته می‌شدند تا روی سیستم دیگری اجرا شوند؛ برنامه‌های کاربر هم همین‌طور. bash و gcc بالاخره زیر ۰.۰۲ کار کردند. یک شرایط رقابتی (race condition) در کد حافظهٔ نهان بافر نمی‌گذاشت gcc را با خودش دوباره کامپایل کند، ولی کامپایل‌های کوچک‌تر شدنی بود. ۰.۰۳ (اکتبر؟) می‌توانست gcc را زیر خودش کامپایل کند، و لینوس فکر می‌کند این اولین نسخه‌ای بود که کس دیگری واقعاً از آن استفاده کرد. هنوز از فلاپی خبری نبود، ولی بیشتر چیزهای پایه کار می‌کرد.

بعد از ۰.۰۳ به این نتیجه رسید که نسخهٔ بعدی واقعاً قابل استفاده است. تا حدی هم بود، هرچند به گفتهٔ خودش «X زیر ۰.۹۶ خیلی چشمگیرتر است». پس اسمش را ۰.۱۰ گذاشت (نوامبر؟). این نسخه هنوز یک باگ نسبتاً جدی در مدیریت حافظهٔ نهان بافر داشت، ولی بعد از وصله کردنش وضع خوبی پیدا کرد. ۰.۱۱ (دسامبر) اولین درایور فلاپی را داشت و از همین نسخه بود که لینوس توسعهٔ لینوکس را زیر خود لینوکس ادامه داد. و چه به‌موقع! چون وقتی می‌خواست با برنامهٔ شماره‌گیری خودکار مودم (autodial) کار کند، اشتباهی آن را روی ‎/dev/hd2 (یکی از پارتیشن‌های دیسک) اجرا کرد و پارتیشن مینیکس-۳۸۶ خودش را از بین برد.

تا آن زمان دیگران هم واقعاً از لینوکس استفاده می‌کردند و حافظه کم می‌آوردند. غم‌انگیزتر از همه این بود که gcc روی ماشینی با ۲ مگابایت حافظه کار نمی‌کرد. c386 هم پورت شده بود، ولی همهٔ کارهای gcc را نمی‌کرد و نمی‌توانست هسته را دوباره کامپایل کند. پس لینوس مجبور شد صفحه‌بندی روی دیسک (swap) را پیاده کند. ۰.۱۲ در ژانویه (؟) منتشر شد، با صفحه‌بندی‌ای که خودش نوشته بود و کنترل کارها (job control) به قلم tytso، به‌اضافهٔ وصله‌های دیگر؛ pmacdona هم کار روی کنسول‌های مجازی را شروع کرده بود. این اولین انتشاری بود که قابلیت‌های «غیرضروری» داشت و بخشی از آن را دیگران نوشته بودند. اولین انتشاری هم بود که در خیلی از کارها واقعاً از مینیکس بهتر بود، و از همین زمان بود که مردم کم‌کم جدی به آن علاقه‌مند شدند.

بعد ۰.۹۵ در مارس آمد، رفع باگ‌ها در آوریل، و به‌زودی هم ۰.۹۶. لینوس جوابش را این‌طور تمام می‌کند: «بی‌تردید لذت‌بخش بوده (و امیدوارم همین‌طور بماند). واکنش‌ها بیشترشان خیلی مثبت بوده‌اند، و از چنین کاری خیلی چیزها یاد می‌گیری؛ البته از آن طرف، درس و دانشگاهت لطمه می‌خورد :)»

به‌طور خلاصه، روایت ۱۹۹۲ لینوس نشان می‌دهد لینوکس چطور از یک کنجکاوی شخصی شروع شد. او در آوریل ۹۱ فقط می‌خواست تعویض وظیفه در ۳۸۶ را کشف کند، نه این‌که هسته بنویسد. در اوت همان سال هنوز می‌گفت سیستمش «فقط یک سرگرمی» است و مثل گنو بزرگ و حرفه‌ای نخواهد شد. چند ماه بعد، با ۰.۱۱ لینوکس روی پای خودش ایستاد و با ۰.۱۲ کسانی جز خود لینوس هم جدی به آن روی آوردند. همهٔ این جزئیات در مجموعه‌پست‌هایی است که لینوس در ۳۱ ژوئیهٔ ۱۹۹۲ کنار هم گذاشت.

منبع: LINUX's History by Linus Torvalds، نوشتهٔ ۳۱ ژوئیهٔ ۱۹۹۲. صفحهٔ میزبان مجوز جداگانه‌ای اعلام نکرده است.