กลับไปหน้าบทความ

อ่าน 61 นาที

เคอร์เนลลินุกซ์

เคอร์เนล Linux เป็น เคอร์เนล แบบ Unix ที่เป็น โอเพนซอร์สและใช้งานได้ฟรี [ 16 ] : 4 ซึ่งใช้ใน ระบบคอมพิวเตอร์ หลายระบบ ทั่วโลก เคอร์เนลนี้ถูกสร้างขึ้นโดย Linus Torvalds ในปี 1991...

เคอร์เนลลินุกซ์

เคอร์เนลลินุกซ์
ผู้เขียนต้นฉบับลินัส ทอร์วัลด์ส
นักพัฒนาผู้มีส่วนร่วมจากชุมชน : Linus Torvalds
ปล่อย0.02 (5 ตุลาคม 2534 ) ( 5 ตุลาคม 1991 )
เวอร์ชันเสถียร
ปกติ : 7.1 / 14 มิถุนายน 2026 [ 2 ]  LTS : 6.18.21 / 2 เมษายน 2026 [ 3 ]แก้ไขข้อมูลนี้บนวิกิดาต้า แก้ไขข้อมูลนี้บนวิกิดาต้า
รุ่นทดลองใช้งาน
7.1-rc7 [ 4 ] แก้ไขข้อมูลนี้บนวิกิดาต้า / 7 มิถุนายน 2026
เขียนเป็นC , [ a ] ​​การประกอบสนิม[ b ]และอื่นๆ[ 9 ]
มีจำหน่ายในภาษาอังกฤษ
ใบอนุญาตGPL-2.0 เท่านั้นพร้อมหมายเหตุการเรียกใช้ระบบ Linux [ 10 ] [ 11 ] [ 12 ] [ c ]
เว็บไซต์เคอร์เนล.org แก้ไขข้อมูลนี้บนวิกิดาต้า
ที่เก็บข้อมูล
  • git .kernel .org /pub /scm /linux /kernel /git /torvalds /linux .git

เคอร์เนลLinuxเป็นเคอร์เนลแบบ Unix ที่เป็น โอเพนซอร์สและใช้งานได้ฟรี[ 16 ] : 4 ซึ่งใช้ในระบบคอมพิวเตอร์ หลายระบบ ทั่วโลก เคอร์เนลนี้ถูกสร้างขึ้นโดยLinus Torvaldsในปี 1991 และในไม่ช้าก็ถูกนำมาใช้เป็นเคอร์เนลสำหรับระบบปฏิบัติการGNU (OS) ซึ่งถูกสร้างขึ้นเพื่อทดแทนUnix อย่างฟรีๆตั้งแต่ปลายทศวรรษ 1990 เป็นต้นมา เคอร์เนลนี้ได้ถูกรวมอยู่ในระบบปฏิบัติการ หลายๆ ระบบ ซึ่งหลายระบบเรียกว่าLinuxหนึ่งในระบบปฏิบัติการเคอร์เนล Linux ดังกล่าวคือAndroidซึ่งใช้ในอุปกรณ์พกพาและอุปกรณ์ฝังตัวหลายชนิด

โค้ดเคอร์เนลส่วนใหญ่เขียนด้วยภาษาCตามที่ได้รับการสนับสนุนจากGNU Compiler Collection (GCC) ซึ่งมีส่วนขยายที่นอกเหนือจากภาษา C มาตรฐาน[ 16 ] : 18 [ 17 ]โค้ดยังประกอบด้วย โค้ด แอสเซมบลีสำหรับตรรกะเฉพาะสถาปัตยกรรม เช่น การเพิ่มประสิทธิภาพการใช้หน่วยความจำและการดำเนินการงาน[ 16 ] : 379–380 เคอร์เนลมี การออกแบบ แบบโมดูลาร์เพื่อให้สามารถรวมโมดูลเป็นส่วนประกอบซอฟต์แวร์ได้ รวมถึงการโหลดแบบไดนามิก เคอร์เนลเป็นแบบโมโนลิธิกในแง่ของสถาปัตยกรรม เนื่องจากเคอร์เนลระบบปฏิบัติการทั้งหมดทำงานในพื้นที่เคอร์เนล

Linux อยู่ภายใต้สัญญาอนุญาตสาธารณะทั่วไปของ GNUเวอร์ชัน 2 แม้ว่าจะมีไฟล์ที่อยู่ภายใต้สัญญาอนุญาตอื่นที่เข้ากันได้ก็ตาม[ 15 ]

ประวัติศาสตร์

ลินัส ทอร์วัลด์สในงาน LinuxCon Europe 2014

ในปี พ.ศ. 2534 Linus Torvalds เป็น นักศึกษา วิทยาการคอมพิวเตอร์ที่ลงทะเบียนเรียนที่มหาวิทยาลัยเฮลซิงกิในระหว่างนั้น เขาเริ่มพัฒนาระบบปฏิบัติการเป็นโครงการเสริมที่ได้รับแรงบันดาลใจจาก UNIX สำหรับคอมพิวเตอร์ส่วนบุคคล[ 18 ]เขาเริ่มต้นด้วยตัวสลับงานในภาษาแอสเซมบลี Intel 80386และไดรเวอร์เทอร์มินัล [ 18 ] เมื่อวันที่ 25 สิงหาคม พ.ศ. 2534 Torvalds ได้โพสต์ข้อความต่อไปนี้ไปยังcomp.os.minixซึ่งเป็นกลุ่มข่าวบนUsenet : [ 19 ]

