การวิเคราะห์เชิงทดลอง: https://www.zhihu.com/column/c_142990858
Linux เป็นระบบปฏิบัติการโอเพนซอร์ส ผู้ใช้สามารถปรับแต่งและปรับเปลี่ยนเคอร์เนลตามระบบของตนเองจำเป็นต้องปรับแต่งระบบด้วยฟังก์ชั่นที่เหมาะสมกว่าและประสิทธิภาพการทำงานที่สูงขึ้น ดังนั้นการรวบรวมเคอร์เนล Linux จึงเป็นทักษะพื้นฐานที่จำเป็นสำหรับการพัฒนาเคอร์เนล
การเพิ่มการโทรระบบใหม่ตามต้องการในระบบเป็นวิธีทั่วไปในการปรับเปลี่ยนเคอร์เนล จากการทดลองนี้ผู้อ่านควรเข้าใจกระบวนการของระบบประมวลผลระบบ Linux และวิธีการเพิ่มการเรียกระบบ
(1) เพิ่มการเรียกระบบเพื่อใช้ฟังก์ชั่นการปรับเปลี่ยนหรือการอ่านของค่าที่ดีของกระบวนการที่ระบุและส่งคืนค่าที่ดีล่าสุดและลำดับความสำคัญของกระบวนการ ขอแนะนำให้เรียกต้นแบบเป็น:
int mySetNice (pid_t pid, int flag, int nicevalue, void __user * prio, void __user * nice);
พารามิเตอร์ความหมาย: PID: รหัสกระบวนการ
ธง: หากค่าคือ 0 มันหมายถึงการอ่านค่าที่ดี; หากค่าคือ 1 มันหมายถึงการปรับเปลี่ยนค่าที่ดี
Prio, Nice: ลำดับความสำคัญปัจจุบันและคุณค่าที่ดีของกระบวนการ ค่าส่งคืน: ส่งคืน 0 เมื่อการเรียกระบบสำเร็จและส่งคืนรหัสข้อผิดพลาด eFault เมื่อการเรียกระบบล้มเหลว
(2) เขียนการทดสอบแอปพลิเคชันอย่างง่ายเพิ่มใน (1)
(3) หากฟังก์ชั่นเคอร์เนลของ Linux ถูกเรียกในโปรแกรมจะต้องอ่านซอร์สโค้ดของฟังก์ชันที่เกี่ยวข้องในเชิงลึก
กลไกโมดูลที่จัดทำโดย Linux สามารถขยายฟังก์ชั่น Linux แบบไดนามิกโดยไม่ต้องคอมไพล์เคอร์เนลใหม่และถูกนำมาใช้อย่างกว้างขวางในการใช้งานฟังก์ชั่นจำนวนมากของเคอร์เนล Linux ในการทดลองนี้เราจะได้เรียนรู้แนวคิดพื้นฐานหลักการและเทคนิคการใช้งานของโมดูลจากนั้นใช้โมดูลเคอร์เนลเพื่อโปรแกรมและเข้าถึงข้อมูลพื้นฐานของกระบวนการซึ่งจะทำให้เราเข้าใจแนวคิดกระบวนการและเทคนิคการเขียนโปรแกรมโมดูล
(1) ออกแบบโมดูลที่ต้องแสดงชื่อโปรแกรมหมายเลข PID สถานะกระบวนการและลำดับความสำคัญของกระบวนการของเธรดเคอร์เนลทั้งหมดในระบบ
(2) ออกแบบโมดูลที่มีพารามิเตอร์ซึ่งพารามิเตอร์คือหมายเลข PID ของกระบวนการ ฟังก์ชั่นของโมดูลนี้คือการแสดงข้อมูลครอบครัวของกระบวนการรวมถึงชื่อโปรแกรมและหมายเลข PID ของกระบวนการหลักกระบวนการพี่ชายและกระบวนการเด็ก
(3) โปรดอ่านการใช้งานซอร์สโค้ดเพิ่มเติมของฟังก์ชั่นเคอร์เนลที่เกี่ยวข้องที่ใช้ในโปรแกรมตามสถานการณ์ของคุณเอง
(1) ทำความคุ้นเคยกับอินเทอร์เฟซคำสั่งของ Linux
(2) ผ่านแอปพลิเคชันการเขียนโปรแกรมของระบบที่เกี่ยวข้องเรียกร้องให้มีการควบคุมกระบวนการ Linux เราจะเพิ่มความเข้าใจของเราเกี่ยวกับแนวคิดกระบวนการให้ชัดเจนขึ้นการเชื่อมต่อและความแตกต่างระหว่างกระบวนการและโปรแกรมและเข้าใจความหมายเฉพาะของการดำเนินการพร้อมกันของกระบวนการ
(3) ผ่านการใช้กลไกการสื่อสารไปป์ไลน์ของ Linux กลไกการสื่อสารคิวข้อความและกลไกการสื่อสารหน่วยความจำที่ใช้ร่วมกันทำให้ความเข้าใจของวิธีการสื่อสารกระบวนการต่าง ๆ ลึกซึ้งยิ่งขึ้น
(4) ความเข้าใจที่ลึกซึ้งยิ่งขึ้นของกลไกการซิงโครไนซ์ Semaphore ผ่านการประยุกต์ใช้ semaphores posix ใน Linux (5) โปรดอ่านและวิเคราะห์การใช้งานซอร์สโค้ดเคอร์เนลเพิ่มเติมของการโทรระบบที่เกี่ยวข้องตามสถานการณ์ของคุณเอง
(1) คุ้นเคยกับคำสั่ง Linux ทั่วไป: PWD, UserAdd, Passwd, WHO, PS, Pstree, Kill, Top, LS, CD, MKDIR, RMDIR, CP, RM, MV, CAT, More, Grep ฯลฯ
(2) ใช้เชลล์จำลอง:
เขียนโปรแกรมที่แตกต่างกันสามโปรแกรม cmd1.c, cmd2.c และ cmd3.c ฟังก์ชั่นของแต่ละโปรแกรมได้รับการปรับแต่งและรวบรวมไว้ในไฟล์ปฏิบัติการ CMD1, CMD2 และ CMD3 ตามลำดับ จากนั้นเขียนโปรแกรมเพื่อจำลองฟังก์ชั่นของโปรแกรมเชลล์ มันสามารถสร้างกระบวนการเด็กสำหรับคำสั่งที่เกี่ยวข้องตามสตริงที่ป้อนโดยผู้ใช้ (แสดงชื่อคำสั่งที่เกี่ยวข้อง) และปล่อยให้มันดำเนินการโปรแกรมที่เกี่ยวข้อง กระบวนการหลักจะรอให้กระบวนการเด็กสิ้นสุดลงแล้วรอคำสั่งถัดไปที่จะได้รับ หากคำสั่งที่ได้รับคือออกกระบวนการแม่จะสิ้นสุดลง หากคำสั่งที่ได้รับเป็นคำสั่งที่ไม่ถูกต้อง "ไม่พบคำสั่ง" จะปรากฏขึ้นและคุณจะรอต่อไป
(3) ใช้โปรแกรมการสื่อสารไปป์ไลน์:
ไปป์ไลน์ถูกสร้างขึ้นโดยกระบวนการหลักและจากนั้นกระบวนการเด็ก 3 กระบวนการจะถูกสร้างขึ้นและกระบวนการเด็กทั้งสามนี้ใช้ท่อส่งข้อมูลเพื่อสื่อสารกับกระบวนการหลัก: กระบวนการเด็กส่งข้อมูลและกระบวนการหลักและกระบวนการเด็กอีกสามกระบวนการได้รับข้อมูลหลังจากส่งข้อความทั้งหมด เนื้อหาเฉพาะของการสื่อสารสามารถออกแบบได้ตามความต้องการของคุณเองและจำเป็นต้องทดสอบสถานการณ์ต่าง ๆ ในกระบวนการอ่านและการเขียนการทดสอบขนาดเริ่มต้นของท่อและใช้กลไก posix semaphore เพื่อให้ได้การเข้าถึงท่อระหว่างกระบวนการ เรียกใช้โปรแกรมเพื่อสังเกตจำนวนไบต์ที่อ่านและเขียนโดยกระบวนการและการบล็อกกระบวนการและการปลุกภายใต้สถานการณ์ต่าง ๆ
(4) ใช้กลไกการสื่อสารคิวข้อความของ Linux เพื่อตระหนักถึงการสื่อสารระหว่างสองเธรด:
เขียนโปรแกรมเพื่อสร้างสองเธรด: เธรดผู้ส่งและรับเธรดที่เธรดผู้ส่งเรียกใช้ฟังก์ชันผู้ส่ง () ซึ่งสร้างคิวข้อความจากนั้นวนลูปเพื่อรอให้ผู้ใช้ป้อนสตริงอักขระผ่านเทอร์มินัลส่งสตริงของอักขระไปยังเธรดผู้รับผ่านคิวข้อความ ในที่สุดมันจะส่งข้อความ "สิ้นสุด" ไปยังเธรดตัวรับสัญญาณและรอการตอบกลับของผู้รับ หลังจากข้อความตอบกลับจะแสดงข้อมูลการตอบกลับที่ได้รับบนหน้าจอเทอร์มินัลลบคิวข้อความที่เกี่ยวข้องและสิ้นสุดการทำงานของโปรแกรม เธรดตัวรับสัญญาณจะได้รับ () ซึ่งได้รับข้อความจากผู้ส่งผ่านคิวข้อความและแสดงข้อความบนหน้าจอเทอร์มินัลจนกว่าจะได้รับข้อความที่มี "สิ้นสุด" ในเวลานี้มันจะส่งข้อความคำตอบ "over" ไปยังผู้ส่งสิ้นสุดการทำงานของโปรแกรม ใช้ semaphores นิรนามเพื่อให้ได้การซิงโครไนซ์และการยกเว้นซึ่งกันและกันระหว่างสองเธรด
(5) ใช้กลไกการสื่อสารหน่วยความจำที่ใช้ร่วมกันของ Linux เพื่อตระหนักถึงการสื่อสารระหว่างสองกระบวนการ:
เขียนผู้ส่งโปรแกรมซึ่งสร้างหน่วยความจำที่ใช้ร่วมกันจากนั้นรอให้ผู้ใช้ป้อนสตริงอักขระผ่านเทอร์มินัลและส่งสตริงของอักขระไปยังตัวรับสัญญาณผ่านหน่วยความจำที่ใช้ร่วมกัน ในที่สุดก็รอการตอบกลับของผู้รับ หลังจากได้รับข้อความตอบกลับจะแสดงข้อมูลการตอบกลับที่ได้รับบนหน้าจอเทอร์มินัลลบหน่วยความจำที่ใช้ร่วมกันและสิ้นสุดการทำงานของโปรแกรม เขียนโปรแกรมตัวรับสัญญาณซึ่งได้รับข้อความจากผู้ส่งผ่านหน่วยความจำที่ใช้ร่วมกันแสดงข้อความบนหน้าจอเทอร์มินัลจากนั้นส่งข้อความคำตอบ "ผ่าน" ไปยังผู้ส่งผ่านหน่วยความจำที่ใช้ร่วมกันสิ้นสุดการทำงานของโปรแกรม ใช้เซมาฟอร์ที่มีชื่อหรือระบบ System V Semaphore เพื่อให้ได้การใช้หน่วยความจำที่ใช้ร่วมกันซึ่งกันและกันร่วมกันและซิงโครนัสโดยสองกระบวนการ
ผ่านการจัดการพื้นที่จัดเก็บไฟล์เฉพาะโครงสร้างทางกายภาพของไฟล์โครงสร้างไดเรกทอรีและการดำเนินการไฟล์เราจะทำให้เราเข้าใจโครงสร้างข้อมูลภายในฟังก์ชั่นและกระบวนการการนำไปใช้งานของระบบไฟล์ให้ลึกซึ้งยิ่งขึ้น
(1) เปิดพื้นที่ดิสก์เสมือนในหน่วยความจำเป็นพาร์ติชันไฟล์จัดเก็บไฟล์และใช้ระบบไฟล์อย่างง่ายในระบบงานเดียวของผู้ใช้เดี่ยวตามไดเรกทอรีหลายระดับ เมื่อออกจากระบบไฟล์ระบบไฟล์เสมือนควรถูกบันทึกลงในดิสก์เป็นไฟล์เพื่อให้สามารถกู้คืนไปยังพื้นที่ดิสก์เสมือนในหน่วยความจำในครั้งต่อไป
(2) การจัดสรรพื้นที่จัดเก็บไฟล์สามารถทำได้โดยการจัดสรรลิงก์ที่ชัดเจนหรือวิธีการอื่น ๆ
(3) คุณสามารถเลือกไดอะแกรมบิตหรือวิธีอื่น ๆ ในการจัดการพื้นที่ดิสก์ฟรี หากใช้บิตแมปเพื่อจัดการพื้นที่จัดเก็บไฟล์และใช้การจัดสรรลิงก์ที่ชัดเจนการบิตแมปสามารถรวมเข้ากับไขมันได้
(4) โครงสร้างไดเรกทอรีไฟล์ใช้โครงสร้างไดเรกทอรีหลายระดับ เพื่อความเรียบง่ายโหนดดัชนีสามารถใช้งานแต่ละรายการไดเรกทอรีควรมีข้อมูลเช่นชื่อไฟล์ที่อยู่ทางกายภาพความยาว ฯลฯ และไฟล์อ่านและเขียนยังสามารถป้องกันได้ผ่านรายการไดเรกทอรี
(5) จำเป็นต้องมีคำสั่งการดำเนินการต่อไปนี้: