- ชุมชนเคอร์เนล Linux ไม่ค่อยต้อนรับ โมดูลเคอร์เนลแบบ proprietary มานานแล้ว และแพตช์ของ Christoph Hellwig ก็เป็นความพยายามที่จะปิดช่องทางเลี่ยงข้อจำกัดนั้นให้แคบลงอีกครั้ง
- แทนที่จะห้ามการโหลดโมดูล proprietary โดยตรง เคอร์เนลใช้ GPL-only exports เพื่ออนุญาตให้เข้าถึงสัญลักษณ์บางส่วนของเคอร์เนลได้เฉพาะโมดูลที่เข้ากันได้กับ GPL เท่านั้น
- ในปี 2020 มีการเปิดเผยวิธีแบบ GPL condom ที่ให้โมดูล GPL ทำหน้าที่เป็นตัวกลางเชื่อมระหว่างโมดูล proprietary กับเคอร์เนล และหลังจากนั้นก็มีการปรับให้โมดูลที่ใช้สัญลักษณ์ของโมดูล proprietary ถูกมองว่าเป็น proprietary เช่นกัน
- ช่องทางเลี่ยงใหม่คือการใช้
symbol_get()เพื่อดึงที่อยู่ของสัญลักษณ์ภายในโมดูล proprietary โดยไม่ผ่านขั้นตอน import ตามปกติ ซึ่ง Hellwig เห็นว่า NVIDIA ได้ปรับโค้ดให้ใช้วิธีนี้ - แพตช์ที่เสนอจะทำให้
symbol_get()ล้มเหลวเมื่อค้นหาสัญลักษณ์ที่ ไม่ใช่ GPL-only เพื่อปิดช่องทางดังกล่าว แต่ตราบใดที่โมดูลยังรันอยู่ในพื้นที่แอดเดรสของเคอร์เนล การควบคุมการเข้าถึงก็ยังยากจะทำให้ปลอดภัยได้อย่างสมบูรณ์
ความตึงเครียดที่ยืดเยื้อมานานรอบโมดูลเคอร์เนลแบบ proprietary
- ชุมชนเคอร์เนล Linux ไม่เคยมีความสัมพันธ์ที่ราบรื่นกับผู้ให้บริการ โมดูลเคอร์เนลแบบ proprietary
- โมดูลลักษณะนี้มักดีบักหรือแก้ไขได้ยากสำหรับคนนอกเหนือจากผู้สร้าง
- นักพัฒนาจำนวนมากมองว่านี่เป็นการละเมิดไลเซนส์ของเคอร์เนลและลิขสิทธิ์ของโค้ด
- ถึงอย่างนั้น โมดูล proprietary ก็ยังถูก ยอมให้ใช้ได้ ภายในขอบเขตหนึ่ง
- แพตช์ล่าสุดของ Christoph Hellwig คือความเคลื่อนไหวที่ต้องการทำให้ขอบเขตที่ยอมรับได้นั้นแคบลงอีกเล็กน้อย
ความพยายามแบนการโหลดในปี 2006 และ GPL-only exports
- ในปี 2006 เคยมีความพยายามช่วงสั้น ๆ ที่จะห้ามการโหลดโมดูลเคอร์เนล proprietary ทั้งหมด
- Linus Torvalds ขัดขวางความพยายามนั้นด้วยเหตุผลหลายข้อ
- การโหลดโมดูล proprietary เข้าไปในเคอร์เนล Linux เพียงอย่างเดียว ไม่ได้ถือเป็นการละเมิดลิขสิทธิ์
- ผู้ใช้ Linux สามารถทำเช่นนั้นได้
- Torvalds มองว่าการแบนลักษณะนี้อาจเป็นสัญญาณว่าฝ่ายที่ผลักดันสนใจข้อถกเถียงเรื่องไลเซนส์มากกว่าการปรับปรุงด้านเทคนิค
- อย่างไรก็ตาม การ แจกจ่าย โมดูล proprietary อาจเป็นการละเมิดลิขสิทธิ์ได้ หากโมดูลนั้นถือเป็นงานดัดแปลงของโค้ดเคอร์เนล
- แต่การตัดสินว่าเป็นงานดัดแปลงหรือไม่นั้นยังคลุมเครือ และตัวเคอร์เนลเองก็แทบตัดสินเรื่องนี้จริง ๆ ไม่ได้
- ในเคอร์เนลมีมาตรการเก่าแก่ที่ใช้ขัดขวางโมดูลที่อาจเข้าข่ายละเมิด คือ GPL-only exports
- โมดูลเคอร์เนลต้องเข้าถึงฟังก์ชันและสัญลักษณ์ของโครงสร้างข้อมูลที่เคอร์เนล export ออกมา จึงจะทำงานที่มีประโยชน์ได้
- สัญลักษณ์จำนวนมากอนุญาตเฉพาะโมดูลที่ประกาศไลเซนส์เข้ากันได้กับ GPL เท่านั้น
- วิธีนี้ทำให้โมดูล proprietary ถูกกันออกจากความสามารถของเคอร์เนลส่วนสำคัญจำนวนมาก
เจตนาของการติดป้าย GPL-only กับความเป็นจริง
- ตามทฤษฎี การติดป้าย GPL-only หมายความว่าสัญลักษณ์นั้นผูกติดกับภายในของเคอร์เนลอย่างลึกซึ้ง จนโค้ดที่ใช้มันย่อมถือเป็นงานดัดแปลงของเคอร์เนลโดยปริยาย
- แต่ในทางปฏิบัติ นักพัฒนาไม่ได้ทำการวิเคราะห์ทางกฎหมายลักษณะนั้น
- และโดยมากก็ไม่มีคุณสมบัติที่จะวิเคราะห์เช่นนั้นด้วย
- ในความเป็นจริง การทำเครื่องหมายสัญลักษณ์ให้เป็น GPL-only มักถูกใช้เป็นเครื่องมือเพื่อทำให้การพัฒนาโมดูล proprietary โดยรวมยากขึ้น
วิธีเลี่ยงแบบตัวกลางที่ถูกเปิดเผยในปี 2020
- ผู้พัฒนาโมดูล proprietary พยายามหาวิธีเลี่ยงข้อจำกัดของ GPL-only exports มานานแล้ว
- วิธีหนึ่งคือประกาศไลเซนส์ GPL-compatible แบบไม่ตรงความจริง แต่สิ่งนี้ดูเหมือนเป็นการยอมรับผิดอย่างชัดเจน จึงเป็นสิ่งที่บริษัทต่าง ๆ มักหลีกเลี่ยงโดยสัญชาตญาณ
- อีกวิธีที่แนบเนียนกว่าถูกเปิดเผยระหว่างชุดแพตช์เกี่ยวกับ peer-to-peer DMA ในปี 2020
- โครงสร้างนี้ใช้โมดูลที่ประกาศไลเซนส์เข้ากันได้กับ GPL เป็นตัวกลาง
- โมดูลนั้นสามารถเข้าถึงสัญลักษณ์ทั้งหมดที่เคอร์เนล export ได้
- จากนั้นเมื่อ import สัญลักษณ์ของโมดูล proprietary อีกต่อหนึ่ง โค้ด proprietary ก็จะเข้าถึงความสามารถของเคอร์เนลที่ต้องการได้
- นี่คือรูปแบบดัดแปลงของวิธีที่มักถูกเรียกว่า GPL condom
แพตช์ตอบโต้ในปี 2020
- ตอนนั้น Hellwig ได้รวม แพตช์ ที่ทำให้วิธีนี้ใช้งานได้ยากขึ้น
- ในเคอร์เนลปัจจุบัน โมดูลที่ใช้สัญลักษณ์ของโมดูล proprietary ก็จะถูกมองว่าเป็น proprietary เช่นกัน
- และจะสูญเสียสิทธิ์เข้าถึงสัญลักษณ์ GPL-only ทันที
- หากใช้สัญลักษณ์ GPL-only ไปแล้ว แล้วจึงพยายาม import สัญลักษณ์ของโมดูล proprietary ในภายหลัง ก็จะล้มเหลว
- การตรวจสอบนี้ปิดทางไม่ให้โมดูล GPL ทำหน้าที่เป็นตัวกลางระหว่างโมดูล proprietary กับเคอร์เนล
ช่องทางเลี่ยงใหม่ผ่าน symbol_get()
- เคอร์เนลมีแมโคร
symbol_get()โดยงานจริงทำใน__symbol_get() - ฟังก์ชันนี้ใช้ค้นหาที่อยู่ที่ผูกอยู่กับสัญลักษณ์ของเคอร์เนล
symbol_get()อยู่ในเคอร์เนลมาตั้งแต่รีลีส 2.5.48 เมื่อเดือนกุมภาพันธ์ 2002 และถูกเพิ่มเข้ามาระหว่างการเปลี่ยนระบบตัวโหลดโมดูลครั้งใหญ่- มันมีข้อจำกัดสำคัญอยู่ด้วย
- จะค้นหาเฉพาะสัญลักษณ์ที่มาจากโมดูลที่สามารถโหลดได้เท่านั้น
- จุดประสงค์คือใช้ในกรณีที่โมดูลซึ่งเชื่อมโยงกันแน่นแฟ้นต้องหลีกเลี่ยงวงอ้างอิง และต้องรับมือกับความเป็นไปได้ที่อีกฝั่งอาจยังไม่ถูกโหลด
- เมื่อดูผิวเผิน มันเหมือนจะช่วยผู้พัฒนาโมดูล proprietary ที่ต้องการเลี่ยงกติกาไม่ได้มากนัก เพราะไม่สามารถใช้ค้นหาตำแหน่งของสัญลักษณ์เคอร์เนลแบบ GPL-only ได้
วิธีที่ symbol_get() เลี่ยงการป้องกันของปี 2020
symbol_get()สามารถถูกใช้เพื่อรับ ที่อยู่ของโมดูล proprietary ได้โดยไม่ต้องผ่านกลไก import ปกติและข้อจำกัดของมัน- ด้วยเหตุนี้ การแก้ไขในปี 2020 จึงถูกเลี่ยงได้อีกครั้ง
- โมดูลที่อ้างว่าใช้ไลเซนส์ GPL สามารถเรียกโมดูล proprietary ได้
- และโมดูล proprietary นั้นก็เข้าถึงความสามารถของเคอร์เนลที่ต้องการได้
- Hellwig มองว่า NVIDIA ได้แก้โค้ดให้ใช้ช่องทางเลี่ยงนี้
การเปลี่ยนพฤติกรรมในชุดแพตช์ใหม่
- Hellwig ได้ส่ง ชุดแพตช์ เพื่ออุดช่องโหว่นี้อีกครั้ง และต่อมาก็ส่ง ฉบับแก้ไข เพิ่มเติม
- การเปลี่ยนแปลงหลักคือการปรับพฤติกรรมของ
symbol_get()- ถ้าสัญลักษณ์ที่ต้องการค้นหา ไม่ได้ถูกทำเครื่องหมายเป็น GPL-only ก็จะล้มเหลว
- นี่เป็นการตรวจสอบในทิศทางตรงข้ามกับวิธีปกติที่มักปฏิเสธการเข้าถึงสัญลักษณ์ GPL-only
- เหตุผลคือ
symbol_get()เดิมถูกออกแบบมาเพื่อความร่วมมือระดับต่ำในส่วนลึกของเคอร์เนล และในบริเวณนั้นก็คาดว่าสิ่งต่าง ๆ ควรเป็น GPL-only อยู่แล้ว - จุดใช้งานเดิมบางแห่งในเคอร์เนลอ้างถึงสัญลักษณ์ที่ไม่ได้ถูกทำเครื่องหมายเป็น GPL-only
- ชุดแพตช์นี้จึงรวมการเปลี่ยนสัญลักษณ์กรณีเหล่านั้นให้เป็น GPL-only ด้วย
ผลกระทบที่คาดและข้อจำกัด
- การเปลี่ยน
symbol_get()ครั้งนี้จะทำให้โมดูลเคอร์เนลที่ใช้ไลเซนส์ GPL ไม่สามารถใช้symbol_get()เพื่อ resolve สัญลักษณ์ภายในของโมดูล proprietary ได้อีก - หากการเปลี่ยนแปลงนี้เข้าสู่ mainline release และถูกส่งต่อไปยังดิสทริบิวชันต่าง ๆ ผู้พัฒนาโมดูล proprietary ก็จะต้องหาวิธีอื่นเพื่อเข้าถึงส่วนภายในของเคอร์เนลที่ต้องการ
- เนื่องจากผู้ดูแลโมดูล Luis Chamberlain ได้ นำการเปลี่ยนแปลงนี้ไปใช้ แล้ว โอกาสที่มันจะเข้า mainline ในท้ายที่สุดจึงดูค่อนข้างดี
- ความขัดแย้งนี้ดำเนินมานาน และก็มีความเป็นไปได้ไม่น้อยที่ผู้เขียนโมดูล proprietary จะหาวิธีอื่นมาเลี่ยงเจตนาของชุมชนเคอร์เนลอีก
- ไม่ว่าจะเป็น proprietary หรือไม่ โมดูลต่างก็ทำงานอยู่ใน พื้นที่แอดเดรสของเคอร์เนล
- พื้นที่โจมตีที่โมดูลซึ่งต้องการหลบเลี่ยงนโยบายการเข้าถึงสัญลักษณ์ของเคอร์เนลจะใช้ประโยชน์ยังมีขนาดใหญ่
- จึงยากที่จะปกป้องพื้นที่นี้ได้อย่างสมบูรณ์
- ในทางปฏิบัติ สิ่งที่ดีที่สุดที่ทำได้คือทำให้ผู้แจกจ่ายโมดูลเคอร์เนลแบบไบนารีล้วนยังคงรู้สึกไม่สะดวกต่อไป เพื่อผลักดันให้สร้างทางออกที่ใช้ไลเซนส์เสรีแทน
- วิธีนี้ไม่สมบูรณ์แบบ แต่ตลอดหลายปีที่ผ่านมาก็มักได้ผลอยู่บ่อยครั้ง
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
โค้ด linker ของเคอร์เนล Linux ถูกออกแบบมาเพื่อบังคับใช้การตีความของ Linus Torvalds ว่า GPL และข้อยกเว้นสำหรับ system call ควรทำงานอย่างไร ดังนั้นดูเหมือนจะมีช่องทางทางกฎหมายให้ Nvidia อ้างว่ามีการหลีกเลี่ยงมาตรการคุ้มครองลิขสิทธิ์ (DMCA 1201) ได้
Linus คงไม่ทำแบบนั้นจริง ๆ และถ้าทำก็คงค่อนข้างเลวร้ายต่อทั้งระบบนิเวศ FOSS ด้วย แต่พอคิดถึงสิ่งที่ Nvidia ทำมาจนถึงตอนนี้ ก็อดอยากเห็นสักครั้งไม่ได้
ถ้าแม้แต่ Linux ซึ่งเป็นกอริลลา 800 ปอนด์ในห้อง ยังไม่เต็มใจจะขึ้นศาล อนาคตของโปรเจกต์อื่น ๆ ก็ดูไม่สดใสนัก
ถ้า Linux จะใช้แค่แรงกดดันทางเทคนิคแบบ “นุ่มนวล” ต่อการละเมิดไลเซนส์และลิขสิทธิ์อย่างโจ่งแจ้งของบริษัทใหญ่ ๆ ก็ชวนให้คิดว่า GPL อาจจบแล้ว และย้ายไปใช้ทางเลือกอย่าง BSD3 หรือ MIT+Apache น่าจะดีกว่า
LLVM ไม่ใช้ copyleft แบบเข้มงวด แต่ใช้วิธีทางเทคนิคล้วน ๆ เช่น API ที่เปลี่ยนแปลงบ่อยและความเร็วในการพัฒนาที่สูงมาก เพื่อกระตุ้นให้ร่วมมือกับ upstream ซึ่งก็ทำงานได้ค่อนข้างดีโดยไม่ทำให้ไลเซนส์ที่เลือกไว้เจือจางลง
การฟ้องกลับ ที่สามารถสร้างผลกระทบจริงต่อโอกาสทางธุรกิจของ Nvidia อาจทำหน้าที่ยับยั้งปัญหาในอนาคตได้ดี
ทำนองว่า “symbol_get เดิมมีไว้เฉพาะสำหรับโมดูลที่ร่วมมือกันอย่างใกล้ชิดและใช้สัญลักษณ์ที่เป็นภายในมาก ๆ ดังนั้นจึงสมเหตุสมผลที่จะจำกัดให้ใช้ได้เฉพาะกับ EXPORY_SYMBOL_GPL และช่วยให้ Nvidia เลี่ยงคดีราคาแพงเรื่องการหลีกเลี่ยงการควบคุมการเข้าถึงตาม DMCA” เป็นถ้อยคำประชดที่ยอดเยี่ยมมากต่อการที่ Nvidia เมินเจตนาและน้ำใจอย่างโจ่งแจ้งแล้วทำตามใจตัวเอง
ฝันได้แหละ :)
[1]: https://www.youtube.com/watch?v=tQIdxbWhHSM
Linus ไม่ได้มีอำนาจพิเศษอะไร
คอมเมนต์ที่ผู้เขียนแพตช์นี้ทิ้งไว้นั้นแปลกมากจริง ๆ
https://lore.kernel.org/lkml/20230731083806.453036-6-hch@lst...
เขียนไว้ว่า “symbol_get เดิมมีไว้เฉพาะสำหรับโมดูลที่ร่วมมือกันอย่างใกล้ชิดและใช้สัญลักษณ์ที่เป็นภายในมาก ๆ ดังนั้นจึงสมเหตุสมผลที่จะจำกัดให้ใช้ได้เฉพาะกับ EXPORY_SYMBOL_GPL และช่วยให้ nvidia เลี่ยงคดีราคาแพงเรื่องการหลีกเลี่ยงการควบคุมการเข้าถึงตาม DMCA”
นี่คือความพยายามที่จะอ้างการคุ้มครองตาม ข้อห้ามการหลีกเลี่ยงของ DMCA ซึ่งทำให้การหลีกเลี่ยง DRM เป็นสิ่งผิดกฎหมาย ต่อเคอร์เนล Linux ซึ่งเป็นโปรเจกต์โอเพนซอร์สอย่างตรงตัว
ขณะเดียวกันก็เท่ากับยอมรับโดยนัยว่า EXPORT_SYMBOL_GPL เป็นระบบ DRM อย่างชัดเจน
โดยส่วนตัวผมไม่ชอบ NVIDIA และไม่ได้คิดจะปกป้องพฤติกรรมของพวกเขาเป็นพิเศษ แต่ก็น่าประหลาดใจที่โปรเจกต์ Linux อ้างว่ากฎหมายห้ามหลีกเลี่ยง DRM ใช้กับโปรเจกต์โอเพนซอร์สได้ด้วย
มันเป็นหนึ่งในกฎหมายที่ชุมชนโอเพนซอร์สแทบจะคัดค้านกันโดยทั่วไป และไม่ว่าจะเป็นระบบ DRM แบบใด ก็ดูค่อนข้างขัดกับคุณค่าของ FOSS
เป้าหมายหลักของ GPL เองก็คือการใช้กฎหมายลิขสิทธิ์ต่อสู้กับกฎหมายลิขสิทธิ์ หรือก็คือ copyleft
ยิ่งกฎหมายลิขสิทธิ์แข็งแรงขึ้น การคุ้มครองของ GPL ก็ยิ่งแข็งแรงขึ้น ดังนั้นการใช้กฎหมายลิขสิทธิ์เพิ่มเติมเพื่อปกป้องซอฟต์แวร์โอเพนซอร์สจึงค่อนข้างสอดคล้องกับจิตวิญญาณของ GPL
GPL ไม่ใช่ไลเซนส์แบบ permissive แต่เป็นไลเซนส์ copyleft ที่เข้มงวด และมีพลังบังคับใช้จริง
กลไก taint ไม่ใช่ความหน้าไหว้หลังหลอก แต่เป็นโอเพนซอร์ส และถ้าโค้ดเป็น GPL คุณก็ทำอะไรก็ได้ตามต้องการ
มันคือกลไกที่บังคับใช้ข้อกำหนดเรื่องการลิงก์ของไลเซนส์ GPL อย่างตรงตัว
เมื่อจำเป็นก็ต้องใช้กฎหมายนั้น ดังนั้นจึงไม่รู้สึกว่าแปลกเลย
ถ้าทำเรื่องน่าสงสัยมาแล้ว ยังได้รับการไว้หน้าแบบนุ่มนวลขนาดนี้ ก็ถือว่าโชคดีแล้ว
DRM เพื่อป้องกันการฉวยใช้ GPL ดูเหมือนเป็นขั้นต่อไปที่สมเหตุสมผล
ผมไม่เข้าใจว่าทำไมไดรเวอร์แบบปิดถึงไม่ควรโต้ตอบกับเคอร์เนลเสรี
Linux กำลังทำ DRM ระดับเคอร์เนลอยู่ตรง ๆ เลย ซึ่งก็คือสิ่งที่ซอฟต์แวร์เสรีเคยสาบานว่าจะทำลาย
อย่างน้อยข้อกำหนดที่ห้ามไดรเวอร์แบบปิดโต้ตอบกับโค้ดที่ใช้ได้เฉพาะ GPL นั้น ในมุมมองของผมดูใกล้เคียงกับ EULA
ถ้ามีแค่ GPLv2 อย่างเดียว โมดูลแบบปิดก็น่าจะเป็นการละเมิด
แต่เพราะ Linus ระบุชัดว่า system call ไม่ทำให้ copyleft ของ GPL ทำงาน ดังนั้นสัญลักษณ์ของเคอร์เนลที่เข้าข่าย system call ก็ไม่ทำให้ copyleft ของ GPL ทำงานเช่นกัน
ดังนั้นเพื่อหลีกเลี่ยงการละเมิดไลเซนส์ตามการตีความข้อยกเว้น GPL ของ Linus จึงต้องมี loader ที่ตรวจข้อมูลไลเซนส์ว่า symbol ใดลิงก์ได้หรือไม่ได้
นี่ใช่ DRM ระดับเคอร์เนลจริง ๆ[0] และ Linus อาจมีช่องให้โต้แย้งทางกฎหมายเรื่องที่ Nvidia หลีกเลี่ยงการป้องกันการคัดลอกได้
GPLv3 ปฏิเสธอย่างชัดเจนต่อการป้องกันการคัดลอกใด ๆ ในโค้ดที่อยู่ภายใต้ไลเซนส์ ดังนั้นในทางทฤษฎีอาจกันคดีแบบนี้ได้ แต่ข้อกำหนดนั้นยังไม่เคยถูกทดสอบในศาล และ Linus ก็ไม่ชอบ GPLv3 เป็นพิเศษเพราะมีการเพิ่มข้อกำหนด TiVo[1]
ฟีเจอร์นี้ถูกทำไว้ตั้งแต่หลายสิบปีก่อน และเป้าหมายเดิมคือไม่อยากรับบั๊กรายงานว่าเคอร์เนล Linux แครชเพราะโมดูลปิดที่แก้ไขไม่ได้
การบังคับใช้ GPL เป็นผลข้างเคียง
[0] อย่าสับสนกับ DRM อีกตัวในเคอร์เนลคือ Direct Rendering Manager
[1] ไม่ใช่ว่าไม่ชอบข้อกำหนด TiVo เองเท่าไร แต่ไม่ชอบการเพิ่มเงื่อนไขย้อนหลังให้ซอฟต์แวร์ v2 และเปลี่ยนเงื่อนไขการแลกเปลี่ยน เพราะมันให้ความรู้สึกเหมือน Linux ถูก FSF เข้าควบคุม
เพียงแต่ต้องใช้เฉพาะความสามารถของระบบปฏิบัติการที่ค่อนข้างทั่วไป ซึ่งพบได้ในเคอร์เนลที่คล้ายกันหลายตัว
ไดรเวอร์แบบนั้นที่ไม่พึ่งพาฟีเจอร์เฉพาะของ Linux ไม่อาจถือเป็น “งานดัดแปลง” ของเคอร์เนล Linux ได้ จึงเลือกไลเซนส์อะไรก็ได้ตามต้องการ
ในทางกลับกัน ไดรเวอร์ที่ใช้อินเทอร์เฟซเฉพาะของเคอร์เนล Linux ซึ่งไม่มีในระบบปฏิบัติการอื่น แม้แต่ในเคอร์เนลตระกูล Unix อื่น ๆ ตามนิยามแล้วก็ใกล้เคียงกับ “งานที่อิงจากโปรแกรม” ของเคอร์เนล ดังนั้นจึงควรถูกไลเซนส์ในลักษณะใกล้เคียงกัน
ดูถ้อยคำของ GPL-2 ที่เคอร์เนลใช้อยู่ได้
https://www.gnu.org/licenses/old-licenses/gpl-2.0.html
LGPL มีอยู่แยกต่างหากเพื่ออนุญาตให้ซอฟต์แวร์เสรีกับซอฟต์แวร์ปิดลิงก์แยกกันได้ ซึ่ง GPL ห้ามไว้
แต่ Linux เป็น GPL-2 ดังนั้นการอนุญาตเพิ่มเติมแบบนั้นจึงไม่ใช้กับกรณีนี้
ถ้าไดรเวอร์ Nvidia ใช้แค่ kernel API ทั่วไปก็คงไม่เป็นไร แต่ในความเป็นจริงไม่ใช่อย่างนั้น
เพราะพยายามใช้ API เฉพาะ Linux ที่ทำเครื่องหมายไว้ให้ไดรเวอร์ที่มีไลเซนส์เข้ากันได้กับ GPL ใช้ ในสถานะที่ไม่ใช่ GPL จึงเป็นการละเมิด ไลเซนส์ซอฟต์แวร์เสรี ที่ Linux แจกจ่ายอยู่โดยชัดเจน
ทำไมซอฟต์แวร์ปิดถึงควรได้รับผลประโยชน์ทั้งหมดของซอฟต์แวร์เสรีโดยไม่ต้องทำตามกฎใด ๆ แล้วซอฟต์แวร์เสรีต้องได้แต่อดทน?
แม้แต่สังคมประชาธิปไตยก็ยังมีกลไกที่จำกัดการแสดงออกในระดับหนึ่งเพื่อปกป้องตัวเอง
ระบบปฏิบัติการแบบปิดมีอยู่มากมายอยู่แล้ว และไม่ได้สนใจเรื่องแบบนั้นเลย
จะมีระบบปฏิบัติการที่ใส่ใจหลักการแบบนั้นบ้างไม่ได้หรือ? ทุกอย่างจำเป็นต้องเป็นเพียงเครื่องมือที่เย็นชา เป็นมิตรต่ออุตสาหกรรม และไร้ความคำนึงถึงมนุษย์เท่านั้นหรือ?
เจตนาของไลเซนส์คือทุกอย่างที่ลิงก์และโหลดเข้ากับเคอร์เนลต้องถูกแจกจ่ายภายใต้ไลเซนส์ copyleft ที่เข้ากันได้
ข้อกำหนดที่ว่าโค้ดปิดไม่ควร “รวม” โค้ด GPL ก็คือตัว GPL เอง และเป็นเป้าหมายหลักของ GPL
อย่างไรก็ตาม ยังมีประเด็นให้ถกเถียงได้ว่าการลิงก์กับ API เพียงอย่างเดียวถือเป็นการละเมิดถึงระดับใด
ดูเหมือนว่าศาลอาจตัดสินได้ทั้งสองทาง และการตัดสินแบบนั้นจะส่งผลอย่างมากต่อ GPL
โค้ดของ Nvidia ทำงานใน ring0 ดังนั้นจากประสบการณ์แล้ว Nvidia ยังมีกลเม็ดที่น่าสนใจกว่านี้ให้ใช้ได้อีกมาก แต่ตอนนี้คงกำลังยั้งมืออยู่
ฝั่งนักพัฒนา Linux ก็เช่นกัน
สงคราม DRM โง่ ๆ แบบนี้ไม่ช่วยใครเลย และมีแต่จะยิ่งกระตุ้นเกมแมวจับหนูที่เสียเวลาของทุกฝ่าย
“พวกนาย อยู่ร่วมกันดี ๆ เถอะ”
ผมไม่เข้าใจว่าทำไม Nvidia ถึงทุ่มแรงมากขนาดนั้นเพื่อคงไดรเวอร์ไว้เป็น ก้อน binary แบบปิด
ซอฟต์แวร์ก็ไม่ใช่แกนหลักของการป้องกันตัวของพวกเขา และ Nvidia ก็เป็นบริษัทฮาร์ดแวร์
การเปิดเผยโมดูลเคอร์เนลไม่เพียงไม่กระทบยอดขายฮาร์ดแวร์ แต่ยังช่วยให้เสถียรขึ้น และยังได้คะแนนนิยมจากนักพัฒนาที่ตั้งใจหันไปซื้อ AMD GPU อีกด้วย
เพราะการกลายเป็นสินค้าโภคภัณฑ์อยู่ตรงข้ามกับอัตรากำไรหนา ๆ
เมื่อครองตลาด GPU ราว 80% แล้ว หากอยากเพิ่มอัตรากำไรให้สูงขึ้น ก็ทำได้ง่ายกว่าด้วยการตั้งราคาให้แรงขึ้น หรือควบคุมชั้นที่สูงกว่าของสแต็กทั้งหมด
เช่น ถ้า ภาษา GPU แบบใช้งานทั่วไป หลัก ๆ ถูกสร้างโดยมีสถาปัตยกรรม GPU ของตนเป็นศูนย์กลาง ก็ย่อมได้เปรียบ
ไม่อย่างนั้นก็ต้องขยายไปสู่领域ที่ต่างไปโดยสิ้นเชิง และที่ Nvidia กระโดดเข้าสู่ AI อย่างหนักก็เพราะสามารถใช้ความเหนือกว่าด้าน GPU เพื่อคว้าความได้เปรียบช่วงต้นใน领域นั้นได้
แต่ไม่มีหลักฐานนะ
คำว่า “ผิดกฎหมาย” เป็นเพียงทฤษฎีเท่านั้นจนกว่าจะได้รับการพิสูจน์ในศาล
สิ่งที่พูดถึงในที่นี้โดยพื้นฐานแล้วคือ DRM ภายในโค้ดเคอร์เนล ซึ่งพยายามป้องกันไม่ให้โมดูลเคอร์เนลที่โหลดได้เดาว่าโครงสร้างข้อมูลของเคอร์เนลอยู่ตรงไหนในหน่วยความจำ
เพราะรู้ว่าผู้คนมีแนวโน้มจะพยายามดันขอบเขตให้สุด จึงพยายามทำให้มันยากที่สุดเท่าที่ทำได้ในฐานะมาตรการยับยั้ง
แต่ก็อาจโต้แย้งได้ว่าโมดูลเคอร์เนลแบบโหลดได้ที่เป็นซอร์สปิดทั้งหมดละเมิด GPL เหมือนกัน ไม่ว่าจะมี “shim” หรือไม่ และที่จริงก็เคยมีข้อโต้แย้งแบบนั้น แต่คนส่วนใหญ่ลืมไปแล้ว แล้วใช้เรื่องแต่งเรื่อง DRM นี้ราวกับเป็นสิ่งทดแทนเรื่องแต่งทางกฎหมาย
หรือถ้าฟังก์ชันที่ติดแท็ก GPL ในเคอร์เนลเข้าข่ายเป็น API ตามความหมายในคดี Google กับ Oracle การถกเถียงทั้งหมดนี้ก็อาจไม่มีความหมายมากนัก
โมดูลเคอร์เนลที่โหลดได้ส่วนใหญ่อยู่ในซอร์สทรีของเคอร์เนลและเผยแพร่ภายใต้ GPL
ขั้นถัดไปก็แค่สร้างโมดูลโหลดได้แบบโอเพนซอร์สที่มีเครื่องเสมือนขนาดเล็กซึ่งโหลดก้อนข้อมูลไบนารีใน user mode
ให้รันเฉพาะก้อนไบนารีที่เซ็นด้วยคีย์ส่วนตัวของ NVIDIA และใส่คีย์สาธารณะไว้ในโมดูลโอเพนซอร์ส
หรือไม่ก็สร้างไฮเปอร์ไวเซอร์ที่ทำ virtualization ให้ Linux เพื่อเลี่ยงเคอร์เนลส่วนใหญ่ไปเลย…
ยังไงก็มีทางเสมอ
นี่แค่ทำให้น่ารำคาญและเพิ่มต้นทุนในการได้ไดรเวอร์ดี ๆ สำหรับ Linux ดังนั้นความพยายามที่ทุ่มไปทางนั้นก็จะลดลง
ยังไม่ชัดเจนว่านั่นเป็นการสูญเสียครั้งใหญ่หรือไม่
หวังว่าการต่อสู้นี้จะไม่ลงเอยด้วยการที่ไดรเวอร์ Nvidia สำหรับ Linux หายไปหรือแย่ลง
ถ้าไม่มีไดรเวอร์นั้น ระบบปฏิบัติการที่ผมชอบจะมีประโยชน์น้อยลงทันทีเพราะเกมและ AI
เมื่อ 10 ปีก่อนต่างออกไป
ตอนนั้นส่วนใหญ่มีแค่กี๊ก Linux ส่วนน้อยที่อยากเล่นเกมบน Linux เท่านั้นที่สนใจ และพวกเขาเป็นสัดส่วนเล็กน้อยของยอดขาย
ตอนนี้มูลค่ากิจการเกือบทั้งหมดของ NVIDIA ตั้งอยู่บน AI และผู้เล่นรายใหญ่แทบทั้งหมดที่ซื้อฮาร์ดแวร์นั้นในปริมาณมากก็ใช้มันบน Linux
การตัดขาดจาก Linux ไม่ใช่ตัวเลือกสำหรับ NVIDIA
มีแนวโน้มสูงว่าจะทำทุกอย่างเพื่อไม่ให้เรื่องนั้นเกิดขึ้น
คือถอดการสนับสนุนทั้งหมดออกจนกว่า nVidia จะเปิดเผยซอร์ส
แต่ทุกวันนี้บริษัทเชิงพาณิชย์มีสิทธิ์มีเสียงมากกว่าเราในเรื่องว่าจะใช้และสนับสนุนฮาร์ดแวร์บน Linux อย่างไร
Nvidia ได้เปิดซอร์สไดรเวอร์ หรือบางส่วนของไดรเวอร์แล้ว และตอนนี้ยังมี ไบนารีเฟิร์มแวร์ ที่สามารถแจกจ่ายต่อได้ด้วย
นอกจากนี้ การยืนยันตัวตนเฟิร์มแวร์บนการ์ดรุ่นเก่าบางรุ่นก็ถูกเจาะได้แล้ว
ดังนั้นจึงหวังว่าเมื่อเวลาผ่านไป ความสำคัญของไดรเวอร์กรรมสิทธิ์จะลดลง
ในระดับเคอร์เนล นี่กลายเป็นเรื่อง “บิตของคุณเป็นสีอะไร”[1] แล้วสินะ… ก็ดีนะ?
[1] https://ansuz.sooke.bc.ca/entry/23