ผมกำลังพัฒนาระบบปฏิบัติการ (ฟรี) (เป็นแค่กิจกรรมยามว่าง ไม่ได้ใหญ่โตหรือเป็นมืออาชีพเหมือน GNU) สำหรับ เครื่องคอมพิวเตอร์แบบ AT- clone 386 (486) ครับ เริ่มทำมาตั้งแต่เดือนเมษายน และตอนนี้เริ่มใกล้เสร็จแล้ว ผมอยากได้ความคิดเห็นเกี่ยวกับสิ่งที่คนชอบ/ไม่ชอบใน Minix เพราะระบบปฏิบัติการของผมคล้ายคลึงกับมันอยู่บ้าง (โครงสร้างทางกายภาพของระบบไฟล์เหมือนกัน (ด้วยเหตุผลทางปฏิบัติ) และอื่นๆ) ตอนนี้ผมได้พอร์ตbash (1.08) และgcc (1.40) แล้ว และดูเหมือนจะใช้งานได้ นั่นหมายความว่าผมจะได้อะไรที่ใช้งานได้จริงภายในไม่กี่เดือนข้างหน้า [...] ใช่ครับ มันปราศจากโค้ดของ Minix และมีระบบไฟล์แบบมัลติเธรด แต่มันไม่สามารถพกพา ได้ (ใช้การสลับงานของ 386 เป็นต้น) และอาจจะไม่รองรับฮาร์ดดิสก์แบบอื่นนอกจาก AT เพราะผมมีแค่แบบนั้น :-(

เมื่อวันที่ 17 กันยายน พ.ศ. 2534 Torvalds ได้เตรียม Linux เวอร์ชัน 0.01 และนำไปไว้บน "ftp.funet.fi" ซึ่งเป็นเซิร์ฟเวอร์ FTP ของเครือข่ายมหาวิทยาลัยและการวิจัยของฟินแลนด์ ( FUNET ) แม้แต่จะเรียกใช้งานได้ก็ยังต้องใช้ Minix ในการคอมไพล์และทดสอบ[ 20 ]

เมื่อวันที่ 5 ตุลาคม พ.ศ. 2534 Torvalds ได้ประกาศ Linux เวอร์ชัน "อย่างเป็นทางการ" เวอร์ชันแรก คือเวอร์ชัน 0.02 [ 21 ] [ 20 ]

อย่างที่ผมได้กล่าวไปเมื่อเดือนที่แล้ว ผมกำลังพัฒนาโปรแกรมจำลอง Minix เวอร์ชันฟรีสำหรับคอมพิวเตอร์ AT-386 ตอนนี้มันพัฒนามาถึงขั้นที่ใช้งานได้แล้ว (ถึงแม้ว่าอาจจะไม่ใช่ทุกความต้องการใช้งาน) และผมยินดีที่จะเผยแพร่ซอร์สโค้ดให้ผู้อื่นได้ใช้งานอย่างแพร่หลาย นี่เป็นเพียงเวอร์ชัน 0.02 เท่านั้น...แต่ผมได้ทดสอบใช้งาน bash, gcc, gnu-make, gnu-sed, compress ฯลฯ ได้สำเร็จแล้ว

ในขณะนั้นโครงการ GNUได้สร้างส่วนประกอบหลายอย่างสำหรับระบบปฏิบัติการ UNIX ทดแทนGNU เสร็จสมบูรณ์แล้ว แต่เคอร์เนลGNU Hurdยังไม่สมบูรณ์ โครงการจึงนำเคอร์เนล Linux มาใช้เป็นระบบปฏิบัติการ[ 22 ]

Torvalds ได้ติดป้ายกำกับเคอร์เนลด้วยเวอร์ชันหลัก 0 เพื่อระบุว่ายังไม่ได้มีไว้สำหรับการใช้งานทั่วไป[ 23 ]เวอร์ชัน 0.11 ซึ่งเผยแพร่ในเดือนธันวาคม พ.ศ. 2534 เป็นเวอร์ชันแรกที่สามารถโฮสต์ได้ด้วยตนเองกล่าวคือ คอมไพล์บนคอมพิวเตอร์ที่ใช้เคอร์เนล Linux

เมื่อ Torvalds ออกเวอร์ชัน 0.12 ในเดือนมกราคม พ.ศ. 2535 เขาได้นำใบอนุญาตสาธารณะทั่วไปของ GNUเวอร์ชัน 2 (GPLv2) มาใช้แทนใบอนุญาตที่เขาร่างขึ้นเองก่อนหน้านี้ ซึ่งไม่อนุญาตให้มีการแจกจ่ายเชิงพาณิชย์ GPL มีผลบังคับใช้ตั้งแต่วันที่ 1 กุมภาพันธ์ พ.ศ. 2535 [ 24 ]ในทางตรงกันข้ามกับUnix ไฟล์ต้นฉบับทั้งหมดของ Linux สามารถใช้งานได้ฟรี รวมถึงไดรเวอร์อุปกรณ์ด้วย[ 25 ]

ความสำเร็จในช่วงแรกของ Linux เกิดจากโปรแกรมเมอร์และผู้ทดสอบทั่วโลก เนื่องจาก Linux ใช้ระบบการเรียกใช้แบบ Unix และเปิดเผย API มาตรฐานPOSIXผ่านการใช้งานไลบรารีมาตรฐาน Cทำให้ Linux สามารถเรียกใช้ซอฟต์แวร์และแอปพลิเคชันที่ได้รับการพัฒนาสำหรับ Unix ได้[ 26 ]

เคอร์เนลของลินุกซ์รองรับสถาปัตยกรรมฮาร์ดแวร์ที่หลากหลาย ทำให้เป็นแพลตฟอร์มทั่วไปสำหรับซอฟต์แวร์ รวมถึงซอฟต์แวร์ที่เป็นกรรมสิทธิ์ด้วย

เมื่อวันที่ 19 มกราคม พ.ศ. 2535 มีการส่งโพสต์แรกไปยังกลุ่มข่าวใหม่alt.os.linux [ 27 ]เมื่อวันที่ 31 มีนาคม พ.ศ. 2535 กลุ่มข่าวนี้ได้รับการเปลี่ยนชื่อเป็นcomp.os.linux [ 28 ]

ข้อเท็จจริงที่ว่า Linux เป็นเคอร์เนลแบบโมโนลิธิกแทนที่จะเป็นไมโครเคอร์เนลเป็นหัวข้อของการถกเถียงระหว่างAndrew S. Tanenbaumผู้สร้าง MINIX และ Torvalds [ 29 ]การถกเถียงระหว่าง Tanenbaum และ Torvaldsเริ่มต้นในปี 1992 ในกลุ่มUsenet comp.os.minixในฐานะการสนทนาทั่วไปเกี่ยวกับสถาปัตยกรรมเคอร์เนล[ 30 ] [ 31 ]

เวอร์ชัน 0.96 ที่วางจำหน่ายในเดือนพฤษภาคม พ.ศ. 2535 เป็นเวอร์ชันแรกที่สามารถใช้งานX Window Systemได้[ 32 ] [ 33 ]ในเดือนมีนาคม พ.ศ. 2537 Linux 1.0.0 ได้รับการเผยแพร่พร้อมโค้ด 176,250 บรรทัด[ 34 ]ดังที่ระบุโดยหมายเลขเวอร์ชัน ถือเป็นเวอร์ชันแรกที่ถือว่าเหมาะสมสำหรับ สภาพแวดล้อม การผลิต[ 23 ]ในเดือนมิถุนายน พ.ศ. 2539 หลังจากการเผยแพร่เวอร์ชัน 1.3 Torvalds ตัดสินใจว่า Linux ได้พัฒนามากพอที่จะมีหมายเลขหลักใหม่ และจึงตั้งชื่อเวอร์ชันถัดไปว่า 2.0.0 [ 35 ] [ 36 ]คุณสมบัติที่สำคัญของเวอร์ชัน 2.0 ได้แก่การประมวลผลแบบมัลติโปรเซสซิ่งแบบสมมาตร (SMP) การสนับสนุนประเภทโปรเซสเซอร์ที่มากขึ้น และการสนับสนุนการเลือกเป้าหมายฮาร์ดแวร์เฉพาะ และการเปิดใช้งานคุณสมบัติและการเพิ่มประสิทธิภาพเฉพาะสถาปัตยกรรม[ 26 ]ตระกูล คำสั่ง make *configของkbuildเปิดใช้งานและกำหนดค่าตัวเลือกสำหรับการสร้างไฟล์ปฏิบัติการเคอร์เนลเฉพาะกิจ ( vmlinux ) และโมดูลที่โหลดได้[ 37 ] [ 38 ]

เวอร์ชัน 2.2 ซึ่งวางจำหน่ายเมื่อวันที่ 20 มกราคม พ.ศ. 2542 [ 39 ]ได้ปรับปรุงความละเอียดของการล็อกและการจัดการ SMP เพิ่ม การรองรับ m68k , PowerPC , Sparc64 , Alphaและแพลตฟอร์ม 64 บิตอื่นๆ[ 40 ]นอกจากนี้ยังเพิ่มระบบไฟล์ ใหม่ รวมถึงความสามารถในการอ่านอย่างเดียวของ NTFSของMicrosoft [ 40 ]ในปี พ.ศ. 2542 IBM ได้เผยแพร่แพตช์สำหรับโค้ด Linux 2.2.13 เพื่อรองรับสถาปัตยกรรมS/390 [ 41 ]

เวอร์ชัน 2.4.0 ซึ่งวางจำหน่ายเมื่อวันที่ 4 มกราคม พ.ศ. 2544 [ 42 ]มีการสนับสนุนISA Plug and Play , USBและPC Cards Linux 2.4 เพิ่มการสนับสนุนสำหรับPentium 4และItanium (โดยรุ่นหลังได้แนะนำia64 ISA ซึ่งได้รับการพัฒนาร่วมกันโดย Intel และ Hewlett-Packard เพื่อแทนที่PA-RISC รุ่นเก่า ) และสำหรับโปรเซสเซอร์MIPS 64 บิตรุ่น ใหม่กว่า [ 43 ]การพัฒนาสำหรับ 2.4.x เปลี่ยนแปลงไปเล็กน้อย โดยมีการเพิ่มคุณสมบัติเพิ่มเติมตลอดทั้งซีรีส์ รวมถึงการสนับสนุนBluetooth , Logical Volume Manager (LVM) เวอร์ชัน 1, การสนับสนุน RAID , InterMezzoและระบบไฟล์ ext3

เวอร์ชัน 2.6.0 เปิดตัวเมื่อวันที่ 17 ธันวาคม พ.ศ. 2546 [ 44 ]การพัฒนาสำหรับเวอร์ชัน 2.6.x เปลี่ยนไปเป็นการรวมคุณสมบัติใหม่ ๆ ตลอดทั้งชุด การเปลี่ยนแปลงที่เกิดขึ้นในซีรี่ส์ 2.6 ได้แก่ การรวมμClinuxเข้ากับซอร์สโค้ดเคอร์เนลหลัก การสนับสนุน PAEการสนับสนุนซีพียู หลายรุ่นใหม่ การรวม Advanced Linux Sound Architecture (ALSA) เข้ากับซอร์สโค้ดเคอร์เนลหลัก การสนับสนุนผู้ใช้ได้สูงสุด 2³² คน(จากเดิม2¹⁶ คน ) การสนับสนุนรหัสกระบวนการได้สูงสุด2²⁹รหัส (เฉพาะ 64 บิต สถาปัตยกรรม 32 บิตยังคงจำกัดอยู่ที่ 2¹⁵ รหัส) [ 45 ] เพิ่มจำนวนประเภทอุปกรณ์และจำนวนอุปกรณ์แต่ละประเภทอย่างมาก ปรับปรุง การสนับสนุน 64 บิตการสนับสนุนระบบไฟล์ที่รองรับขนาดไฟล์ได้สูงสุด 16 เทราไบต์การแย่งชิงในเคอร์เนลการสนับสนุนNative POSIX Thread Library (NPTL) การรวม User-mode Linuxเข้ากับซอร์สโค้ดเคอร์เนลหลัก การรวม SELinuxเข้ากับซอร์สโค้ดเคอร์เนลหลัก การสนับสนุน InfiniBandและอื่นๆ อีกมากมาย

ตั้งแต่เวอร์ชัน 2.6.x เป็นต้นไป เคอร์เนลรองรับระบบไฟล์จำนวนมาก บางระบบได้รับการออกแบบมาสำหรับ Linux เช่นext3 , ext4 , FUSEและBtrfs [ 46 ]ส่วนระบบอื่นๆ เป็นระบบไฟล์ดั้งเดิมของระบบปฏิบัติการอื่นๆ เช่นJFS , XFS , Minix, Xenix , Irix , Solaris , System V , WindowsและMS- DOS [ 47 ]

แม้ว่าการพัฒนาจะไม่ได้ใช้ระบบควบคุมเวอร์ชันมาก่อน แต่ในปี 2545 นักพัฒนา Linux ได้นำBitKeeper มา ใช้ ซึ่งเปิดให้ใช้งานได้ฟรีแม้ว่าจะไม่ใช่ซอฟต์แวร์ฟรีก็ตาม ในปี 2548 เนื่องจากความพยายามในการวิศวกรรมย้อนกลับบริษัทที่เป็นเจ้าของซอฟต์แวร์จึงเพิกถอนการสนับสนุนชุมชน Linux เพื่อตอบโต้ Torvalds และคนอื่นๆ จึงเขียนGitขึ้นมา ระบบใหม่นี้ถูกเขียนขึ้นภายในไม่กี่สัปดาห์ และในอีกสองเดือนต่อมา เคอร์เนลอย่างเป็นทางการตัวแรกที่สร้างขึ้นโดยใช้ระบบนี้ก็ถูกปล่อยออกมา[ 48 ]

ในปี 2548 ทีมเสถียรถูกก่อตั้งขึ้นเพื่อตอบสนองต่อการขาดโครงสร้างเคอร์เนลที่ผู้คนสามารถทำงานแก้ไขข้อบกพร่องได้และทีมนี้จะคอยอัปเดตเวอร์ชันเสถียร ต่อไป [ 49 ]ในเดือนกุมภาพันธ์ 2551 โครงสร้าง linux-nextถูกสร้างขึ้นเพื่อใช้เป็นสถานที่รวบรวมแพตช์ที่มุ่งหมายจะรวมเข้าด้วยกันในรอบการพัฒนาครั้งต่อไป[ 50 ] [ 51 ]ผู้ดูแลระบบย่อยหลายรายยังใช้คำต่อท้าย-nextสำหรับโครงสร้างที่มีโค้ดที่พวกเขาตั้งใจจะส่งเพื่อรวมไว้ในรอบการเผยแพร่ครั้งต่อไป ณ เดือนมกราคม 2557 เวอร์ชัน Linux ที่อยู่ระหว่างการพัฒนาจะถูกเก็บไว้ในสาขาที่ไม่เสถียรชื่อlinux -next [ 52 ]

Torvalds ฉลองครบรอบ 20 ปีของ Linux ในเดือนกรกฎาคม 2011 ด้วยการเปิดตัวเวอร์ชัน 3.0.0 [ 35 ]เนื่องจาก 2.6 เป็นหมายเลขเวอร์ชันมา 8 ปีแล้ว จึงต้องเพิ่มบุคลิกของ uname26 ใหม่ ที่รายงาน 3.x เป็น 2.6.40+x ลงในเคอร์เนลเพื่อให้โปรแกรมเก่าทำงานได้[ 53 ]

เวอร์ชัน 3.0 เปิดตัวเมื่อวันที่ 22 กรกฎาคม 2554 [ 54 ]เมื่อวันที่ 30 พฤษภาคม 2554 Torvalds ประกาศว่าการเปลี่ยนแปลงครั้งใหญ่คือ "ไม่มีอะไรเลย ไม่มีอะไรเลยจริงๆ" และถามว่า "...มาทำให้แน่ใจว่าการเปิดตัวครั้งต่อไปจะไม่ใช่แค่ตัวเลขใหม่ที่ดูดีเท่านั้น แต่ยังเป็นเคอร์เนลที่ดีด้วย" [ 55 ]หลังจากกระบวนการพัฒนาที่คาดไว้ 6-7 สัปดาห์ ก็จะมีการเปิดตัวใกล้กับวันครบรอบ 20 ปีของ Linux

เมื่อวันที่ 11 ธันวาคม พ.ศ. 2555 Torvalds ตัดสินใจลดความซับซ้อนของเคอร์เนลโดยการลบการสนับสนุน โปรเซสเซอร์ i386 ออก โดยเฉพาะอย่างยิ่งโดยไม่ต้องจำลอง[ 56 ]คำ สั่ง อะตอมิกCMPXCHGที่แนะนำในi486เพื่อให้สามารถใช้mutex ได้อย่างน่าเชื่อถือ ทำให้ซีรี่ส์เคอร์เนล 3.7 เป็นซีรี่ส์สุดท้ายที่ยังคงรองรับโปรเซสเซอร์ดั้งเดิม[ 57 ] [ 58 ]ซีรี่ส์เดียวกันนี้ยังรวมการสนับสนุนสำหรับโปรเซสเซอร์ARM ไว้ด้วย [ 59 ]

การเปลี่ยนแปลงหมายเลขจาก 2.6.39 เป็น 3.0 และจาก 3.19 เป็น 4.0 ไม่ได้เกี่ยวข้องกับความแตกต่างทางเทคนิคที่มีนัยสำคัญใดๆ หมายเลขเวอร์ชันหลักเพิ่มขึ้นเพียงเพื่อหลีกเลี่ยงหมายเลขเวอร์ชันย่อยที่มากเกินไป[ 54 ] [ 60 ]เคอร์เนล 3.xy ที่เสถียรได้รับการเผยแพร่จนถึง 3.19 ในเดือนกุมภาพันธ์ 2015 เวอร์ชัน 3.11 ซึ่งเผยแพร่เมื่อวันที่ 2 กันยายน 2013 [ 61 ]ได้เพิ่มคุณสมบัติใหม่มากมาย เช่น แฟล็ก O_TMPFILE ใหม่ เพื่อopen(2)ลดช่องโหว่ของไฟล์ชั่วคราว การจัดการพลังงานแบบไดนามิก AMD Radeon ที่อยู่ระหว่างการ ทดลอง การสำรวจเครือข่ายที่มีความหน่วงต่ำ และzswap (แคชสวอปแบบบีบอัด) [ 62 ]

ในเดือนเมษายน พ.ศ. 2558 Torvalds ได้ปล่อยเคอร์เนลเวอร์ชัน 4.0 [ 35 ]ภายในเดือนกุมภาพันธ์ พ.ศ. 2558 Linux ได้รับการสนับสนุนจากโปรแกรมเมอร์เกือบ 12,000 คนจากบริษัทมากกว่า 1,200 แห่ง รวมถึงผู้จำหน่ายซอฟต์แวร์และฮาร์ดแวร์รายใหญ่ที่สุดของโลกบางราย[ 63 ] Linux เวอร์ชัน 4.1 ซึ่งเปิดตัวในเดือนมิถุนายน พ.ศ. 2558 มีโค้ดมากกว่า 19.5 ล้านบรรทัดที่ได้รับการสนับสนุนจากโปรแกรมเมอร์เกือบ 14,000 คน[ 64 ]

Linus Torvalds ประกาศว่าเวอร์ชันเคอร์เนล 4.22 จะถูกเปลี่ยนเป็นหมายเลข 5.0 ในเดือนมีนาคม 2019 โดยระบุว่า "'5.0' ไม่ได้หมายความอะไรมากไปกว่าที่ตัวเลข 4.x เริ่มใหญ่เกินไปจนผมไม่มีนิ้วมือและนิ้วเท้าเหลือแล้ว" [ 65 ]เวอร์ชันนี้มีการเพิ่มเติมที่สำคัญหลายอย่าง เช่น การสนับสนุน AMD Radeon FreeSyncและ จอแสดงผล NVIDIA Xavier การแก้ไขสำหรับF2FS , EXT4และXFSการกู้คืนการสนับสนุนไฟล์สวอปบนระบบไฟล์Btrfs และการทำงานต่อเนื่องเกี่ยวกับ กราฟิก Intel Icelake Gen11 และNXP i.MX8 SoCs [ 66 ] [ 67 ]เวอร์ชันนี้มีขนาดใหญ่กว่าเวอร์ชันอื่นๆ อย่างเห็นได้ชัด Torvalds กล่าวว่า "การเปลี่ยนแปลงโดยรวมสำหรับเวอร์ชัน 5.0 ทั้งหมดนั้นใหญ่กว่ามาก" [ 65 ]

นักพัฒนาทั้งหมด 1,991 คน ซึ่ง 334 คนเป็นผู้ร่วมงานครั้งแรก ได้เพิ่มโค้ดมากกว่า 553,000 บรรทัดให้กับเวอร์ชัน 5.8 ซึ่งทำลายสถิติเดิมที่เวอร์ชัน 4.9 เคยทำไว้[ 68 ]

ความนิยม

จากผลสำรวจนักพัฒนาซอฟต์แวร์ประจำปี 2019 ของ Stack Overflow พบว่าผู้ตอบแบบสอบถามมากกว่า 53% พัฒนาซอฟต์แวร์สำหรับLinuxและประมาณ 27% สำหรับAndroid [ 69 ] แม้ว่า จะมีเพียงประมาณ 25% เท่านั้นที่พัฒนาด้วยระบบปฏิบัติการที่ใช้ Linux [ 70 ]

เว็บไซต์ส่วนใหญ่ทำงานบนระบบปฏิบัติการ Linux [ 71 ] [ 72 ] และซูเปอร์คอมพิวเตอร์ที่ ทรงพลังที่สุด 500 เครื่องทั่ว โลก ก็ทำงานบน Linux [ 73 ]

ระบบปฏิบัติการลินุกซ์นั้นรวมเคอร์เนลเข้ากับซอฟต์แวร์ระบบ (เช่นไลบรารี GNU C , systemdและยูทิลิตี้และเดมอนUnix อื่นๆ) และ ซอฟต์แวร์แอปพลิเคชันให้เลือกมากมายแต่ส่วนแบ่งการใช้งานบนเดสก์ท็อปนั้นต่ำเมื่อเทียบกับระบบปฏิบัติการอื่นๆ

Androidซึ่งทำงานบนเคอร์เนล Linux ที่ได้รับการดัดแปลง คิดเป็นสัดส่วนส่วนใหญ่ของระบบปฏิบัติการอุปกรณ์เคลื่อนที่[ 74 ] [ 75 ] [ 76 ]และกำลังถูกนำไปใช้ในอุปกรณ์ฝังตัว มากขึ้นเรื่อยๆ ทำให้เป็นตัวขับเคลื่อนสำคัญของการนำ Linux มาใช้[ 26 ]

ค่า

ต้นทุนการพัฒนาใหม่ของเคอร์เนลลินุกซ์

ต้นทุนในการพัฒนาเคอร์เนล Linux เวอร์ชัน 2.6.0 ขึ้นใหม่ในสภาพแวดล้อมการพัฒนาแบบดั้งเดิมที่เป็นกรรมสิทธิ์นั้น คาดว่าจะอยู่ที่ 612 ล้านดอลลาร์สหรัฐ (467 ล้านยูโร, 394 ล้านปอนด์) ตามราคาในปี 2547 โดยใช้แบบจำลองการประมาณการจำนวนคนต่อเดือนของ COCOMO [ 77 ]ในปี 2549 การศึกษาที่ได้รับทุนจากสหภาพยุโรปได้ประเมินต้นทุนการพัฒนาเคอร์เนลเวอร์ชัน 2.6.8 ขึ้นใหม่ให้สูงขึ้น โดยอยู่ที่ 882 ล้านยูโร (1.14 พันล้านดอลลาร์สหรัฐ, 744 ล้านปอนด์) [ 78 ]

หัวข้อนี้ได้รับการกล่าวถึงอีกครั้งในเดือนตุลาคม พ.ศ. 2551 โดย Amanda McPherson, Brian Proffitt และ Ron Hale-Evans โดยใช้วิธีการของ David A. Wheeler พวกเขาประเมินว่าการพัฒนาเคอร์เนลเวอร์ชัน 2.6.25 ใหม่มีค่าใช้จ่าย 1.3 พันล้านดอลลาร์ (เป็นส่วนหนึ่งของค่าใช้จ่ายทั้งหมด 10.8 พันล้านดอลลาร์ในการพัฒนา Fedora 9 ใหม่) [ 79 ]อีกครั้งหนึ่ง Garcia-Garcia และ Alonso de Magdaleno จากมหาวิทยาลัย Oviedo (สเปน) ประเมินว่ามูลค่าที่เพิ่มขึ้นให้กับเคอร์เนลในแต่ละปีอยู่ที่ประมาณ 100 ล้านยูโรระหว่างปี พ.ศ. 2548 ถึง พ.ศ. 2550 และ 225 ล้านยูโรในปี พ.ศ. 2551 ซึ่งจะมีค่าใช้จ่ายมากกว่า 1 พันล้านยูโร (ประมาณ 1.4 พันล้านดอลลาร์ ณ เดือนกุมภาพันธ์ พ.ศ. 2553) ในการพัฒนาในสหภาพยุโรป[ 80 ]

ณ วันที่ 7 มีนาคม 2554 โดยใช้จำนวนบรรทัดโค้ด (LOC) ของเคอร์เนลลินุกซ์เวอร์ชัน 2.6.x และตัวเลขค่าจ้างตามการคำนวณของ David A. Wheeler จะต้องเสียค่าใช้จ่ายประมาณ 3 พันล้านดอลลาร์สหรัฐ (ประมาณ 2.2 พันล้านยูโร) ในการพัฒนาเคอร์เนลลินุกซ์ใหม่ เนื่องจากเคอร์เนลมีขนาดใหญ่ขึ้นเรื่อยๆ การคำนวณที่ปรับปรุงใหม่ ณ วันที่ 26 กันยายน 2561 โดยใช้จำนวนบรรทัดโค้ด (LOC) 20,088,609 บรรทัดของเคอร์เนลลินุกซ์เวอร์ชัน 4.14.14 และเงินเดือนเฉลี่ยของโปรแกรมเมอร์ในสหรัฐอเมริกาปัจจุบันที่ 75,506 ดอลลาร์สหรัฐ แสดงให้เห็นว่าจะต้องเสียค่าใช้จ่ายประมาณ 14,725,449,000 ดอลลาร์สหรัฐ (11,191,341,000 ปอนด์) ในการเขียนโค้ดที่มีอยู่ใหม่[ 81 ]

การกระจาย

ผู้ใช้ Linux ส่วนใหญ่ใช้ผ่านดิสทริบิวชัน Linuxบางดิสทริบิวชันมาพร้อมกับเคอร์เนลเวอร์ชันมาตรฐานหรือเวอร์ชันเสถียร ผู้จำหน่ายหลายราย (เช่นRed HatและDebian ) ดูแลซอร์สโค้ดที่ปรับแต่งเอง โดยปกติแล้วการอัปเดตจะช้ากว่าเวอร์ชันมาตรฐาน และมักจะรวมการแก้ไขทั้งหมดจากเวอร์ชันเสถียรที่เกี่ยวข้อง แต่ในขณะเดียวกันก็อาจเพิ่มการสนับสนุนไดรเวอร์หรือคุณสมบัติที่ยังไม่ได้รับการเผยแพร่ในเวอร์ชันมาตรฐานที่ผู้จำหน่ายดิสทริบิวชันใช้เป็นพื้นฐานในการสร้างซอร์สโค้ดของตน

นักพัฒนา

ชุมชน

Million lines of codeKernel Version010203040501.0.02.2.02.5.04.06.17.1Million lines of codeGrowth of the Linux kernel by number of lines of code
กราฟแสดงขนาดของเวอร์ชัน Linux Kernel ในหน่วยล้านบรรทัดของโค้ด[ 82 ]ดูข้อมูลต้นฉบับ

ชุมชนนักพัฒนาเคอร์เนลลินุกซ์ประกอบด้วยสมาชิกประมาณ 5,000–6,000 คน จากการศึกษา "สถานะการพัฒนาเคอร์เนลลินุกซ์ปี 2017" ที่จัดทำโดยมูลนิธิลินุกซ์ ซึ่งครอบคลุมการแก้ไขสำหรับเวอร์ชัน 4.8 ถึง 4.13 พบว่ามีนักพัฒนาประมาณ 1,500 คนจากบริษัทประมาณ 200–250 แห่งที่ร่วมให้ข้อมูล นักพัฒนา 30 อันดับแรกมีส่วนร่วมในโค้ดมากกว่า 16% เล็กน้อย สำหรับบริษัทที่มีส่วนร่วมมากที่สุดคือ Intel (13.1%) และ Red Hat (7.2%) ตามด้วย Linaro (5.6%) และ IBM (4.1%) อันดับที่สองและห้าอยู่ในหมวดหมู่ 'ไม่มี' (8.2%) และ 'ไม่ทราบ' (4.1%) ตามลำดับ[ 83 ]

"แทนที่จะมีแผนงาน เราใช้แนวทางทางเทคนิค แทนที่จะมีการจัดสรรทรัพยากรส่วนกลาง เราใช้บุคคลและบริษัทต่างๆ ที่มีส่วนได้ส่วนเสียในการพัฒนาเคอร์เนลลินุกซ์ต่อไป โดยต่างฝ่ายต่างเป็นอิสระจากกัน คนอย่างลินัส ทอร์วัลด์สและผมไม่ได้วางแผนวิวัฒนาการของเคอร์เนล เราไม่ได้นั่งคิดแผนงานสำหรับสองปีข้างหน้า แล้วจัดสรรทรัพยากรให้กับฟีเจอร์ใหม่ๆ ต่างๆ นั่นเป็นเพราะเราไม่มีทรัพยากร ทรัพยากรทั้งหมดเป็นของบริษัทต่างๆ ที่ใช้และมีส่วนร่วมในลินุกซ์ รวมถึงผู้มีส่วนร่วมอิสระต่างๆ ด้วย ผู้ที่เป็นเจ้าของทรัพยากรเหล่านั้นเป็นผู้ตัดสินใจ..."

ไม่มี
ไม่ทราบ
ที่ปรึกษา
ซูเซ่
Google
บริษัทอื่นๆ อีกเกือบ 500 แห่ง

ความเกี่ยวข้องขององค์กรในการมีส่วนร่วมในเคอร์เนล Linux 4.8–4.13 [ 83 ]

ขัดแย้ง

ความขัดแย้งที่น่าสนใจในหมู่นักพัฒนาเคอร์เนลลินุกซ์:

  • ในเดือนกรกฎาคม พ.ศ. 2550 Con Kolivasประกาศว่าจะยุติการพัฒนาเคอร์เนล Linux [ 84 ] [ 85 ]
  • ในเดือนกรกฎาคม พ.ศ. 2552 Alan Coxลาออกจากตำแหน่ง ผู้ดูแลเลเยอร์ TTYหลังจากเกิดความขัดแย้งกับ Torvalds [ 86 ]
  • ในเดือนธันวาคม พ.ศ. 2553 มีการหารือกันระหว่าง James Bottomley ผู้ดูแล Linux SCSI และ Vladislav Bolkhovitin ผู้ดูแล SCST เกี่ยวกับว่าควรจะรวมสแต็กเป้าหมาย SCSI ใดไว้ในเคอร์เนล Linux [ 87 ]ซึ่งทำให้ผู้ใช้ Linux บางคนไม่พอใจ[ 88 ]
  • ในเดือนมิถุนายน พ.ศ. 2555 Torvalds ได้ชี้แจงอย่างชัดเจนว่าเขาไม่เห็นด้วยกับ การที่ NVIDIAปล่อยไดรเวอร์แบบปิด[ 89 ]
  • ในเดือนเมษายน พ.ศ. 2557 Torvalds ได้สั่งห้ามKay Sieversส่งแพตช์ไปยังเคอร์เนล Linux เนื่องจากไม่สามารถจัดการกับบั๊กที่ทำให้systemdโต้ตอบกับเคอร์เนลในทางลบได้[ 90 ]
  • ในเดือนตุลาคม พ.ศ. 2557 Lennart Poetteringกล่าวหา Torvalds ว่ายอมรับรูปแบบการสนทนาที่หยาบคายในรายชื่อผู้รับจดหมายที่เกี่ยวข้องกับเคอร์เนล Linux และเป็นแบบอย่างที่ไม่ดี[ 91 ]
  • ในเดือนมีนาคม พ.ศ. 2558 คริสตอฟ เฮลวิก ได้ยื่นฟ้องVMwareในข้อหาละเมิดลิขสิทธิ์เคอร์เนล Linux [ 92 ]ไลนัส ทอร์วัลด์ส ได้แสดงให้เห็นอย่างชัดเจนว่าเขาไม่เห็นด้วยกับเรื่องนี้และโครงการริเริ่มที่คล้ายคลึงกัน โดยเรียกทนายความว่าเป็นโรคเน่าเปื่อย[ 93 ]
  • ในเดือนเมษายน พ.ศ. 2564 ทีมงานจากมหาวิทยาลัยมินนิโซตาถูกพบว่าส่งแพตช์ "เจตนาไม่ดี" ไปยังเคอร์เนลซึ่งเป็นส่วนหนึ่งของการวิจัย ส่งผลให้แพตช์ทั้งหมดที่ส่งโดยสมาชิกของมหาวิทยาลัยถูกยกเลิกทันที นอกจากนี้ ผู้ดูแลระบบอาวุโสยังออกคำเตือนว่าแพตช์ใดๆ ในอนาคตจากมหาวิทยาลัยจะถูกปฏิเสธทันที[ 94 ] [ 95 ]
  • ในเดือนกุมภาพันธ์ พ.ศ. 2568 เฮคเตอร์ มาร์ตินลาออกจากตำแหน่งผู้ดูแล โครงการ Asahi Linux (ซึ่งเพิ่มการสนับสนุน ระบบ Apple siliconให้กับ Linux) และระบบย่อยเคอร์เนลที่เกี่ยวข้องเนื่องจากความไม่ลงรอยกันเกี่ยวกับการใช้ ภาษาโปรแกรม Rustในเคอร์เนล[ 96 ]
  • ในเดือนมิถุนายน พ.ศ. 2568 ระบบไฟล์ Bcachefsก่อให้เกิดความขัดแย้งกับ Torvalds [ 97 ]และในเดือนกันยายน พ.ศ. 2568 ระบบไฟล์นี้ถูกลบออกจากเคอร์เนล Linux โดยเริ่มตั้งแต่เวอร์ชัน 6.18 [ 98 ]

นักพัฒนาเคอร์เนล Linux ที่มีชื่อเสียงต่างตระหนักถึงความสำคัญของการหลีกเลี่ยงความขัดแย้งระหว่างนักพัฒนา[ 99 ]เป็นเวลานานที่ไม่มีจรรยาบรรณสำหรับนักพัฒนาเคอร์เนลเนื่องจากการคัดค้านของ Torvalds [ 100 ] มีการนำ จรรยาบรรณว่าด้วยความขัดแย้งของเคอร์เนล Linux มาใช้เมื่อวันที่ 8 มีนาคม 2015 [ 101 ]และถูกแทนที่ด้วยจรรยาบรรณฉบับ ใหม่เมื่อวันที่ 16 กันยายน 2018 ซึ่ง อิงตาม ข้อ ตกลงของผู้มีส่วนร่วม เหตุการณ์นี้เกิดขึ้นพร้อมกับการขอโทษต่อสาธารณะของ Torvalds และการหยุดพักจากการพัฒนาเคอร์เนลชั่วคราว[ 102 ] [ 103 ]เมื่อวันที่ 30 พฤศจิกายน 2018 Jarkko Sakkinen จาก Intel ได้ส่งแพตช์เพื่อแก้ไขคำว่า "fuck" ที่ปรากฏในความคิดเห็นของซอร์สโค้ดด้วยคำที่เหมาะสมซึ่งเน้นที่คำว่า 'hug' โดยปฏิบัติตามจรรยาบรรณ[ 104 ]

นักพัฒนาที่รู้สึกว่าตนเองได้รับการปฏิบัติอย่างไม่เป็นธรรมสามารถรายงานเรื่องนี้ต่อคณะกรรมการที่ปรึกษาด้านเทคนิคของ Linux Foundation ได้ [ 105 ] ในเดือนกรกฎาคม 2013 Sage Sharpผู้ดูแลไดรเวอร์ USB 3.0 ได้ขอให้ Torvalds จัดการกับความคิดเห็นที่หยาบคายในชุมชนการพัฒนาเคอร์เนล ในปี 2014 Sharp ได้ถอนตัวออกจากการพัฒนาเคอร์เนล Linux โดยกล่าวว่า "การมุ่งเน้นความเป็นเลิศทางเทคนิค ควบคู่ไปกับผู้ดูแลที่ทำงานหนักเกินไป และผู้คนที่มีบรรทัดฐานทางวัฒนธรรมและสังคมที่แตกต่างกัน หมายความว่าผู้ดูแลเคอร์เนล Linux มักจะพูดจาตรงไปตรงมา หยาบคาย หรือโหดร้ายเพื่อให้งานของพวกเขาสำเร็จ" [ 106 ]ในการประชุม linux.conf.au (LCA) ในปี 2018 นักพัฒนาได้แสดงความคิดเห็นว่าวัฒนธรรมของชุมชนดีขึ้นมากในช่วงไม่กี่ปีที่ผ่านมา Daniel Vetter ผู้ดูแลไดรเวอร์เคอร์เนลกราฟิก Intel drm/i915 แสดงความคิดเห็นว่า "ภาษาและการอภิปรายที่ค่อนข้างรุนแรง" ในชุมชนเคอร์เนลลดลงหรือหายไปแล้ว[ 107 ]

Laurent Pinchart ได้ขอความคิดเห็นจากนักพัฒนาเกี่ยวกับประสบการณ์ของพวกเขากับชุมชนเคอร์เนลในการประชุม Embedded Linux Conference Europe ปี 2017 ประเด็นที่ยกขึ้นมานั้นได้ถูกนำมาหารือกันในอีกไม่กี่วันต่อมาในการประชุม Maintainers Summit ความกังวลเกี่ยวกับการขาดความสม่ำเสมอในการที่ผู้ดูแลระบบตอบสนองต่อแพตช์ที่ส่งโดยนักพัฒนาได้รับการสะท้อนโดยShuah Khanผู้ดูแลระบบของเฟรมเวิร์กการทดสอบตัวเองของเคอร์เนล Torvalds โต้แย้งว่าจะไม่มีความสม่ำเสมอในการจัดการแพตช์เนื่องจากระบบย่อยของเคอร์เนลที่แตกต่างกันได้นำกระบวนการพัฒนาที่แตกต่างกันมาใช้เมื่อเวลาผ่านไป ดังนั้นจึงตกลงกันว่าผู้ดูแลระบบย่อยของเคอร์เนลแต่ละรายจะจัดทำเอกสารกฎสำหรับการยอมรับแพตช์[ 108 ]

การพัฒนา

ลินุกซ์คือวิวัฒนาการ ไม่ใช่การออกแบบอย่างชาญฉลาด !

— ไลนัส ทอร์วัลด์ส, 2548 [ 109 ] [ 110 ] [ 111 ]

โค้ดเบส

ซอร์สโค้ดเคอร์เนล หรือที่เรียกว่าซอร์สทรี จะถูกจัดการในระบบควบคุมเวอร์ชันGit ซึ่งสร้างโดย Torvalds เช่นกัน[ 112 ]

ณ ปี 2021 เคอร์เนลลินุกซ์เวอร์ชัน 5.11 มีโค้ดประมาณ 30.34 ล้านบรรทัด ประมาณ 14% ของโค้ดเป็นส่วนหนึ่งของ "แกนหลัก" ซึ่งรวมถึงโค้ดเฉพาะสถาปัตยกรรม โค้ดเคอร์เนล และโค้ดการจัดการหน่วยความจำ ในขณะที่ 60% เป็นไดรเวอร์

การบริจาค

การมีส่วนร่วมจะถูกส่งเป็นแพตช์ในรูปแบบของข้อความในรายชื่อผู้รับจดหมายของเคอร์เนลลินุกซ์ (LKML) (และบ่อยครั้งในรายชื่อผู้รับจดหมายอื่นๆ ที่เกี่ยวข้องกับระบบย่อยเฉพาะ) แพตช์ต้องเป็นไปตามชุดของกฎและภาษาที่เป็นทางการ ซึ่งอธิบายถึงบรรทัดโค้ดที่จะต้องลบและบรรทัดโค้ดที่จะต้องเพิ่มลงในไฟล์ที่ระบุ แพตช์เหล่านี้สามารถประมวลผลโดยอัตโนมัติเพื่อให้ผู้ดูแลระบบสามารถนำไปใช้เพื่อทำการเปลี่ยนแปลงโค้ดเพียงเล็กน้อยหรือเพื่ออัปเกรดเป็นเวอร์ชันถัดไปทีละน้อย[ 113 ]ลินุกซ์ยังแจกจ่ายในรูปแบบ GNU zip (gzip) และbzip2 ด้วย

นักพัฒนาที่ต้องการเปลี่ยนแปลงเคอร์เนล Linux จะเขียนและทดสอบโค้ดที่เปลี่ยนแปลง ขึ้นอยู่กับว่าการเปลี่ยนแปลงนั้นสำคัญแค่ไหนและแก้ไขระบบย่อยกี่ระบบ การเปลี่ยนแปลงนั้นจะถูกส่งเป็นแพตช์เดียวหรือหลายแพตช์ของซอร์สโค้ดในกรณีที่ระบบย่อยเดียวได้รับการดูแลโดยผู้ดูแลเพียงคนเดียว แพตช์เหล่านี้จะถูกส่งเป็นอีเมลไปยังผู้ดูแลระบบย่อยนั้น โดยระบุรายชื่อผู้รับอีเมลที่เหมาะสมในช่อง Cc ผู้ดูแลและผู้รับอีเมลจะตรวจสอบแพตช์และให้ข้อเสนอแนะ เมื่อกระบวนการตรวจสอบเสร็จสิ้น ผู้ดูแลระบบย่อยจะยอมรับแพตช์ในGit kernel tree ที่เกี่ยวข้อง หากการเปลี่ยนแปลงในเคอร์เนล Linux เป็นการแก้ไขข้อบกพร่องที่ถือว่าสำคัญมากพอ คำขอพูล (pull request) สำหรับแพตช์จะถูกส่งไปยัง Torvalds ภายในไม่กี่วัน มิเช่นนั้น คำขอพูลจะถูกส่งไปยัง Torvalds ในช่วงเวลาการรวม (merge window) ครั้งถัดไป ช่วงเวลาการรวมมักจะกินเวลาสองสัปดาห์และเริ่มต้นทันทีหลังจากที่เวอร์ชันเคอร์เนลก่อนหน้าได้รับการเผยแพร่[ 114 ] ชื่อ ของซอร์สโค้ดเคอร์เนล Git ระบุชื่อนักพัฒนาทั้งหมดที่มีส่วนร่วมในเคอร์เนล Linux ใน ไดเร็กทอรี Creditsและรายชื่อผู้ดูแลระบบย่อยทั้งหมดอยู่ในMaintainers [ 115 ]

เช่นเดียวกับโครงการซอฟต์แวร์โอเพนซอร์สขนาดใหญ่หลายโครงการ นักพัฒนาจำเป็นต้องปฏิบัติตามข้อตกลงของผู้มีส่วนร่วมซึ่งเป็นจรรยาบรรณที่มุ่งแก้ไขปัญหาการคุกคามผู้มีส่วนร่วมที่เป็นชนกลุ่มน้อย[ 116 ] [ 117 ]นอกจากนี้ เพื่อป้องกันการล่วงละเมิด การใช้คำศัพท์ที่ครอบคลุมในซอร์สโค้ดจึงเป็นข้อบังคับ[ 118 ]

ภาษาโปรแกรม

ลินุกซ์เขียนด้วยภาษาโปรแกรม C แบบพิเศษ ที่รองรับโดยGCCซึ่งเป็นคอมไพเลอร์ที่ขยายมาตรฐาน C ในหลายด้าน ตัวอย่างเช่น การใช้ส่วนของโค้ดที่เขียนด้วยภาษาแอสเซมบลี (ในไวยากรณ์ "AT&T-style" ของ GCC) ของสถาปัตยกรรมเป้าหมายแบบ อินไลน์

ในเดือนกันยายน พ.ศ. 2564 ข้อกำหนดเวอร์ชัน GCC สำหรับการคอมไพล์และสร้างเคอร์เนล Linux เพิ่มขึ้นจาก GCC 4.9 เป็น 5.1 ทำให้มีศักยภาพในการย้ายเคอร์เนลจากการใช้โค้ด C ที่อิงตาม มาตรฐาน C89ไปใช้โค้ดที่เขียนด้วยมาตรฐานC11 [ 119 ]โดยการย้ายไปใช้มาตรฐานดังกล่าวเกิดขึ้นในเดือนมีนาคม พ.ศ. 2565 พร้อมกับการเปิดตัว Linux 5.18 [ 120 ]

การสนับสนุนเบื้องต้นสำหรับ ภาษาการเขียนโปรแกรม Rustถูกเพิ่มใน Linux 6.1 [ 121 ]ซึ่งวางจำหน่ายในเดือนธันวาคม 2022 [ 122 ]โดยเวอร์ชันเคอร์เนลในภายหลัง เช่น Linux 6.2 และ Linux 6.3 ได้ปรับปรุงการสนับสนุนให้ดียิ่งขึ้น[ 123 ] [ 124 ]

สไตล์การเขียนโค้ด

ตั้งแต่ปี 2002 โค้ดต้องปฏิบัติตามกฎ 21 ข้อของรูปแบบการเขียนโค้ดเคอร์เนลลินุกซ์[ 125 ] [ 126 ]

การกำหนดเวอร์ชัน

เช่นเดียวกับซอฟต์แวร์ส่วนใหญ่ เคอร์เนลจะถูกกำหนดเวอร์ชันโดยใช้ชุดตัวเลขที่คั่นด้วยจุด

สำหรับเวอร์ชันแรก ๆ เวอร์ชันประกอบด้วยตัวเลขสามหรือสี่ตัวที่คั่นด้วยจุด เรียกว่ารุ่นหลักรุ่นย่อยและการแก้ไข[ 16 ] : 9 ในเวลานั้น รุ่นย่อยเลขคี่ใช้สำหรับการพัฒนาและการทดสอบ ในขณะที่รุ่นย่อยเลขคู่ใช้สำหรับการผลิต ตัวเลขหลักที่สี่ที่เป็นตัวเลือกจะระบุระดับแพทช์[ 23 ]รุ่นสำหรับการพัฒนาจะระบุด้วยคำต่อท้ายผู้สมัครรับเลือกตั้ง ( -rc )

ข้อกำหนดการกำหนดเวอร์ชันในปัจจุบันแตกต่างออกไป ตัวเลขคี่/คู่ที่บ่งบอกถึงเวอร์ชันพัฒนา/ใช้งานจริงถูกยกเลิกไปแล้ว และเวอร์ชันหลักจะระบุด้วยตัวเลขสองตัวแรกที่รวมกัน ในขณะที่กรอบเวลาสำหรับการพัฒนาเวอร์ชันหลักถัดไปเปิดกว้าง คำต่อท้าย -rcN จะใช้เพื่อระบุผู้สมัครรับเลือกตั้งลำดับที่ n สำหรับเวอร์ชันถัดไป[ 127 ]ตัวอย่างเช่น การเผยแพร่เวอร์ชัน 4.16 มีเวอร์ชัน 4.16-rcN ก่อนหน้าเจ็ดเวอร์ชัน (ตั้งแต่ -rc1 ถึง -rc7) เมื่อเวอร์ชันเสถียรได้รับการเผยแพร่แล้ว การบำรุงรักษาจะถูกส่งต่อให้ทีมเสถียรการอัปเดตเวอร์ชันเสถียรจะระบุด้วยระบบตัวเลขสามตัว (เช่น 4.16.1, 4.16.2, ...) [ 127 ]

ชุดเครื่องมือ

โดยปกติแล้วเคอร์เนลจะถูกสร้างขึ้นด้วยชุดเครื่องมือ GNUคอมไพเลอร์ GNU C หรือ GNU cc ซึ่งเป็นส่วนหนึ่งของชุดคอมไพเลอร์ GNU (GCC) เป็นคอมไพเลอร์ เริ่มต้น สำหรับ Linux เวอร์ชันหลัก การจัดลำดับการทำงานจะดำเนินการโดย GNU make ตัวประกอบภาษาแอสเซมบลี GNU ( มักเรียกว่า GAS หรือ GNU as) จะสร้างไฟล์ออบเจ็กต์ จากโค้ด แอสเซมบลีที่สร้างโดย GCC สุดท้ายตัวเชื่อมโยง GNU (GNU ld) จะสร้างไฟล์เคอร์เนลที่สามารถเรียกใช้งานได้แบบเชื่อมโยงแบบคงที่ เรียกว่าvmlinuxทั้งasและldเป็นส่วนหนึ่งของยูทิลิตี้ไบนารี GNU (binutils)

GNU cc เป็นคอมไพเลอร์เพียงตัวเดียวที่สามารถสร้าง Linux ได้อย่างถูกต้องมาเป็นเวลานาน ในปี 2547 Intelอ้างว่าได้แก้ไขเคอร์เนลเพื่อให้คอมไพเลอร์ C ของตนสามารถคอมไพล์ได้เช่นกัน[ 128 ]มีรายงานความสำเร็จดังกล่าวอีกครั้งในปี 2552 ด้วยเวอร์ชัน 2.6.22 ที่ได้รับการแก้ไข[ 129 ] [ 130 ]การสนับสนุนคอมไพเลอร์ของ Intel ถูกยกเลิกในปี 2566 [ 131 ]

ตั้งแต่ปี 2010 มีความพยายามในการสร้าง Linux ด้วยClangซึ่งเป็นคอมไพเลอร์ทางเลือกสำหรับภาษา C [ 132 ]ณ วันที่ 12 เมษายน 2014 เคอร์เนลอย่างเป็นทางการเกือบจะสามารถคอมไพล์ได้ด้วย Clang [ 133 ] [ 134 ]โครงการที่อุทิศให้กับความพยายามนี้มีชื่อว่าLLVMLinuxตาม โครงสร้างพื้นฐานของคอมไพเลอร์ LLVMซึ่งเป็นพื้นฐานในการสร้าง Clang [ 135 ] LLVMLinux ไม่ได้มุ่งหมายที่จะแยก Linux หรือ LLVM ออกมา ดังนั้นจึงเป็นโครงการเมตาที่ประกอบด้วยแพตช์ซึ่งจะถูกส่งไปยังโครงการต้นทางในที่สุด การทำให้ Linux สามารถคอมไพล์ได้ด้วย Clang นักพัฒนาอาจได้รับประโยชน์จากเวลาในการคอมไพล์ที่สั้นลง[ 136 ]

ในปี 2017 นักพัฒนาได้ทำการอัปสตรีมแพตช์เพื่อรองรับการสร้างเคอร์เนล Linux ด้วยClangในเวอร์ชัน 4.15 โดยได้ทำการ backportการสนับสนุนสำหรับX86-64และAArch64ไปยังสาขา 4.4, 4.9 และ 4.14 ของต้นไม้เคอร์เนลที่เสถียร Google Pixel 2 มาพร้อมกับ เคอร์เนลLinuxที่สร้าง ด้วย Clangเป็นครั้งแรก[ 137 ]แม้ว่าจะมีแพตช์สำหรับPixel (รุ่นที่ 1)อยู่แล้วก็ตาม[ 138 ]ในปี 2018 ChromeOSได้เปลี่ยนไปใช้การสร้างเคอร์เนลด้วยClangเป็นค่าเริ่มต้น[ 139 ]ในขณะที่Androidกำหนดให้Clang [ 140 ]และLLD ซึ่งเป็นลิงเกอร์ของLLVM [ 141 ]เป็นสิ่งจำเป็นสำหรับการสร้างเคอร์เนลในปี 2019 Googleได้เปลี่ยนเคอร์เนลที่ใช้ในการผลิตทั่วศูนย์ข้อมูลของตนไปเป็นการสร้างด้วยClangในปี 2020 [ 142 ]กลุ่มClangBuiltLinuxประสานงานการแก้ไขทั้งLinuxและLLVMเพื่อให้มั่นใจถึงความเข้ากันได้ โดยประกอบด้วยสมาชิกจากLLVMLinuxและมีแพตช์ที่ส่งมาจาก LLVMLinux

การดีบัก

เอาต์พุตของ Linux kernel panic

เช่นเดียวกับซอฟต์แวร์ใดๆ ปัญหาเกี่ยวกับเคอร์เนล Linux อาจแก้ไขได้ ยาก ความท้าทายทั่วไปเกี่ยวข้องกับการเข้าถึงพื้นที่ผู้ใช้เทียบกับพื้นที่เคอร์เนล การใช้พรีมิทีฟการซิงโครไนซ์ที่ไม่ถูกต้อง และการจัดการฮาร์ดแวร์ที่ไม่ถูกต้อง[ 16 ] : 364

ข้อผิด พลาด oopsเป็นข้อผิดพลาดที่ไม่ร้ายแรงในเคอร์เนล หลังจากเกิดข้อผิดพลาดดังกล่าว การดำเนินการจะดำเนินต่อไปโดยมีความน่าเชื่อถือที่น่าสงสัย[ 143 ]

การเกิด panic (ที่เกิดจากpanic() ) เป็นข้อผิดพลาดร้ายแรง หลังจากเกิดข้อผิดพลาดดังกล่าว เคอร์เนลจะพิมพ์ข้อความและหยุดการทำงานของคอมพิวเตอร์[ 16 ] : 371

เคอร์เนลจัดเตรียมการดีบักโดยการพิมพ์ผ่านprintk ()ซึ่งจัดเก็บข้อความในบัฟเฟอร์แบบวงกลม (เขียนทับรายการเก่าด้วยรายการใหม่) การเรียกใช้ระบบ syslog(2)จัดเตรียมการอ่านและล้างบัฟเฟอร์ข้อความและการตั้งค่าระดับบันทึก สูงสุด ของข้อความที่จะส่งไปยังคอนโซล[ 144 ]ข้อความเคอร์เนลยังถูกส่งออกไปยังพื้นที่ผู้ใช้ผ่านอินเทอร์เฟซ/dev/kmsg [ 145 ]

กลไกftraceช่วยให้สามารถดีบักโดยการติดตามได้ ใช้สำหรับตรวจสอบและดีบัก Linux ในขณะรันไทม์ และสามารถวิเคราะห์ความหน่วงของพื้นที่ผู้ใช้เนื่องจากการทำงานผิดปกติของเคอร์เนล[ 146 ] [ 147 ] [ 148 ] [ 149 ]นอกจากนี้ftraceยังช่วยให้ผู้ใช้สามารถติดตาม Linux ในขณะบูตได้[ 150 ]

kprobesและkretprobesสามารถแทรกเข้าไปในการทำงานของเคอร์เนล (เช่นเดียวกับดีบักเกอร์ในพื้นที่ผู้ใช้) และรวบรวมข้อมูลโดยไม่รบกวนการ ทำงาน [ 151 ] kprobesสามารถแทรกเข้าไปในโค้ดได้ที่ (เกือบ) ที่อยู่ใดก็ได้ ในขณะที่ kretprobes ทำงานที่ค่าส่งคืนของฟังก์ชันuprobesมีจุดประสงค์ที่คล้ายกัน แต่ก็มีความแตกต่างในการใช้งานและการดำเนินการอยู่บ้าง[ 152 ]

ด้วยKGDB Linux สามารถดีบักได้ในลักษณะเดียวกับโปรแกรมในพื้นที่ผู้ใช้ KGDB ต้องการเครื่องเพิ่มเติมที่รันGDBและเชื่อมต่อกับเป้าหมายที่จะดีบักโดยใช้สายอนุกรมหรืออีเธอร์เน็ต[ 153 ]

กระบวนการเปลี่ยนแปลง

โครงการเคอร์เนลลินุกซ์ทำการรวมโค้ดใหม่ ๆ อย่างต่อเนื่อง ขั้นตอนการทำงานมาตรฐานคือ ซอฟต์แวร์ที่ส่งเข้ามาในโครงการจะต้องใช้งานได้และคอมไพล์ได้โดยไม่มีข้อผิดพลาด

แต่ละระบบย่อยของเคอร์เนลจะมีผู้ดูแลที่รับผิดชอบในการตรวจสอบแพตช์ตามมาตรฐานโค้ดของเคอร์เนล และจัดเก็บคิวของแพตช์ที่สามารถส่งไปยัง Torvalds ได้ภายในช่วงเวลาการรวมโค้ด ซึ่งโดยปกติจะใช้เวลาหลายสัปดาห์

Torvalds จะรวมแพทช์เข้ากับซอร์สโค้ดของเคอร์เนล Linux เวอร์ชันเสถียรก่อนหน้า เพื่อสร้างเวอร์ชันผู้สมัครรับเลือกตั้ง (-rc) สำหรับเวอร์ชันเสถียรถัดไป เมื่อปิดหน้าต่างการรวมแล้ว จะยอมรับเฉพาะการแก้ไขโค้ดใหม่ในเวอร์ชันพัฒนาเท่านั้น เวอร์ชันพัฒนา -rc ของเคอร์เนลจะผ่านการทดสอบการถดถอยและเมื่อ Torvalds และผู้ดูแลระบบย่อยพิจารณาว่าเสถียรแล้ว เวอร์ชันใหม่จะถูกปล่อยออกมา และกระบวนการพัฒนาจะเริ่มต้นใหม่อีกครั้ง[ 154 ]

เมนไลน์ ลินุกซ์

โครงสร้าง Git ที่มีซอร์สโค้ดเคอร์เนล Linux เรียกว่าmainline Linuxการเผยแพร่เคอร์เนลเวอร์ชันเสถียรทุกครั้งมีต้นกำเนิดมาจากโครงสร้าง mainline [ 155 ]และมักจะเผยแพร่บนkernel.org mainline Linux มีการสนับสนุนที่แข็งแกร่งเฉพาะกับอุปกรณ์จำนวนน้อยที่ใช้ Linux เท่านั้น การสนับสนุนที่ไม่ใช่ mainline มาจากโครงการอิสระ เช่นYoctoหรือLinaroแต่ในหลายกรณีจำเป็นต้องใช้เคอร์เนลจากผู้ผลิตอุปกรณ์[ 156 ]การใช้เคอร์เนลของผู้ผลิตอาจต้องใช้แพ็คเกจสนับสนุนบอร์ด

การรักษาโครงสร้างเคอร์เนลนอกระบบ Linux หลักพิสูจน์แล้วว่าเป็นเรื่องยาก[ 157 ]

การรวมเข้าเป็นเคอร์เนลหลักหมายถึงความพยายามในการเพิ่มการสนับสนุนอุปกรณ์ลงในเคอร์เนลหลัก[ 158 ]ในขณะที่ก่อนหน้านี้มีการสนับสนุนเฉพาะในเวอร์ชันแยกหรือไม่มีการสนับสนุนเลย ซึ่งโดยปกติจะรวมถึงการเพิ่มไดรเวอร์หรือ ไฟล์ ทรีอุปกรณ์เมื่อเสร็จสิ้นแล้ว คุณสมบัติหรือการแก้ไขด้านความปลอดภัยจะถือว่าได้รับ การรวมเข้า เป็นเคอร์เนลหลักแล้ว[ 159 ]

เคอร์เนลที่คล้ายกับลินุกซ์

ผู้ดูแลสาขาเสถียรGreg Kroah-Hartmanได้นำคำว่าLinux-likeมาใช้กับเคอร์เนลที่แยกออกมา จากผู้จำหน่ายซึ่งเพิ่มโค้ดหลายล้านบรรทัดลงในเคอร์เนลหลัก [ 160 ]ในปี 2019 Googleระบุว่าต้องการใช้เคอร์เนล Linux หลักในAndroidเพื่อลดจำนวนเคอร์เนลที่แยก ออกมา [ 161 ]คำว่า Linux-like ยังถูกนำไปใช้กับEmbeddable Linux Kernel Subsetซึ่งไม่ได้รวมเคอร์เนล Linux หลักทั้งหมด แต่เป็นเพียงส่วนย่อยของโค้ดที่ได้รับการแก้ไขเล็กน้อย[ 162 ]

ลินุกซ์ฟอร์ก

iPod กำลังบูตiPodLinux

มีชุมชนบางแห่งที่พัฒนาเคอร์เนลโดยอิงจาก Linux อย่างเป็นทางการ โค้ดที่น่าสนใจบางส่วนจากfork เหล่านี้ ซึ่งรวมถึงLinux-libre , Compute Node Linux , INK , L4Linux , RTLinuxและUser-Mode Linux (UML) ได้ถูกรวมเข้ากับ mainline แล้ว[ 163 ]ระบบปฏิบัติการบางระบบที่พัฒนาขึ้นสำหรับโทรศัพท์มือถือในตอนแรกใช้ Linux เวอร์ชันที่ดัดแปลงอย่างมาก รวมถึง Google Android , Firefox OS , HP webOS , Nokia Maemoและ Jolla Sailfish OSในปี 2010 ชุมชน Linux ได้วิพากษ์วิจารณ์ Google ที่เริ่มต้นสร้าง kernel tree ของตนเองอย่างมีประสิทธิภาพ: [ 164 ] [ 165 ]

หมายความว่าไดรเวอร์ใดๆ ที่เขียนขึ้นสำหรับแพลตฟอร์มฮาร์ดแวร์ Android จะไม่สามารถรวมเข้ากับโครงสร้างเคอร์เนลหลักได้ เนื่องจากมีการพึ่งพาโค้ดที่อยู่ในโครงสร้างเคอร์เนลของ Google เท่านั้น ทำให้การสร้างในโครงสร้าง kernel.org ล้มเหลว ด้วยเหตุนี้ Google จึงได้ป้องกันไม่ให้ไดรเวอร์ฮาร์ดแวร์และโค้ดแพลตฟอร์มจำนวนมากรวมเข้ากับโครงสร้างเคอร์เนลหลัก ทำให้เกิดสาขาเคอร์เนลที่ผู้จำหน่ายหลายรายต้องพึ่งพา[ 166 ]

ปัจจุบัน Android ใช้ Linux เวอร์ชันที่ปรับแต่งเอง[ 167 ]ซึ่งมีการเปลี่ยนแปลงที่สำคัญในไดรเวอร์อุปกรณ์ แต่จำเป็นต้องมีการเปลี่ยนแปลงบางอย่างในโค้ดเคอร์เนลหลัก นักพัฒนา Android ยังส่งแพตช์ไปยัง Linux เวอร์ชันทางการเพื่อให้สามารถบูตระบบปฏิบัติการ Android ได้ในที่สุด ตัวอย่างเช่นNexus 7สามารถบูตและใช้งาน Linux เวอร์ชันหลักได้[ 167 ]

ในการนำเสนอที่พิพิธภัณฑ์ประวัติศาสตร์คอมพิวเตอร์ ในปี 2001 ทอร์วัลด์ได้กล่าวไว้ดังนี้เพื่อตอบคำถามเกี่ยวกับการแจกจ่ายลินุกซ์ว่าใช้ซอร์สโค้ดเคอร์เนลเดียวกันหรือไม่:

พวกเขาไม่ใช่... อืม ก็ใช่ และก็ไม่ใช่ ไม่มีเคอร์เนลเดียว ทุกดิสทริบิวชันต่างก็มีการเปลี่ยนแปลงของตัวเอง เรื่องนี้เกิดขึ้นมาตั้งแต่แรกเริ่มเลย ผมไม่รู้ว่าคุณจำได้ไหมว่าYggdrasilขึ้นชื่อเรื่องการเปลี่ยนแปลงเคอร์เนลอย่างมาก และแม้กระทั่งทุกวันนี้ ผู้จำหน่ายรายใหญ่ทุกรายก็ยังมีการปรับแต่งของตัวเอง เพราะพวกเขามีส่วนแบ่งการตลาดที่สนใจ และพูดตามตรง นั่นแหละคือสิ่งที่ควรจะเป็น เพราะถ้าทุกคนคาดหวังให้คนๆ เดียวอย่างผม สามารถติดตามทุกอย่างได้ นั่นไม่ใช่จุดประสงค์ของ GPL นั่นไม่ใช่จุดประสงค์ของการมีระบบเปิด ดังนั้นจริงๆ แล้ว การที่ดิสทริบิวชันตัดสินใจว่าบางสิ่งสำคัญมากสำหรับพวกเขา จนถึงขั้นเพิ่มแพตช์เข้าไป แม้ว่ามันจะไม่ได้อยู่ในเคอร์เนลมาตรฐานก็ตาม นั่นเป็นสัญญาณที่ดีสำหรับผม ตัวอย่างเช่นReiserFSถูกเพิ่มเข้ามา และเหตุผลที่ ReiserFS เป็นระบบไฟล์แบบ journaling ตัวแรกที่ถูกรวมเข้ากับเคอร์เนลมาตรฐาน ไม่ใช่เพราะผมชื่นชอบHans Reiser เป็นเพราะSUSEเริ่มจัดส่งโดยใช้ ReiserFS เป็นเคอร์เนลมาตรฐาน ซึ่งทำให้ฉันคิดว่า "โอเค" นี่เป็นการใช้งานจริง คนทั่วไปก็ทำแบบนี้ พวกเขาต้องรู้บางอย่างที่ฉันไม่รู้ ดังนั้นในแง่ความเป็นจริง สิ่งที่บริษัทจัดจำหน่ายหลายแห่งทำ พวกเขาก็เป็นส่วนหนึ่งของ "มาสร้างสาขาของเราเอง" และ "มาทำการเปลี่ยนแปลงของเราเอง" และเนื่องจาก GPL ฉันจึงสามารถนำส่วนที่ดีที่สุดของพวกเขามาใช้ได้[ 168 ]

การสนับสนุนระยะยาว

ข้อความบูตของเคอร์เนล Linux เวอร์ชัน 2.6.25.17

เวอร์ชันล่าสุดและเวอร์ชันเก่าได้รับการดูแลแยกกัน การเผยแพร่เคอร์เนลล่าสุดส่วนใหญ่ได้รับการดูแลโดย Torvalds [ 169 ]

ชุมชนนักพัฒนาเคอร์เนล Linux รักษาเคอร์เนลให้เสถียรโดยการแก้ไขข้อบกพร่องของซอฟต์แวร์ที่ค้นพบระหว่างการพัฒนาเคอร์เนลเวอร์ชันเสถียรถัดไป ดังนั้น www.kernel.org จึงแสดงเคอร์เนลเวอร์ชันเสถียรสองเวอร์ชันเสมอ โดยเคอร์เนล Linux เวอร์ชันเสถียรถัดไปจะถูกปล่อยออกมาประมาณ 8 ถึง 12 สัปดาห์ต่อมา

บางเวอร์ชันได้รับการกำหนดให้รองรับในระยะยาวโดยมีการแก้ไขข้อบกพร่องเป็นระยะเวลา สองปีขึ้นไป [ 170 ]

ขนาด

บางโครงการได้พยายามลดขนาดของเคอร์เนล Linux หนึ่งในนั้นคือTinyLinuxในปี 2014 Josh Triplett ได้เริ่มสร้างซอร์สโค้ด -tiny สำหรับเวอร์ชันที่มีขนาดเล็กลง[ 171 ] [ 172 ] [ 173 ] [ 174 ]

สถาปัตยกรรมและลักษณะเด่น

แผนผังของเคอร์เนลลินุกซ์
แผนภาพ Sankeyแสดงจำนวนบรรทัดโค้ดต้นฉบับของเคอร์เนลลินุกซ์

แม้จะดูเหมือนขัดแย้งกัน แต่เคอร์เนลของลินุกซ์นั้นมีทั้งความเป็นเอกภาพและความเป็นโมดูลาร์ เคอร์เนลถูกจัดประเภทเป็นเคอร์เนลแบบเอกภาพในเชิงสถาปัตยกรรม เนื่องจากระบบปฏิบัติการทั้งหมดทำงานในพื้นที่เคอร์เนล การออกแบบเป็นแบบโมดูลาร์ เนื่องจากสามารถประกอบขึ้นจากโมดูลที่ในบางกรณีจะถูกโหลดและยกเลิกการโหลดในระหว่างการทำงาน[ 16 ] : 338 [ 175 ]รองรับคุณสมบัติที่เคยมีเฉพาะในเคอร์เนลแบบปิดแหล่งที่มาของระบบปฏิบัติการที่ไม่ใช่แบบเสรีเท่านั้น

ส่วนที่เหลือของบทความนี้ใช้รูปแบบการอ้างอิงหน้าคู่มือ ของระบบปฏิบัติการ UNIX และระบบปฏิบัติการที่คล้าย Unix ตัวเลขที่ตามหลังชื่อคำสั่ง อินเทอร์เฟซ หรือคุณสมบัติอื่นๆ จะระบุส่วน (เช่น ประเภทของส่วนประกอบหรือคุณสมบัติของระบบปฏิบัติการ) ที่คำสั่งนั้นสังกัดอยู่ ตัวอย่างเช่นexecve(2)หมายถึงการเรียกใช้ระบบ และexec(3)หมายถึงตัวห่อไลบรารีในพื้นที่ผู้ใช้

ต่อไปนี้เป็นภาพรวมของการออกแบบทางสถาปัตยกรรมและคุณลักษณะที่น่าสนใจ

ไดรเวอร์อุปกรณ์ และส่วนขยายเคอร์เนล ส่วนใหญ่ทำงานในพื้นที่เคอร์เนล ( ring 0ในสถาปัตยกรรมCPU หลายแบบ ) โดยสามารถเข้าถึงฮาร์ดแวร์ได้อย่างเต็มที่ ข้อยกเว้นบางประการทำงานในพื้นที่ผู้ใช้ตัวอย่างที่น่าสนใจคือระบบไฟล์ที่ใช้FUSE /CUSE และบางส่วนของ UIO [ 199 ] [ 200 ]นอกจากนี้ระบบ X Window SystemและWaylandซึ่งเป็นระบบหน้าต่างและโปรโตคอลเซิร์ฟเวอร์แสดงผลที่คนส่วนใหญ่ใช้กับ Linux ไม่ได้ทำงานภายในเคอร์เนล ในทางกลับกัน การเชื่อมต่อกับGPUของการ์ดกราฟิกเป็นระบบย่อยในเคอร์เนลที่เรียกว่าDirect Rendering Manager (DRM)

แตกต่างจากเคอร์เนลแบบโมโนลิธิกมาตรฐาน ไดรเวอร์อุปกรณ์สามารถกำหนดค่าเป็นโมดูล ได้ง่าย และโหลดหรือยกเลิกการโหลดในขณะที่ระบบกำลังทำงานอยู่ และยังสามารถถูกขัดจังหวะได้ภายใต้เงื่อนไขบางประการ เพื่อจัดการกับการขัดจังหวะของฮาร์ดแวร์อย่างถูกต้อง และเพื่อรองรับการประมวลผลแบบสมมาตรได้ ดียิ่งขึ้น [ 182 ]โดยเจตนาแล้ว Linux ไม่มีอินเทอร์เฟซไบนารีแอปพลิเคชันไดรเวอร์ อุปกรณ์ที่เสถียร [ 201 ]

โดยทั่วไป Linux จะใช้การป้องกันหน่วยความจำและหน่วยความจำเสมือนและยังสามารถจัดการการเข้าถึงหน่วยความจำที่ไม่สม่ำเสมอได้ [ 202 ]โครงการนี้ได้รวมμClinuxซึ่งทำให้สามารถรัน Linux บนไมโครคอนโทรลเลอร์ โดยไม่ต้องใช้หน่วย ความจำเสมือนได้[ 203 ]

ฮาร์ดแวร์แสดงอยู่ในลำดับชั้นของไฟล์ แอปพลิเคชันของผู้ใช้โต้ตอบกับไดรเวอร์อุปกรณ์ผ่านรายการในไดเร็กทอรี/devหรือ/sys [ 204 ]ข้อมูลกระบวนการจะถูกแมปไปยังไดเร็กทอรี/proc [ 204 ]

ชั้นต่างๆ ภายในระบบลินุกซ์ แสดงให้เห็นถึงการแบ่งแยกระหว่างพื้นที่ผู้ใช้และพื้นที่เคอร์เนล ด้วย
โหมดผู้ใช้ แอปพลิเคชันของผู้ใช้bash , LibreOffice , GIMP , Blender , 0 AD , Mozilla Firefox , ...
ส่วนประกอบของระบบเริ่มต้น daemon : OpenRC , runit , systemd , ...โปรแกรมบริการระบบ : polkitd , smbd , sshd , udevd , ...ระบบจัดการหน้าต่าง : X11 , Wayland , SurfaceFlinger (Android)กราฟิก : Mesa , AMD Software , ...ไลบรารีอื่นๆ: GTK , Qt , EFL , SDL , SFML , FLTK , GNUstep , ...
ไลบรารีมาตรฐาน Cfopenexecv... ( มากถึง 2000 ซับรูทีน ) glibc มีเป้าหมายที่จะทำงานเร็วmuslมีเป้าหมายที่จะมีขนาดเล็กuClibcมุ่งเป้าไปที่ระบบฝังตัว bionicถูกเขียนขึ้นสำหรับAndroidเป็นต้น ทั้งหมดนี้มีเป้าหมายที่จะmallocเข้ากันได้กับ POSIX / SUSmemcpylocaltimepthread_create
โหมดเคอร์เนล เคอร์เนลลินุกซ์stat, splice, dup, read, open, ioctl, write, mmap, close, exit, ฯลฯ (ประมาณ 380 การเรียกใช้ระบบ) อินเทอร์เฟซการเรียกใช้ระบบ (SCI) ของเคอร์เนล Linux มีเป้าหมายที่จะเข้ากันได้ กับ POSIX / SUS [ 205 ]
ระบบย่อย การจัดตารางเวลาของกระบวนการระบบย่อย IPCระบบย่อย การจัดการหน่วยความจำระบบย่อย ไฟล์เสมือนระบบย่อยเครือข่าย
ส่วนประกอบอื่นๆ: ALSA , DRI , evdev , klibc , LVM , device mapper , Linux Network Scheduler , Netfilter โมดูลความปลอดภัยของ Linux : SELinux , TOMOYO , AppArmor , Smack
ฮาร์ดแวร์ ( ซีพียูหน่วยความจำหลักอุปกรณ์จัดเก็บข้อมูลฯลฯ)

อินเทอร์เฟซ

มีการแบ่งอินเทอร์เฟซออกเป็นสี่ส่วน ได้แก่ สองส่วนภายในเคอร์เนล และอีกสองส่วนระหว่างเคอร์เนลกับพื้นที่ผู้ใช้

ลินุกซ์เริ่มต้นจากการเป็นโคลนของยูนิกซ์ และมุ่งไปสู่การปฏิบัติตาม มาตรฐาน POSIXและSingle UNIX Specification [ 206 ]เคอร์เนลมีระบบเรียกใช้งานและอินเทอร์เฟซอื่นๆ ที่เฉพาะเจาะจงสำหรับลินุกซ์ เพื่อที่จะรวมอยู่ในเคอร์เนลอย่างเป็นทางการ โค้ดจะต้องเป็นไปตามกฎการอนุญาตใช้งานชุดหนึ่ง[ 10 ] [ 15 ]

อินเทอร์เฟซไบนารีแอปพลิเคชัน Linux (ABI) ระหว่างเคอร์เนลและพื้นที่ผู้ใช้มีระดับความเสถียรสี่ระดับ (เสถียร ทดสอบ ล้าสมัย ลบออก) [ 207 ] คาดว่า การเรียกใช้ระบบจะไม่เปลี่ยนแปลงเพื่อรักษาความเข้ากันได้สำหรับ โปรแกรม พื้นที่ผู้ใช้ที่พึ่งพาการเรียกใช้ระบบเหล่านั้น[ 208 ]

โมดูลเคอร์เนลที่โหลดได้ (LKM) ตามการออกแบบไม่สามารถพึ่งพา ABI ที่เสถียรได้[ 201 ]ดังนั้นจึงต้องคอมไพล์ใหม่ทุกครั้งที่มีการติดตั้งไฟล์ปฏิบัติการเคอร์เนลใหม่ในระบบ มิฉะนั้นจะไม่สามารถโหลดได้ ไดรเวอร์ในโครงสร้างที่กำหนดค่าให้เป็นส่วนหนึ่งของไฟล์ปฏิบัติการเคอร์เนล ( vmlinux ) จะถูกเชื่อมโยงแบบคงที่โดยกระบวนการสร้าง

ไม่มีการรับประกันความเสถียรของ API ภายในเคอร์เนลระดับซอร์สโค้ด[ 201 ]และด้วยเหตุนี้ โค้ด ไดรเวอร์อุปกรณ์รวมถึงโค้ดของระบบย่อยเคอร์เนลอื่นๆ จะต้องได้รับการอัปเดตให้สอดคล้องกับการพัฒนาเคอร์เนล นักพัฒนาซอฟต์แวร์ใดๆ ที่ทำการเปลี่ยนแปลง API จะต้องแก้ไขโค้ดใดๆ ที่เสียหายอันเป็นผลมาจากการเปลี่ยนแปลงของตน[ 209 ]

API จากเคอร์เนลไปยังพื้นที่ผู้ใช้

ชุดของAPI เคอร์เนล Linuxที่เกี่ยวข้องกับอินเทอร์เฟซที่เปิดเผยให้กับแอปพลิเคชันของผู้ใช้นั้นประกอบด้วยการเรียกใช้ระบบ เฉพาะของ UNIX และ Linux เป็น หลัก [ 210 ]การเรียกใช้ระบบเป็นจุดเริ่มต้นในเคอร์เนล Linux [ 211 ]ตัวอย่างเช่น ในบรรดาการเรียกใช้ระบบเฉพาะของ Linux นั้น มีตระกูลของการเรียกใช้ระบบclone(2) [ 212 ]ส่วนขยายส่วนใหญ่จะต้องเปิดใช้งานโดยการกำหนดมาโครในไฟล์ส่วนหัวหรือเมื่อโค้ดของผู้ใช้กำลังถูกคอมไพล์[ 213 ]_GNU_SOURCE

การเรียกใช้ระบบสามารถทำได้ผ่านคำสั่งแอสเซมบลีที่ช่วยให้การเปลี่ยนจากพื้นที่ผู้ใช้ที่ไม่ได้รับสิทธิ์ไปสู่พื้นที่เคอร์เนลที่มีสิทธิ์ในวงแหวน 0เป็นไปได้ ด้วยเหตุนี้ไลบรารีมาตรฐาน C (libC) จึงทำหน้าที่เป็นตัวห่อหุ้มการเรียกใช้ระบบ Linux ส่วนใหญ่ โดยการเปิดเผยฟังก์ชัน C ที่หากจำเป็น[ 214 ]จะเข้าสู่เคอร์เนลอย่างโปร่งใส ซึ่งจะดำเนินการในนามของกระบวนการที่เรียกใช้[ 210 ]สำหรับการเรียกใช้ระบบที่ libC ไม่ได้เปิดเผย เช่นmutex ในพื้นที่ผู้ใช้ที่รวดเร็ว [ 215 ]ไลบรารีมีฟังก์ชันที่เรียกว่าsyscall(2)ซึ่งสามารถใช้เพื่อเรียกใช้การเรียกใช้ระบบเหล่านั้นอย่างชัดเจน[ 216 ]

ระบบไฟล์เสมือน (เช่น ระบบไฟล์ sysfsและprocfs ) และไฟล์พิเศษ (เช่น , /dev/random, /dev/sda, /dev/ttyและอื่นๆ อีกมากมาย) ประกอบเป็นชั้นอินเทอร์เฟซอีกชั้นหนึ่งสำหรับโครงสร้างข้อมูลเคอร์เนลที่แสดงถึงอุปกรณ์ฮาร์ดแวร์หรืออุปกรณ์เชิงตรรกะ (ซอฟต์แวร์) [ 217 ] [ 218 ]

ABI จากเคอร์เนลไปยังพื้นที่ผู้ใช้

เนื่องจากความแตกต่างที่มีอยู่ระหว่างการใช้งานระบบปฏิบัติการลินุกซ์หลายร้อยแบบ ไฟล์ปฏิบัติการถึงแม้ว่าจะถูกคอมไพล์ แอสเซมบลี และลิงก์มาเพื่อทำงานบนสถาปัตยกรรมฮาร์ดแวร์เฉพาะ (กล่าวคือ ใช้ชุดคำสั่งของฮาร์ดแวร์เป้าหมาย) ก็มักจะไม่สามารถทำงานบนลินุกซ์เวอร์ชันต่างๆ ได้ ปัญหานี้ส่วนใหญ่เกิดจากการกำหนดค่าเฉพาะของแต่ละเวอร์ชันและแพตช์ที่ใช้กับโค้ดของเคอร์เนลลินุกซ์ ความแตกต่างในไลบรารีระบบ บริการ (เดมอน) ลำดับชั้นของระบบไฟล์ และตัวแปรสภาพแวดล้อม

มาตรฐานหลักเกี่ยวกับความเข้ากันได้ของแอปพลิเคชันและไบนารีของระบบปฏิบัติการลินุกซ์คือLinux Standard Base (LSB) [ 219 ] [ 220 ] LSB ครอบคลุมมากกว่าสิ่งที่เกี่ยวข้องกับเคอร์เนลลินุกซ์ เพราะยังกำหนดข้อกำหนดเดสก์ท็อป ไลบรารี X และ Qt ซึ่งแทบไม่มีส่วนเกี่ยวข้องกับเคอร์เนลเลย[ 221 ] LSB เวอร์ชัน 5 สร้างขึ้นจากมาตรฐานและร่างหลายฉบับ (POSIX, SUS, X/Open, File System Hierarchy (FHS) และอื่นๆ) [ 222 ]

ส่วนต่างๆ ของ LSB ที่เกี่ยวข้องกับเคอร์เนลมากกว่าคือGeneral ABI (gABI) [ 223 ]โดยเฉพาะอย่างยิ่งSystem V ABI [ 224 ] [ 225 ]และExecutable and Linking Format (ELF) [ 226 ] [ 227 ]และProcessor Specific ABI (psABI) เช่นCore Specification สำหรับ X86-64 [ 228 ] [ 229 ]

มาตรฐาน ABI สำหรับวิธีที่โปรแกรมผู้ใช้ x86_64 เรียกใช้การเรียกของระบบคือการโหลดหมายเลขการเรียกของระบบลงในรีจิสเตอร์ rax และพารามิเตอร์อื่นๆ ลงในrdi , rsi , rdx , r10 , r8และr9และสุดท้ายคือการใส่ คำสั่งแอสเซมบลีของ การเรียกของระบบลงในโค้ด[ 230 ] [ 231 ] [ 232 ]

API ภายในเคอร์เนล

ในงาน XDC2014 Alex Deucher จาก AMD ได้ประกาศไดรเวอร์โหมดเคอร์เนลแบบรวม[ 233 ]ไดรเวอร์กราฟิก Linux ที่เป็นกรรมสิทธิ์libGL-fglrx-glx จะใช้โครงสร้างพื้นฐาน DRMเดียวกันกับMesa 3Dเนื่องจากไม่มีABI ในเคอร์เนลที่เสถียร AMD จึงต้องปรับเปลี่ยนไบนารีบล็อบ เดิม ที่ใช้โดย Catalyst อย่างต่อเนื่อง

มี API ภายในเคอร์เนลหลายตัวระหว่างระบบย่อยของเคอร์เนล บางตัวมีให้ใช้งานเฉพาะภายในระบบย่อยของเคอร์เนลเท่านั้น ในขณะที่ชุดสัญลักษณ์ภายในเคอร์เนลที่ค่อนข้างจำกัด (เช่น ตัวแปร โครงสร้างข้อมูล และฟังก์ชัน) จะถูกเปิดเผยให้กับโมดูลที่โหลดได้แบบไดนามิก (เช่น ไดรเวอร์อุปกรณ์ที่โหลดตามความต้องการ) ไม่ว่าจะส่งออกด้วยมาโครEXPORT_SYMBOL()และEXPORT_SYMBOL_GPL() หรือไม่ก็ตาม [ 234 ] [ 235 ] (มาโครหลังนี้สงวนไว้สำหรับโมดูลที่เผยแพร่ภายใต้ใบอนุญาตที่เข้ากันได้กับ GPL) [ 236 ]

ลินุกซ์มี API ในเคอร์เนลที่จัดการโครงสร้างข้อมูล (เช่นรายการเชื่อมโยงต้นไม้ฐานราก [ 237 ] ต้นไม้แดงดำ [ 238 ]คิว ) หรือดำเนินการรูทีนทั่วไป (เช่น คัดลอกข้อมูลจากและไปยังพื้นที่ผู้ใช้ จัดสรรหน่วยความ จำ พิมพ์บรรทัดไปยังบันทึกระบบ และอื่นๆ) ซึ่งยังคงเสถียรอย่างน้อยตั้งแต่ลินุกซ์เวอร์ชัน 2.6 [ 239 ] [ 240 ] [ 241 ]

API ภายในเคอร์เนลประกอบด้วยไลบรารีของบริการทั่วไประดับต่ำที่ใช้โดยไดรเวอร์อุปกรณ์:

ABI ภายในเคอร์เนล

นักพัฒนา Linux เลือกที่จะไม่รักษา ABI ในเคอร์เนลให้มีเสถียรภาพ โมดูลที่คอมไพล์สำหรับเคอร์เนลเวอร์ชันเฉพาะจะไม่สามารถโหลดลงในเวอร์ชันอื่นได้โดยไม่ต้องคอมไพล์ใหม่[ 201 ]

การจัดการกระบวนการ

ลินุกซ์ เช่นเดียวกับเคอร์เนล อื่นๆ มีความสามารถในการจัดการกระบวนการต่างๆ รวมถึงการสร้าง การระงับ การดำเนินการต่อ และการยุติกระบวนการ แต่ต่างจากระบบปฏิบัติการอื่นๆ เคอร์เนลลินุกซ์ใช้กระบวนการเป็นกลุ่มของเธรดที่เรียกว่างาน (task) หากงานสองงานมีTGID เดียวกัน ในศัพท์ของเคอร์เนลจะเรียกว่ากลุ่มงาน (task group) แต่ละงานจะถูกแทนด้วยโครงสร้างข้อมูลtask_structเมื่อสร้างกระบวนการขึ้น จะได้รับตัวระบุที่ไม่ซ้ำกันทั่วโลกที่เรียกว่าPIDและไม่สามารถใช้ร่วมกันได้[ 251 ] [ 252 ]

กระบวนการใหม่สามารถสร้างขึ้นได้โดยการเรียกใช้ตระกูลการเรียกใช้ระบบclone [ 253 ] หรือ การเรียกใช้ระบบforkกระบวนการสามารถถูกระงับและดำเนินการต่อโดยเคอร์เนลโดยการส่งสัญญาณเช่นSIGSTOPและSIGCONTกระบวนการสามารถยุติตัวเองได้โดยการเรียกใช้ ระบบ exitหรือถูกยุติโดยกระบวนการอื่นโดยการส่งสัญญาณเช่น SIGKILL , SIGABRTหรือSIGINT

หากไฟล์ปฏิบัติการเชื่อมโยงแบบไดนามิกกับไลบรารีที่ใช้ร่วมกัน จะใช้ ตัวเชื่อมโยงแบบไดนามิกเพื่อค้นหาและโหลดวัตถุที่จำเป็น เตรียมโปรแกรมให้พร้อมสำหรับการทำงาน แล้วจึงเรียกใช้โปรแกรม[ 254 ]

ไลบรารีเธรด POSIX ดั้งเดิม (NPTL) [ 255 ]ให้ส่วนต่อประสานเธรดมาตรฐาน POSIX ( pthreads ) แก่พื้นที่ผู้ใช้ เคอร์เนลไม่รับรู้ถึงกระบวนการหรือเธรด แต่รับรู้ถึงงานดังนั้นเธรดจึงถูกนำไปใช้ในพื้นที่ผู้ใช้ เธรดใน Linux ถูกนำไปใช้เป็นงานที่ใช้ทรัพยากรร่วมกัน ในขณะที่หากไม่ใช้ทรัพยากรร่วมกันจะเรียกว่าเป็นกระบวนการอิสระ

เคอร์เนลจัดเตรียม กลไก futex(7) (mutex พื้นที่ผู้ใช้ที่รวดเร็ว) สำหรับการล็อกและการซิงโครไนซ์ในพื้นที่ผู้ใช้[ 256 ]การดำเนินการส่วนใหญ่จะดำเนินการในพื้นที่ผู้ใช้ แต่อาจจำเป็นต้องสื่อสารกับเคอร์เนลโดยใช้การเรียกระบบfutex(2) [ 215 ]

ตรงข้ามกับเธรดในพื้นที่ผู้ใช้ที่อธิบายไว้ข้างต้นเธรดเคอร์เนลทำงานในพื้นที่เคอร์เนล[ 257 ]เธรดเหล่านี้เป็นเธรดที่สร้างขึ้นโดยเคอร์เนลเองสำหรับงานเฉพาะ เธรดเหล่านี้มีสิทธิพิเศษเช่นเดียวกับเคอร์เนลและไม่ได้ผูกติดกับกระบวนการหรือแอปพลิเคชันใดๆ

การจัดตารางเวลา

ตัวกำหนดตารางเวลาของกระบวนการ Linux เป็นแบบโมดูลาร์ ในแง่ที่ว่าช่วยให้สามารถใช้คลาสและนโยบายการกำหนดตารางเวลาที่แตกต่างกันได้[ 258 ] [ 259 ]คลาสตัวกำหนดตารางเวลาเป็นอัลกอริทึมการกำหนดตารางเวลาแบบเสียบปลั๊กได้ ซึ่งสามารถลงทะเบียนกับโค้ดตัวกำหนดตารางเวลาพื้นฐานได้ แต่ละคลาสจะกำหนดตารางเวลาให้กับกระบวนการประเภทต่างๆ โค้ดหลักของตัวกำหนดตารางเวลาจะวนซ้ำแต่ละคลาสตามลำดับความสำคัญ และเลือกตัวกำหนดตารางเวลาที่มีลำดับความสำคัญสูงสุดที่มีเอนทิตีที่สามารถกำหนดตารางเวลาได้ประเภท struct sched_entity พร้อมที่จะทำงาน[ 16 ] : 46–47 เอนทิตีอาจเป็นเธรด กลุ่มของเธรด หรือแม้แต่กระบวนการทั้งหมดของผู้ใช้เฉพาะราย

ลินุกซ์มีทั้งการแย่งชิงการทำงานของผู้ใช้และการแย่งชิงการทำงานของเคอร์เนลแบบเต็มรูปแบบ (เลือกได้ สูงสุด) [ 260 ] [ 261 ] [ 16 ] : 62–63 การแย่ง ชิงการทำงานช่วยลดความหน่วงเพิ่มการตอบสนอง[ 262 ]และทำให้ลินุกซ์เหมาะสมยิ่งขึ้นสำหรับแอปพลิเคชันเดสก์ท็อปและ แอปพลิเคชัน แบบเรียลไทม์อย่างไรก็ตาม การทำงานที่ถูกขัดจังหวะจะทำให้พฤติกรรมของแคชแย่ลง[ 261 ]

สำหรับงานปกติ โดยค่าเริ่มต้น เคอร์เนลจะใช้ คลาส Completely Fair Scheduler (CFS) ซึ่งแนะนำในเวอร์ชัน 2.6.23 [ 184 ]ตัวกำหนดตารางเวลาถูกกำหนดเป็นมาโครในส่วนหัว C เป็นSCHED_NORMAL. ในเคอร์เนล POSIX อื่นๆ นโยบายที่คล้ายกันที่เรียกว่าSCHED_OTHERจะจัดสรรไทม์สไลซ์ของ CPU (กล่าวคือ จะกำหนดไทม์สไลซ์สัมบูรณ์ของเวลาประมวลผลโดยขึ้นอยู่กับลำดับความสำคัญที่กำหนดไว้ล่วงหน้าหรือคำนวณแบบไดนามิกของแต่ละกระบวนการ) CFS ของ Linux จะยกเลิกไทม์สไลซ์สัมบูรณ์และจัดสรรสัดส่วนที่ยุติธรรมของเวลา CPU โดยเป็นฟังก์ชันของพารามิเตอร์ เช่น จำนวนกระบวนการที่ทำงานได้ทั้งหมดและเวลาที่กระบวนการเหล่านั้นทำงานไปแล้ว ฟังก์ชันนี้ยังคำนึงถึงน้ำหนักชนิดหนึ่งที่ขึ้นอยู่กับลำดับความสำคัญสัมพัทธ์ (ค่า nice) ของกระบวนการเหล่านั้นด้วย[ 16 ] : 46–50

ด้วยการแย่งชิงโดยผู้ใช้ ตัวกำหนดตารางเวลาของเคอร์เนลสามารถแทนที่กระบวนการปัจจุบันด้วยการดำเนินการสลับบริบทไปยังกระบวนการอื่น ซึ่งจะได้รับทรัพยากรการคำนวณสำหรับการทำงาน (CPU หน่วยความจำ และอื่นๆ) โดยจะดำเนินการตามอัลกอริทึม CFS (โดยเฉพาะอย่างยิ่ง จะใช้ตัวแปรที่เรียกว่าvruntimeสำหรับการเรียงลำดับเอนทิตี จากนั้นเลือกเอนทิตีที่มี vruntime น้อยกว่า นั่นคือ เอนทิตีที่สามารถกำหนดตารางเวลาได้ซึ่งมีส่วนแบ่งเวลา CPU น้อยที่สุด) ตามนโยบายตัวกำหนดตารางเวลาที่ใช้งานอยู่และตามลำดับความสำคัญสัมพัทธ์[ 263 ]ด้วยการแย่งชิงโดยเคอร์เนล เคอร์เนลสามารถแย่งชิงตัวเองได้เมื่อตัวจัดการการขัดจังหวะส่งคืน เมื่อภารกิจของเคอร์เนลถูกบล็อก และเมื่อใดก็ตามที่ระบบย่อยเรียกใช้ฟังก์ชัน schedule() อย่างชัดเจน

เคอร์เนลยังประกอบด้วยคลาสการจัดกำหนดการแบบเรียลไทม์ ที่สอดคล้องกับ POSIX [ 264 ]SCHED_FIFO สองคลาส ได้แก่ (เรียล ไทม์ แบบเข้าก่อนออกก่อน ) และSCHED_RR( เรียลไทม์แบบวนรอบ ) ซึ่งทั้งสองคลาสนี้มีความสำคัญเหนือกว่าคลาสเริ่มต้น[ 258 ]นโยบายการจัดกำหนดการเพิ่มเติมที่เรียกว่า ซึ่งSCHED DEADLINEใช้ขั้นตอนวิธีกำหนดเวลาที่เร็วที่สุดก่อน (EDF) ได้ถูกเพิ่มเข้ามาในเคอร์เนลเวอร์ชัน 3.14 ซึ่งเผยแพร่เมื่อวันที่ 30 มีนาคม 2014 [ 265 ] [ 266 ]SCHED_DEADLINEซึ่งมีความสำคัญเหนือกว่าคลาสการจัดกำหนดการอื่นๆ ทั้งหมด

แพตช์ แบบเรียลไทม์PREEMPT_RTที่รวมอยู่ใน Linux หลักตั้งแต่เวอร์ชัน 2.6 ให้ตัวกำหนดเวลาแบบกำหนดได้การลบการแย่งชิงและการปิดใช้งานการขัดจังหวะ (เท่าที่ทำได้) PI Mutexes (เช่น กลไกการล็อกที่หลีกเลี่ยงการกลับลำดับความสำคัญ) [ 267 ] [ 268 ]การสนับสนุนตัวจับเวลาเหตุการณ์ความแม่นยำสูง (HPET) การอ่าน-คัดลอก-อัปเดตแบบ แย่งชิง (RCU) เธรด IRQ (บังคับ) และคุณสมบัติย่อยอื่นๆ[ 269 ] [ 270 ] [ 271 ]

ในปี 2023 Peter Zijlstra เสนอให้เปลี่ยน CFS ด้วย ตัวจัดตาราง เวลาแบบกำหนดเวลาเสมือนที่มีสิทธิ์เร็วที่สุดก่อน (EEVDF) [ 272 ] [ 273 ]เพื่อป้องกันความจำเป็นในการใช้แพตช์ "latency nice" ของ CFS [ 274 ]ตัวจัดตารางเวลา EEVDF ได้เข้ามาแทนที่ CFS ในเวอร์ชัน 6.6 ของเคอร์เนล Linux [ 183 ]

การซิงโครไนซ์

เคอร์เนลมีสาเหตุที่แตกต่างกันของการทำงานพร้อมกัน (เช่น การขัดจังหวะ ส่วนล่าง การแทรกแซงงานของเคอร์เนลและผู้ใช้ การประมวลผลแบบหลายกระบวนการสมมาตร) [ 16 ] : 167

เพื่อปกป้องพื้นที่สำคัญ (ส่วนของโค้ดที่ต้องดำเนินการแบบอะตอมิก) ตำแหน่งหน่วยความจำที่ใช้ร่วมกัน (เช่นตัวแปรส่วนกลางและโครงสร้างข้อมูลอื่นๆ ที่มีขอบเขตส่วนกลาง) และพื้นที่หน่วยความจำที่สามารถแก้ไขได้แบบอะซิงโครนัสโดยฮาร์ดแวร์ (เช่น มีตัวกำหนดประเภทvolatile ในภาษา C ) Linux มีเครื่องมือมากมาย เครื่องมือเหล่านี้ประกอบด้วยประเภทอะตอมิก (ซึ่งสามารถจัดการได้โดยตัวดำเนินการเฉพาะบางชุดเท่านั้น) สปิ นล็อกเซมาฟอร์ มิ วเท็กซ์[ 275 ] [ 16 ] : 176–198 [ 276 ]และอัลกอริทึมแบบไม่มีล็อก (เช่นRCU ) [ 277 ] [ 278 ] [ 279 ]อัลกอริทึมแบบไม่มีล็อกส่วนใหญ่สร้างขึ้นบนตัวกั้นหน่วยความจำเพื่อบังคับใช้ลำดับของหน่วยความจำและป้องกันผลข้างเคียงที่ไม่พึงประสงค์เนื่องจากการเพิ่มประสิทธิภาพของคอมไพเลอร์[ 280 ] [ 281 ] [ 282 ] [ 283 ]

โค้ด PREEMPT_RT ที่รวมอยู่ใน Linux หลักจะให้ RT-mutexซึ่งเป็น Mutex ชนิดพิเศษที่ไม่ปิดใช้งานการแย่งชิงและรองรับการสืบทอดลำดับความสำคัญ [ 284 ] [ 285 ]ล็อกเกือบทั้งหมดจะเปลี่ยนเป็นล็อกแบบพักเมื่อใช้การกำหนดค่าสำหรับการทำงานแบบเรียลไทม์ [ 286 ] [ 271 ] [ 285 ]การสืบทอดลำดับความสำคัญ จะ หลีกเลี่ยงการกลับลำดับความสำคัญโดยการให้งานที่มีลำดับความสำคัญต่ำซึ่งถือล็อกที่มีการแย่งชิงมีลำดับความสำคัญของผู้รอที่มีลำดับความสำคัญสูงกว่าจนกว่าล็อกนั้นจะถูกปล่อย [ 287 ] [ 288 ]

ลินุกซ์มีตัวตรวจสอบการล็อกเคอร์เนลที่เรียกว่า Lockdep [ 289 ] [ 290 ]

การขัดจังหวะ

แม้ว่าการจัดการการขัดจังหวะอาจมองได้ว่าเป็นงานเดียว แต่ก็ถูกแบ่งออกเป็นสองส่วน การแบ่งออกเป็นสองส่วนนี้เป็นผลมาจากข้อจำกัดด้านเวลาที่แตกต่างกันและความต้องการในการซิงโครไนซ์ของงานต่างๆ ที่ประกอบขึ้นเป็นการจัดการ ส่วนแรกประกอบด้วยรูทีนบริการการขัดจังหวะ แบบอะซิ งโครนัส (ISR) ซึ่งใน Linux เรียกว่าครึ่งบนในขณะที่ส่วนที่สองดำเนินการโดยหนึ่งในสามประเภทของสิ่งที่เรียกว่าครึ่งล่าง ( softirq , taskletsและwork queues ) [ 16 ] : 133–137

รูทีนบริการขัดจังหวะใน Linux สามารถซ้อนกันได้ IRQ ใหม่สามารถดักจับเข้าไปใน ISR ที่มีลำดับความสำคัญสูง ซึ่งจะแทรกแซง ISR ที่มีลำดับความสำคัญต่ำกว่าอื่นๆ

หน่วยความจำ

เคอร์เนล Linux จัดการทั้งหน่วยความจำทางกายภาพและหน่วยความจำเสมือน โดยแบ่งหน่วยความจำทางกายภาพออกเป็นโซน[ 291 ]ซึ่งแต่ละโซนมีวัตถุประสงค์เฉพาะ

  • ZONE_DMA : โซนนี้เหมาะสำหรับDMA
  • ZONE_NORMAL : สำหรับการทำงานของหน่วยความจำตามปกติ
  • ZONE_HIGHMEM : ส่วนหนึ่งของหน่วยความจำทางกายภาพที่เคอร์เนลสามารถเข้าถึงได้โดยใช้การแมปชั่วคราวเท่านั้น

โซนเหล่านั้นเป็นโซนที่พบได้บ่อยที่สุด แต่ก็ยังมีโซนอื่นๆ อีก[ 291 ]

ลินุกซ์ใช้หน่วยความจำเสมือน ที่มี ตารางเพจ 4 หรือ 5 ระดับ[ 292 ]เคอร์เนลไม่สามารถเพจได้ (หมายความว่าเคอร์เนลจะอยู่ในหน่วยความจำทางกายภาพเสมอและไม่สามารถสลับไปยังดิสก์ได้) และไม่มีการป้องกันหน่วยความจำ (ไม่มี สัญญาณ SIGSEGVซึ่งแตกต่างจากในพื้นที่ผู้ใช้) ดังนั้นการละเมิดหน่วยความจำจึงนำไปสู่ความไม่เสถียรและการล่มของระบบ[ 16 ] : 20 หน่วยความจำของผู้ใช้สามารถเพจได้โดยค่าเริ่มต้น แม้ว่าการเพจสำหรับพื้นที่หน่วยความจำเฉพาะสามารถปิดใช้งานได้ด้วยตระกูล การเรียกใช้ระบบmlock()

ข้อมูล เฟรมหน้าจะถูกเก็บรักษาไว้ในโครงสร้างข้อมูลที่เหมาะสม (ประเภทstruct page) ซึ่งจะถูกเติมข้อมูลทันทีหลังจากการบูตและเก็บไว้จนกว่าจะปิดระบบ โดยไม่คำนึงว่าจะเกี่ยวข้องกับหน้าเสมือนหรือไม่ พื้นที่แอดเดรสทางกายภาพจะถูกแบ่งออกเป็นโซนต่างๆ ตามข้อจำกัดทางสถาปัตยกรรมและการใช้งานที่ตั้งใจไว้ ระบบ NUMA ที่มีธนาคารหน่วยความจำหลายแห่งก็ได้รับการสนับสนุนเช่นกัน[ 293 ]

สามารถจัดสรรหน่วยความจำขนาดเล็กแบบไดนามิกในพื้นที่เคอร์เนลได้ผ่านตระกูลkmalloc()API และปล่อยหน่วยความจำด้วยรูปแบบที่เหมาะสมของkfree()และvmalloc()ใช้kvfree()สำหรับหน่วยความจำขนาดใหญ่ที่ต่อเนื่องกันเสมือนจริงalloc_pages()จะจัดสรรจำนวนหน้าหน่วยความจำทั้งหมดที่ต้องการ

แผนภาพสแต็กการจัดเก็บข้อมูล Linux [ 294 ]

เคอร์เนลเคยมีตัวจัดสรร SLAB, SLUB และ SLOB เป็นทางเลือกที่สามารถกำหนดค่าได้[ 295 ] [ 296 ]ตัวจัดสรร SLOB ถูกลบออกใน Linux 6.4 [ 297 ]และตัวจัดสรร SLAB ถูกลบออกใน Linux 6.8 [ 298 ]ตัวจัดสรรที่เหลืออยู่เพียงตัวเดียวคือ SLUB ซึ่งมุ่งเน้นความเรียบง่ายและประสิทธิภาพ[ 296 ]เข้ากันได้กับPREEMPT_RT [ 299 ]และถูกนำมาใช้ใน Linux 2.6

ระบบไฟล์เสมือน

เนื่องจาก Linux รองรับระบบไฟล์จำนวนมากที่มีคุณสมบัติและฟังก์ชันการทำงานที่แตกต่างกัน จึงจำเป็นต้องสร้างระบบไฟล์ทั่วไปที่ไม่ขึ้นกับระบบไฟล์พื้นฐานระบบไฟล์เสมือนจะเชื่อมต่อกับระบบย่อยอื่นๆ ของ Linux พื้นที่ผู้ใช้ หรือAPIและแยกส่วนการใช้งานที่แตกต่างกันของระบบไฟล์พื้นฐานออกไป VFS ใช้การเรียกใช้ระบบเช่นcreate, open, read, writeและcloseVFS ใช้superblock ทั่วไป [ 300 ]และบล็อก inodeที่ไม่ขึ้นกับที่ระบบไฟล์พื้นฐานมี

ในระบบย่อยนี้ ไดเร็กทอรีและไฟล์จะถูกแทนด้วยstruct fileโครงสร้างข้อมูลเมื่อพื้นที่ผู้ใช้ร้องขอการเข้าถึงไฟล์ ระบบจะส่งคืนตัวระบุไฟล์ (ค่าจำนวนเต็มที่ไม่ติดลบ) แต่ในพื้นที่เคอร์เนลมันจะเป็นstruct fileโครงสร้าง โครงสร้างนี้จะเก็บข้อมูลทั้งหมดที่เคอร์เนลรู้เกี่ยวกับไฟล์หรือไดเร็กทอรี

sysfsและprocfsเป็นระบบไฟล์เสมือนที่เปิดเผยข้อมูลฮาร์ดแวร์และ ข้อมูลการทำงานของโปรแกรม ในพื้นที่ผู้ใช้ระบบไฟล์เหล่านี้ไม่ได้อยู่บนดิสก์ แต่เคอร์เนลจะใช้งานในรูปแบบของฟังก์ชันเรียกกลับหรือรูทีนที่จะถูกเรียกเมื่อมีการเข้าถึงโดยพื้นที่ผู้ใช้

สถาปัตยกรรมที่รองรับ

TiVo DVRอุปกรณ์สำหรับผู้บริโภคที่ใช้ระบบปฏิบัติการ Linux

แม้ว่าเดิมทีจะไม่ได้ออกแบบมาให้พกพาได้ [ 19 ] [ 301 ] แต่ Linux ก็เป็นหนึ่งในเคอร์เนลระบบปฏิบัติการที่มีการพอร์ตอย่างกว้างขวางที่สุด โดยทำงานบนระบบที่หลากหลาย ตั้งแต่สถาปัตยกรรม ARM ไปจนถึง คอมพิวเตอร์เมนเฟรม IBM z/Architecture การพอร์ตครั้งแรกทำบน แพลตฟอร์ม Motorola 68000การปรับเปลี่ยนเคอร์เนลนั้นมีความสำคัญมากจน Torvalds มองว่าเวอร์ชัน Motorola เป็นการแยกสาขาและเป็น "ระบบปฏิบัติการที่คล้าย Linux" [ 301 ]นั่นทำให้ Torvalds เป็นผู้นำในการปรับโครงสร้างโค้ดครั้งใหญ่เพื่ออำนวยความสะดวกในการพอร์ตไปยังสถาปัตยกรรมคอมพิวเตอร์มากขึ้น Linux เวอร์ชันแรกที่มีโค้ดมากกว่า i386 เพียงอย่างเดียวในซอร์สโค้ดเดียว รองรับ แพลตฟอร์ม DEC Alpha AXP 64 บิต[ 302 ] [ 303 ] [ 301 ]

Linux ถูกใช้เป็นระบบปฏิบัติการหลักบน ซูเปอร์คอมพิวเตอร์ Summit ของ IBMในเดือนตุลาคม 2019 ระบบทั้งหมดในรายการ TOP500 ของซูเปอร์คอมพิวเตอร์ที่เร็วที่สุดในโลกใช้ระบบปฏิบัติการที่ใช้เคอร์เนล Linux [ 73 ]ในขณะที่ซูเปอร์คอมพิวเตอร์ที่ใช้ Linux เครื่องแรกปรากฏในรายการในปี 1998 [ 304 ]

Linux ยังได้รับการพอร์ตไปยังอุปกรณ์พกพาต่างๆ เช่นiPhone 3GและiPodอีก ด้วย [ 305 ]

อุปกรณ์ที่รองรับ

ในปี 2550 โครงการ LKDDb ได้เริ่มต้นขึ้นเพื่อสร้างฐานข้อมูลที่ครอบคลุมของฮาร์ดแวร์และโปรโตคอลที่รู้จักโดยเคอร์เนล Linux [ 306 ]ฐานข้อมูลนี้สร้างขึ้นโดยอัตโนมัติโดยการวิเคราะห์แบบคงที่ของซอร์สโค้ดเคอร์เนล ต่อมาในปี 2557 โครงการ Linux Hardware ได้เปิดตัวขึ้นเพื่อรวบรวมฐานข้อมูลของการกำหนดค่าฮาร์ดแวร์ที่ทดสอบทั้งหมดโดยอัตโนมัติด้วยความช่วยเหลือจากผู้ใช้การแจกจ่าย Linux ต่างๆ[ 307 ]

การแก้ไขแบบเรียลไทม์

การอัปเดตเคอร์เนลสามารถทำได้โดยไม่ต้องรีบูตเครื่องโดยใช้ เทคโนโลยี การแพตช์แบบเรียลไทม์เช่นKsplice , kpatchและkGraftการสนับสนุนการแพตช์เคอร์เนลแบบเรียลไทม์เริ่มต้นขึ้นในเคอร์เนล Linux เวอร์ชัน 4.0 ซึ่งวางจำหน่ายเมื่อวันที่ 12 เมษายน 2558 คุณสมบัตินี้เรียกว่าlivepatch ใช้ฟังก์ชัน ftraceของเคอร์เนลและมีโครงสร้างพื้นฐานทั่วไปสำหรับการแพตช์แบบเร่งด่วนที่ส่งผ่านโมดูลเคอร์เนล พร้อมด้วยอินเทอร์เฟซสำหรับเครื่องมือการจัดการในพื้นที่ผู้ใช้ ในการใช้งาน Linux 4.0 ครั้งแรก การสนับสนุน livepatch นั้นจำกัดเฉพาะ สถาปัตยกรรม x86และให้โครงสร้างพื้นฐานขั้นพื้นฐานมากกว่าที่จะเป็นโมเดลความสอดคล้องของการแพตช์แบบเรียลไทม์ที่สมบูรณ์

ความปลอดภัย

ข้อบกพร่องของเคอร์เนลก่อให้เกิดปัญหาด้านความปลอดภัยที่อาจเกิดขึ้นได้ ตัวอย่างเช่น อาจทำให้เกิดการยกระดับสิทธิ์หรือสร้าง ช่องทางการ โจมตีแบบปฏิเสธการให้บริการตลอดหลายปีที่ผ่านมา มีการค้นพบและแก้ไขข้อบกพร่องจำนวนมากที่ส่งผลกระทบต่อความปลอดภัยของระบบ[ 308 ]มีการนำคุณสมบัติใหม่ๆ มาใช้เพื่อปรับปรุงความปลอดภัยของเคอร์เนลอย่างต่อเนื่อง[ 309 ] [ 310 ]

ความสามารถ (7) ได้รับการแนะนำไปแล้วในส่วนเกี่ยวกับกระบวนการและเธรด Android ใช้ประโยชน์จากความสามารถเหล่านี้ และsystemdช่วยให้ผู้ดูแลระบบสามารถควบคุมความสามารถของกระบวนการได้อย่างละเอียด[ 311 ]

ลินุกซ์มีกลไกมากมายในการลดช่องโหว่การโจมตีของเคอร์เนลและปรับปรุงความปลอดภัย ซึ่งโดยรวมเรียกว่าโมดูลความปลอดภัยของลินุกซ์ (LSM) [ 312 ]ประกอบด้วย โมดูล Security-Enhanced Linux (SELinux) ซึ่งโค้ดได้รับการพัฒนาและเผยแพร่สู่สาธารณะโดยNSA [ 313 ]และAppArmor [ 198 ]เป็นต้น ปัจจุบัน SELinux ได้รับการพัฒนาและบำรุงรักษาอย่างต่อเนื่องบนGitHub [ 197 ] SELinux และ AppArmor ให้การสนับสนุนนโยบายความปลอดภัยการควบคุมการเข้าถึง รวมถึงการควบคุมการเข้าถึงแบบบังคับ (MAC) แม้ว่าจะมีความซับซ้อนและขอบเขตที่แตกต่างกันอย่าง มากก็ตาม

คุณสมบัติด้านความปลอดภัยอีกอย่างหนึ่งคือ Seccomp BPF (SECure COMPuting with Berkeley Packet Filters) ซึ่งทำงานโดยการกรองพารามิเตอร์และลดชุดการเรียกใช้ระบบที่มีให้สำหรับแอปพลิเคชันในพื้นที่ผู้ใช้[ 314 ]

นักวิจารณ์กล่าวหานักพัฒนาเคอร์เนลว่าปกปิดช่องโหว่ด้านความปลอดภัย หรืออย่างน้อยก็ไม่ได้ประกาศช่องโหว่เหล่านั้น ในปี 2551 Torvalds ได้ตอบโต้เรื่องนี้ด้วยข้อความต่อไปนี้: [ 315 ] [ 316 ]

โดยส่วนตัวแล้ว ผมมองว่าช่องโหว่ด้านความปลอดภัยเป็นเพียง "ช่องโหว่ธรรมดา" ผมไม่ได้ปกปิดมัน แต่ผมก็ไม่มีเหตุผลใดๆ ที่จะคิดว่าการติดตามและประกาศช่องโหว่เหล่านั้นว่าเป็นเรื่องพิเศษนั้นเป็นความคิดที่ดี...เหตุผลหนึ่งที่ผมปฏิเสธที่จะยุ่งเกี่ยวกับเรื่องความปลอดภัยทั้งหมดนี้ก็คือ ผมคิดว่ามันเชิดชู—และส่งเสริม—พฤติกรรมที่ไม่ถูกต้อง มันทำให้คนทำงานด้านความปลอดภัยกลายเป็น "วีรบุรุษ" ราวกับว่าคนที่ไม่ได้แค่แก้ไขช่องโหว่ธรรมดานั้นไม่สำคัญเท่า ในความเป็นจริง ช่องโหว่ธรรมดาที่น่าเบื่อเหล่านั้น สำคัญกว่า มากเพียงเพราะมีจำนวนมากกว่า ผมไม่คิดว่าช่องโหว่ด้านความปลอดภัยที่ร้ายแรงควรได้รับการยกย่องหรือใส่ใจมากกว่า "ความพิเศษ" ใดๆ ไปกว่าการหยุดทำงานอย่างกะทันหันที่เกิดจากการล็อกที่ไม่ดี

โดยทั่วไปแล้ว ระบบปฏิบัติการลินุกซ์จะออกอัปเดตความปลอดภัยเพื่อแก้ไขช่องโหว่ในเคอร์เนลลินุกซ์ หลายระบบยังมี การออกเวอร์ชัน สนับสนุนระยะยาวซึ่งจะได้รับการอัปเดตความปลอดภัยสำหรับเคอร์เนลลินุกซ์เวอร์ชันใดเวอร์ชันหนึ่งเป็นระยะเวลานาน

ในปี 2024 นักวิจัยได้เปิดเผยว่าเคอร์เนล Linux มีช่องโหว่ร้ายแรง CVE-2024-50264 ซึ่งอยู่ในซับซิสเต็ม AF_VSOCK ข้อบกพร่องนี้เป็นข้อบกพร่องการใช้งานหลังจากปล่อยหน่วยความจำ ซึ่งเป็นปัญหาการเสียหายของหน่วยความจำประเภทหนึ่งที่เกิดขึ้นเมื่อโปรแกรมยังคงใช้หน่วยความจำต่อไปหลังจากที่ได้ถูกปล่อยไปแล้ว[ 317 ] [ 318 ] ข้อบกพร่องดังกล่าวเป็นอันตรายอย่างยิ่งในเคอร์เนล เนื่องจากอาจทำให้ผู้โจมตีสามารถยกระดับสิทธิ์ได้ ข้อบกพร่องนี้ได้รับการแก้ไขในเดือนพฤษภาคม 2025 [ 319 ]

เงื่อนไขการอนุญาตใช้งาน

ในตอนแรก Torvalds ได้เผยแพร่ Linux ภายใต้ใบอนุญาตที่ห้ามการใช้งานเชิงพาณิชย์ใดๆ[ 320 ]แต่ในเวอร์ชัน 0.12 ได้มีการเปลี่ยนแปลงโดยเปลี่ยนไปใช้ใบอนุญาตสาธารณะทั่วไปของ GNUเวอร์ชัน 2 (GPLv2) [ 24 ]ใบอนุญาตนี้อนุญาตให้แจกจ่ายและจำหน่าย Linux เวอร์ชันที่อาจมีการแก้ไขหรือไม่ได้รับการแก้ไขก็ได้ แต่กำหนดให้สำเนาทั้งหมดต้องเผยแพร่ภายใต้ใบอนุญาตเดียวกันและต้องมีซอร์สโค้ดที่เกี่ยวข้องทั้งหมดแนบมาด้วย หรือให้สิทธิ์การเข้าถึงฟรีเมื่อมีการร้องขอ[ 321 ] Torvalds ได้อธิบายว่าการให้ใบอนุญาต Linux ภายใต้ GPLv2 เป็น "สิ่งที่ดีที่สุดที่ฉันเคยทำ" [ 320 ]

เคอร์เนล Linux ได้รับอนุญาตอย่างชัดเจนภายใต้GNU General Public Licenseเวอร์ชัน 2 เท่านั้น (GPL-2.0-only) พร้อมข้อยกเว้น syscall ที่ชัดเจน (Linux-syscall-note) [ 10 ] [ 13 ] [ 14 ]โดยไม่เสนอตัวเลือกให้ผู้รับอนุญาตเลือกเวอร์ชันที่ใหม่กว่า ซึ่งเป็นส่วนขยายทั่วไปของ GPL โค้ดที่ร่วมเขียนต้องพร้อมใช้งานภายใต้ใบอนุญาตที่เข้ากันได้กับ GPL [ 15 ] [ 209 ]

มีการถกเถียงกันอย่างมากเกี่ยวกับความง่ายในการเปลี่ยนแปลงใบอนุญาตเพื่อใช้ GPL เวอร์ชันที่ใหม่กว่า (รวมถึงเวอร์ชัน 3) และว่าการเปลี่ยนแปลงนี้เป็นที่พึงปรารถนาหรือไม่[ 322 ] Torvalds เองได้ระบุอย่างชัดเจนในการเผยแพร่เวอร์ชัน 2.4.0 ว่าโค้ดของเขาเผยแพร่ภายใต้เวอร์ชัน 2 เท่านั้น[ 323 ]ข้อกำหนดของ GPL ระบุว่าหากไม่มีการระบุเวอร์ชัน ก็สามารถใช้เวอร์ชันใดก็ได้[ 324 ]และAlan Coxชี้ให้เห็นว่ามีผู้มีส่วนร่วมใน Linux เพียงไม่กี่รายที่ระบุเวอร์ชัน GPL ที่เฉพาะเจาะจง[ 325 ]

ในเดือนกันยายน พ.ศ. 2549 การสำรวจโปรแกรมเมอร์เคอร์เนลหลัก 29 คนระบุว่า 28 คนชอบ GPLv2 มากกว่าร่าง GPLv3 ในขณะนั้น Torvalds แสดงความคิดเห็นว่า "ผมคิดว่าคนนอกหลายคน... เชื่อว่าผมเป็นคนเดียวที่แตกต่างออกไป เพราะผมแสดงออกอย่างเปิดเผยว่าไม่ชอบ GPLv3 มากนัก" [ 326 ]กลุ่มนักพัฒนาเคอร์เนลที่มีชื่อเสียงกลุ่มนี้ รวมถึง Torvalds, Greg Kroah-HartmanและAndrew Mortonได้แสดงความคิดเห็นในสื่อมวลชนเกี่ยวกับการคัดค้าน GPLv3 [ 327 ]พวกเขาอ้างถึงข้อกำหนดเกี่ยวกับDRM / tivoizationสิทธิบัตร "ข้อจำกัดเพิ่มเติม" และเตือนถึงการแบ่งแยก "จักรวาลโอเพนซอร์ส" โดย GPLv3 [ 327 ] [ 328 ] Torvalds ซึ่งตัดสินใจไม่ใช้ GPLv3 สำหรับเคอร์เนล Linux ได้ย้ำคำวิจารณ์ของเขาแม้กระทั่งหลายปีต่อมา[ 329 ]

โมดูลเคอร์เนลที่โหลดได้

มีการถกเถียงกันว่าโมดูลเคอร์เนลที่สามารถโหลดได้ (LKM) บางส่วนควรได้รับการพิจารณาว่าเป็นงานดัดแปลงภายใต้กฎหมายลิขสิทธิ์หรือไม่ และด้วยเหตุนี้จึงอยู่ภายใต้ข้อกำหนดของ GPL หรือไม่

ตามกฎใบอนุญาต LKM ที่ใช้เฉพาะส่วนย่อยสาธารณะของอินเทอร์เฟซเคอร์เนล[ 234 ] [ 235 ]ถือเป็นงานที่ไม่ดัดแปลง ดังนั้น Linux จึงมอบกลไกให้ผู้ดูแลระบบในการโหลดวัตถุไบนารีนอกโครงสร้างลงในพื้นที่แอดเดรสของเคอร์เนล[ 15 ]

มีโมดูลที่โหลดได้นอกโครงสร้างบางส่วนที่ใช้คุณสมบัติเคอร์เนลdma_buf อย่างถูกต้อง [ 330 ]โค้ดที่สอดคล้องกับ GPL สามารถใช้งานได้อย่างแน่นอน กรณีการใช้งานที่เป็นไปได้อีกแบบหนึ่งคือNvidia Optimusที่จับคู่ GPU ที่เร็วกับ GPU ในตัวของ Intel โดยที่ GPU ของ Nvidia จะเขียนลงใน เฟรมบัฟเฟอร์ ของ Intelเมื่อทำงานอยู่ แต่ Nvidia ไม่สามารถใช้โครงสร้างพื้นฐานนี้ได้เนื่องจากจำเป็นต้องข้ามกฎที่สามารถใช้ได้เฉพาะ LKM ที่เป็น GPL เท่านั้น[ 236 ] Alan CoxตอบกลับในLKMLโดยปฏิเสธคำขอจากวิศวกรคนหนึ่งของ Nvidia ที่จะลบการบังคับใช้ทางเทคนิคนี้ออกจาก API [ 331 ] Torvalds ระบุอย่างชัดเจนใน LKML ว่า "[ฉัน] อ้างว่าโมดูลเคอร์เนลแบบไบนารีเท่านั้นเป็นอนุพันธ์ "โดยค่าเริ่มต้น" [ 332 ]

ในทางกลับกัน Torvalds ยังกล่าวอีกว่า "[หนึ่ง] พื้นที่สีเทาโดยเฉพาะคือบางอย่างเช่นไดรเวอร์ที่เขียนขึ้นสำหรับระบบปฏิบัติการอื่น (กล่าวคือ เห็นได้ชัดว่าไม่ใช่ผลงานที่ดัดแปลงมาจาก Linux) นั่นคือพื้นที่สีเทา และนั่นคือพื้นที่ที่ผมเชื่อว่าโมดูลบางตัวอาจถือว่าไม่ใช่ผลงานที่ดัดแปลงมาเพียงเพราะไม่ได้ออกแบบมาสำหรับ Linux และไม่ขึ้นอยู่กับพฤติกรรมพิเศษใด ๆ ของ Linux" [ 333 ] ไดรเวอร์กราฟิก ที่เป็นกรรมสิทธิ์โดยเฉพาะอย่างยิ่งมีการถกเถียงกันอย่างมาก

เมื่อใดก็ตามที่โมดูลที่เป็นกรรมสิทธิ์ถูกโหลดลงใน Linux เคอร์เนลจะทำเครื่องหมายตัวเองว่าเป็น "ปนเปื้อน" [ 334 ]ดังนั้นรายงานข้อบกพร่องจากเคอร์เนลที่ปนเปื้อนมักจะถูกนักพัฒนาเพิกเฉย

ไบนารีบลอบของเฟิร์มแวร์

เคอร์เนลอย่างเป็นทางการ ซึ่งก็คือสาขา git ของ Torvalds ที่ repository kernel.org นั้นประกอบด้วยไบนารีบล็อบที่เผยแพร่ภายใต้เงื่อนไขของใบอนุญาต GNU GPLv2 [ 10 ] [ 15 ] Linux ยังสามารถโหลดไบนารีบล็อบ เฟิร์มแวร์ที่เป็นกรรมสิทธิ์ ไดรเวอร์ หรือโมดูลปฏิบัติการอื่นๆ จากระบบไฟล์ และเชื่อมโยงเข้ากับพื้นที่เคอร์เนลได้[ 335 ]

เมื่อจำเป็น (เช่น เพื่อเข้าถึงอุปกรณ์บูตหรือเพื่อความเร็ว) เฟิร์มแวร์สามารถสร้างขึ้นในเคอร์เนลได้ ซึ่งหมายถึงการสร้างเฟิร์มแวร์ลงในvmlinuxอย่างไรก็ตาม นี่ไม่ใช่ทางเลือกที่ทำได้เสมอไปเนื่องจากปัญหาทางเทคนิคหรือทางกฎหมาย (เช่น ไม่อนุญาตให้ทำเช่นนี้กับเฟิร์มแวร์ที่ไม่เข้ากันกับ GPL แม้ว่าจะเป็นเรื่องปกติก็ตาม) [ 336 ]

เครื่องหมายการค้า

Linux เป็น เครื่องหมายการค้าจดทะเบียนของ Linus Torvalds ในสหรัฐอเมริกา สหภาพยุโรป และประเทศอื่นๆ[ 337 ] [ 338 ]การต่อสู้ทางกฎหมายเกี่ยวกับเครื่องหมายการค้านี้เริ่มต้นขึ้นในปี 1996 เมื่อ William Della Croce ทนายความที่ไม่เคยมีส่วนร่วมในการพัฒนา Linux เริ่มเรียกร้องค่าธรรมเนียมใบอนุญาตสำหรับการใช้คำว่าLinuxหลังจากที่พิสูจน์ได้ว่าคำนี้ถูกใช้กันอย่างแพร่หลายมานานก่อนที่ Della Croce จะอ้างว่าใช้เป็นครั้งแรก เครื่องหมายการค้าจึงตกเป็นของ Torvalds [ 339 ] [ 340 ] [ 341 ]

การถอดถอนผู้ดูแลระบบชาวรัสเซีย

ในเดือนตุลาคม พ.ศ. 2567 ระหว่างการรุกรานยูเครนของรัสเซียGreg Kroah-Hartmanนักพัฒนาเคอร์เนลได้ถอดนักพัฒนาเคอร์เนลบางคนที่ที่อยู่อีเมลบ่งชี้ว่ามีความเชื่อมโยงกับรัสเซียออกจากบทบาทผู้ดูแลระบบ[ 342 ] [ 343 ] Linus Torvaldsตอบว่าเขาไม่สนับสนุนการรุกรานของรัสเซียและจะไม่ยกเลิกแพตช์ โดยบอกเป็นนัยว่าผู้ต่อต้านแพตช์เป็น โทร ลชาวรัสเซีย[ 344 ] James Bottomley นักพัฒนาเคอร์เนล ได้ออกคำขอโทษสำหรับการจัดการสถานการณ์และชี้แจงว่าการกระทำดังกล่าวเป็นผลมาจากการคว่ำบาตรของสหรัฐฯ ต่อรัสเซีย[ 345 ]

ดูเพิ่มเติม

หมายเหตุ

  1. ^พร้อมส่วนขยาย GNU ; [ 5 ] C11 (gnu11) ตั้งแต่ 5.18, [ 6 ] C89 (gnu89) ก่อน [ 7 ]
  2. ^ดู Rust สำหรับ Linux [ 8 ]
  3. ^โดยรวมแล้ว ซอร์สโค้ด Linux จะถูกจัดให้ภายใต้เงื่อนไขของ ใบอนุญาต GPL-2.0 เท่านั้นโดยมีข้อยกเว้น syscall ที่ชัดเจน [ 13 ] [ 14 ]นอกเหนือจากนั้น ไฟล์แต่ละไฟล์สามารถจัดให้ภายใต้ใบอนุญาตอื่นที่ต้องเข้ากันได้กับใบอนุญาต GPL-2.0 เท่านั้น (เช่น ใบอนุญาต GNU General Public License เวอร์ชัน 2) หรือใบอนุญาตแบบคู่ โดยมีตัวเลือกหนึ่งคือ GPL เวอร์ชัน 2 หรือใบอนุญาตที่เข้ากันได้กับ GPLv2 [ 15 ]

อ่านเพิ่มเติม

  • ทอร์วัลด์ส, ไลนัส; ไดมอนด์, เดวิด (2001). แค่เพื่อความสนุก: เรื่องราวของนักปฏิวัติโดยบังเอิญ . ฮาร์เปอร์บิสซิเนส . ISBN 978-0066620732.
  • เบซรูคอฟ, นิโคไล. "บทที่ 4: เผด็จการใจดี" . ภาพบุคคลผู้บุกเบิกโอเพนซอร์ส (อีบุ๊ก). ซอฟต์พาโนรามา. เก็บถาวรจากต้นฉบับเมื่อวันที่ 13 ตุลาคม 2548. สืบค้นเมื่อเมื่อวันที่ 3 ตุลาคม 2548 .
  • Corbet, Jonathan (16 ตุลาคม 2546). "LinkSys และโมดูลไบนารี" . LWN.net ฉบับรายสัปดาห์. เก็บถาวรจากต้นฉบับเมื่อ 1 สิงหาคม 2559. สืบค้นเมื่อ21 กรกฎาคม 2559 .
  • "มาสคอตลินุกซ์ที่ทุกคนชื่นชอบ"เก็บถาวรจากต้นฉบับเมื่อวันที่ 16 สิงหาคม 2548 เรียกดูเมื่อวันที่ 16 มิถุนายน 2548
  • Pranevich, Joseph (ธันวาคม 2003). "โลกอันแสนมหัศจรรย์ของ Linux 2.6" . เก็บถาวรจากต้นฉบับเมื่อวันที่ 16 กรกฎาคม 2003.
  • "LinuxChanges" . เก็บถาวรจากต้นฉบับเมื่อวันที่ 31 ตุลาคม 2548 . เรียกดูเมื่อวันที่ 31 ตุลาคม 2548 .
  • "เอกสารสัมมนาเรื่อง Linux Kernel 2.6"เก็บถาวรจากต้นฉบับเมื่อวันที่ 2 กุมภาพันธ์ 2550
  • "ไดรเวอร์อุปกรณ์ Linux" (ฉบับที่ 3) เก็บถาวรจากต้นฉบับเมื่อวันที่ 27 กรกฎาคม 2559 เรียกดูเมื่อวันที่ 21 กรกฎาคม 2559
  • ทำความเข้าใจเคอร์เนลของลินุกซ์ (หนังสือ) (ฉบับพิมพ์ครั้งที่ 3) ISBN 978-0-596-00565-8เก็บถาวรจากต้นฉบับเมื่อวันที่ 17 ธันวาคม 2548 เรียกดูเมื่อวันที่ 22 ธันวาคม 2548
  • Rosen, Rami (2014). Linux Kernel Networking (PDF) . Berkeley, CA: Apress. doi : 10.1007/978-1-4302-6197-1 . ISBN 978-1-4302-6196-4สืบค้นข้อมูลเมื่อ วัน ที่10 สิงหาคม 2568
  • "Linux: GPL และโมดูลไบนารี"เก็บถาวรจากต้นฉบับเมื่อวันที่ 23 กรกฎาคม 2548
  • "โครงสร้างของเคอร์เนลลินุกซ์" . IBM . เก็บถาวรจากต้นฉบับเมื่อวันที่ 27 มิถุนายน 2550 . เรียกดูเมื่อวันที่ 9 มิถุนายน 2550 .
  • Tanenbaum, Andrew; Bos, Herbert (2015). ระบบปฏิบัติการสมัยใหม่ . สหรัฐอเมริกา: Pearson. หน้า 722. ISBN 9781292061429. OCLC  892574803 .
  • เว็บไซต์อย่างเป็นทางการแก้ไขข้อมูลนี้ได้ที่วิกิดาต้า
  • Kernel Newbiesแหล่งข้อมูลต่างๆ ที่เกี่ยวข้องกับเคอร์เนล
  • รายงานการครอบคลุมโค้ดเคอร์เนลที่ LWN.netแหล่งข้อมูลที่น่าเชื่อถือเกี่ยวกับข้อมูลที่เกี่ยวข้องกับเคอร์เนล
  • Bootlin's Elixir Cross Referencerคือเครื่องมืออ้างอิงโยงโค้ดต้นฉบับของเคอร์เนล Linux
  • เกร็ก โครอาห์ ฮาร์ทแมน พูดถึงเคอร์เนลลินุกซ์บน YouTube
  • ระบบไฟล์เสมือน , การใช้งานระบบไฟล์ทั่วไปของลินุกซ์
ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Linux_kernel&oldid=1360524464#Preemption "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ เคอร์เนลลินุกซ์

เคอร์เนล Linux เป็น เคอร์เนล แบบ Unix ที่เป็น โอเพนซอร์สและใช้งานได้ฟรี [ 16 ] : 4 ซึ่งใช้ใน ระบบคอมพิวเตอร์ หลายระบบ ทั่วโลก เคอร์เนลนี้ถูกสร้างขึ้นโดย Linus Torvalds ในปี 1991...

ประวัติศาสตร์

ในปี พ.ศ. 2534 Linus Torvalds เป็น นักศึกษา วิทยาการคอมพิวเตอร์ ที่ลงทะเบียนเรียนที่ มหาวิทยาลัยเฮลซิงกิ ในระหว่างนั้น เขาเริ่มพัฒนาระบบปฏิบัติการเป็นโครงการเสริมที่ได้รับแรงบันดาลใจจาก UNIX สำหรับคอมพิวเตอร์ส่วนบุคคล [ 18 ] เขาเริ่มต้นด้วย ตัวสลับงาน ใน...

ความนิยม

จากผลสำรวจนักพัฒนาซอฟต์แวร์ประจำปี 2019 ของ Stack Overflow พบว่าผู้ตอบแบบสอบถามมากกว่า 53% พัฒนาซอฟต์แวร์สำหรับ Linux และประมาณ 27% สำหรับ Android [ 69 ] แม้ว่า จะ มีเพียงประมาณ 25% เท่านั้นที่พัฒนาด้วยระบบปฏิบัติการที่ใช้ Linux [ 70 ]

ค่า

ต้นทุนในการพัฒนาเคอร์เนล Linux เวอร์ชัน 2.6.0 ขึ้นใหม่ในสภาพแวดล้อมการพัฒนาแบบดั้งเดิมที่เป็นกรรมสิทธิ์นั้น คาดว่าจะอยู่ที่ 612 ล้านดอลลาร์สหรัฐ (467 ล้านยูโร, 394 ล้านปอนด์) ตามราคาในปี 2547 โดยใช้แบบจำลองการประมาณการจำนวนคนต่อเดือน ของ COCOMO [ 77 ] ในปี...