แผนผังแหล่งที่มาของเคอร์เนลประกอบด้วยอะไร? สิ่งนี้เกี่ยวข้องกับส่วนหัวเคอร์เนลของ Linux หรือไม่


25

ในหนังสือที่ผมมักจะอ่านอ้างอิงถึงแหล่งที่มาของลินุกซ์ที่ต้นไม้/usr/src/linuxกับชุดปกติของไดเรกทอรีย่อย ( arch, block, crypto, ... )

ฉันคาดหวังว่าต้นไม้ต้นนี้จะมีไฟล์ไบนารีที่สร้างเคอร์เนล ในระบบของฉัน (Ubuntu 10.04) ...

  1. สำหรับเมล็ดที่แตกต่างกันที่ฉันมี (โดยใช้การดาวน์โหลดซอฟต์แวร์อัตโนมัติไม่ได้ติดตั้งด้วยตนเอง) ฉันค้นหาในตำแหน่งนี้แทนสองไดเรกทอรีย่อยสำหรับแต่ละเคอร์เนลดังนี้

    /usr/src/linux-headers-2.6.32-22
    /usr/src/linux-headers-2.6.32-22-generic
    
  2. ในไดเรกทอรีย่อยฉันคาดว่าไฟล์ไบนารีหมู่คนอื่น ๆ อย่างไรก็ตามฉันตรวจสอบจำนวนต้นไม้ที่เหมาะสมและไดเรกทอรีย่อยสุดท้ายจากที่นี่ดูเหมือนจะมีเสมอMakefile(เมื่ออ่านมันมักจะฟังดูเหมือนไฟล์กำหนดค่าแล้วเป็นไฟล์ติดตั้ง) รวมถึงไฟล์อื่น ๆ ที่แยกบางครั้ง (ส่วนใหญ่Kconfig)

คำถามของฉันอาจไร้เดียงสา แต่ฉันสับสนเล็กน้อย คือ (2) สิ่งที่ฉันควรคาดหวังให้เห็นในแผนผังแหล่งที่มาของเคอร์เนล และทำไมฉันจึงมีการอ้างอิงที่ชัดเจนถึง 'ส่วนหัว' ฉันจำเป็นต้องติดตั้งlinux-generic-headersในขณะที่กลับไปหาซอฟต์แวร์อื่นและไม่แน่ใจว่าสิ่งนี้อาจเกี่ยวข้อง ฉันรู้ว่ามีเหตุผลที่ดีสำหรับ makefiles (เช่นการติดตั้งโมดูลในไดเร็กตอรี่ย่อย / ไดร์เวอร์), แต่ (มาก) makefiles เท่านั้น?

คำตอบ:


30

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

คุณไม่ควรคาดหวังว่าจะหาไฟล์ไบนารี่ได้เลยในไดเรกทอรีซอร์สเคอร์เนลยกเว้นเอาต์พุตบิลด์ (หากคุณกำหนดค่าและสร้างเคอร์เนลเองไดเรกทอรีแหล่งเคอร์เนลจะประกอบด้วยวัตถุที่รวบรวมโมดูลเคอร์เนลที่สร้างขึ้นเองและไบนารีบิตและชิ้นส่วนอื่น ๆ ที่ทำให้มันทำงาน)
KConfigไฟล์เป็นคำอธิบายของตัวเลือกการกำหนดค่าเคอร์เนล (และการอ้างอิงของพวกเขา) ที่มีอยู่สำหรับไดเรกทอรี / โมดูลที่กำหนด
นอกเหนือจากนั้นมันคือทั้งหมด (ส่วนใหญ่) ซอร์สโค้ด C, ไฟล์ส่วนหัวและMakefiles มีสคริปต์ผู้ช่วยไม่กี่ที่นี่และที่นั่นและแหล่งที่มาประกอบเช่นกัน

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

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

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

โมดูลเคอร์เนลที่ติดตั้งอยู่ในไดเรกทอรีย่อยของ:

/lib/modules/`uname -r`/

ดังนั้นตัวอย่างเช่นในระบบของฉันพวกเขากำลังเข้า

/lib/modules/3.1.4-gentoo/

รหัสที่มาเต็มเคอร์เนล : ในอูบุนตูถ้าคุณต้องการแหล่งเคอร์เนลเต็มรูปแบบที่จะสร้างเคอร์เนลตัวคุณเองคุณควรติดตั้งตามคำแนะนำที่นี่

นอกจากนี้คุณยังสามารถดาวน์โหลด tarball แหล่งที่มาจากkernel.orgและแกะมันอยู่ที่ไหนสักแห่ง (ทำไม่ได้เขียนทับไฟล์อูบุนตูที่ติดตั้งถ้าคุณใช้ tarball นี้ให้สิ่งที่ส่วนบุคคลของคุณและสิ่งที่มีการจัดการโดยรอบต่อนาทีที่แยกต่างหาก)

/usr/src/linuxเป็นสถานที่ดั้งเดิมที่จะวางเคอร์เนล แต่ไม่มีสิ่งใดป้องกันคุณจากการวางเคอร์เนลที่อื่น เส้นทางนี้มักจะเป็นเพียงลิงค์สัญลักษณ์ไปยังไดเรกทอรี เช่นฉันมีสิ่งนี้ในเครื่องของฉัน:

 $ ls -l /usr/src/linux
lrwxrwxrwx 1 root root 18 Dec  7 17:03 /usr/src/linux -> linux-3.1.4-gentoo

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


ขอบคุณมากสำหรับคำตอบที่ละเอียดและค่อนข้างสมบูรณ์ สิ่งนี้ได้ดักฟังฉันมาระยะหนึ่งแล้ว ถ้าฉันไม่ยินดีต้อนรับเกินเหตุและหากคุณพบเวลาฉันสามารถเพิ่มได้โปรดติดตาม: (a) ฉันอ่านข้างต้นว่าในกรณีของฉัน (ไม่ใช่เคอร์เนลที่ติดตั้งเอง) บางส่วน (หนึ่ง) ของย่อย ไดเร็กทอรีควร (อาจ) มีเคอร์เนล C และซอร์สโค้ดแอสเซมเบลอร์ นั่นจะเป็นอย่างไร - ไม่ใช่รายการที่สมบูรณ์เพียงแค่ในการเรียกดูไดเรกทอรีย่อย 20-30 รายการฉันไม่เคยเจอเลยใช่ไหม ฉันได้ดาวน์โหลดไฟล์ต้นฉบับเคอร์เนลจาก kernel.org; ฉันหมายถึงเข้าใจระบบของฉันดีขึ้น (b) ...
gnometorule

... ดังนั้นที่ไหน (โดยทั่วไป) เคอร์เนลเคอร์เนลตั้งอยู่เมื่อคุณไม่ได้ติดตั้งเคอร์เนลด้วยตัวคุณเองเหมือนในกรณีของฉัน (c) คุณอ้างถึง "แพ็คเกจส่วนหัว" ซึ่งฉันใช้เป็น 'linux-generic-headers' ต้นไม้ที่ฉันเห็นจากแพ็คเกจเหล่านั้นเป็นไหม ถ้าใช่พวกเขาจะย้ายที่ใดก็ตามที่ต้นไม้ต้นกำเนิดก่อนที่จะติดตั้งหรือไม่ ขอบคุณมากอีกครั้ง
gnometorule

(ถ้าคุณตอบให้ใช้ 'ตอบ' ไม่แสดงความคิดเห็นเพื่อให้ฉันสามารถ upvote คุณอีกครั้งสำหรับความช่วยเหลือของคุณ)
gnometorule

ขยายตัวเล็กน้อย แพ็คเกจส่วนหัวใช้สำหรับส่วนหัว แพคเกจเต็มรูปแบบให้รหัสต้นฉบับเต็ม แพคเกจไบนารีให้ไบนารีเท่านั้น
Mat

5
linux-sourceมีแหล่งที่มาอัปสตรีมapt-get source linux-image-$(uname -r)รับซอร์สสำหรับเคอร์เนลที่มีโปรแกรมแก้ไขของ Ubuntu
Lekensteyn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.