การจัดสรรหน่วยความจำต่อเนื่องที่ปักหมุดไว้มากกว่า 4 MB ใน Linux Kernel

สำหรับการโต้ตอบกับอุปกรณ์ PCI ที่กำลังถูกสร้างขึ้น เราต้องการสร้างหน่วยความจำขนาดใหญ่ที่ต่อเนื่องกันซึ่งบอร์ดสามารถเข้าถึงได้ ดังที่เป็นอยู่ตอนนี้ หน่วยความจำที่ใหญ่ที่สุดที่ฉันสามารถจัดสรรได้คือขนาด 4 เมกะไบต์ ฉันสงสัยว่ามีวิธีใดในการสร้างภูมิภาคที่ใหญ่ขึ้นหรือไม่

ฉันรู้ว่าฉันสามารถใช้ตัวเลือกการบูต mem= เพื่อทำสิ่งนี้ได้ แต่ด้วยเหตุผล numa ฉันไม่อยากไปทางนี้ ในทางกลับกัน หากมีใครรู้วิธีการทำเช่นนี้ แต่แจกจ่ายมันไปยังโหนด numa ก็คงไม่เป็นไร

อย่างที่ฉันบอกไปในตอนแรก ตอนนี้ฉันจำกัดไว้ที่ 4 เมกะไบต์ ขณะนี้การจัดสรรเสร็จสิ้นโดย __alloc_pages ซึ่งก็คือ จำกัดโดย MAX_ORDER MAX_ORDER เป็นค่าคงที่เวลาคอมไพล์ และฉันก็กังวลด้วยว่าการแก้ไขอาจส่งผลกระทบที่อื่น

ขอบคุณ.


person Bill Lynch    schedule 09.05.2011    source แหล่งที่มา
comment
ส่วนหน่วยความจำจะต้องอยู่ติดกันทางกายภาพหรือไม่?   -  person Michael Foukarakis    schedule 18.05.2011
comment
@ไมเคิล: ใช่ ไม่เช่นนั้น ฉันจะจัดสรร 4MB ด้วย __alloc_pages หลายครั้ง   -  person Bill Lynch    schedule 18.05.2011


คำตอบ (2)


หากคุณสามารถคอมไพล์ไดรเวอร์อุปกรณ์ PCI ของคุณลงในเคอร์เนล (ซึ่งก็คือไม่ได้เชื่อมโยงเป็นโมดูล) คุณสามารถลองจัดสรรหน่วยความจำในเวลาบูตได้ ซึ่งจะช่วยให้คุณข้ามขอบเขตบนของการจัดสรรแบบไดนามิกได้ โปรดดูที่ ไดรเวอร์อุปกรณ์ Linux, ed. 3 ช. 8 สำหรับรายละเอียด

person Karmastan    schedule 09.05.2011
comment
ใช่. ฉันเคยเห็นสิ่งนี้มาก่อนเช่นกัน อย่างไรก็ตาม ฉันอยากจะทำสิ่งนี้ได้โดยไม่ต้องคอมไพล์เคอร์เนลใหม่ มันไม่ใช่สิ่งที่ฉันอยากจะรับผิดชอบ - person Bill Lynch; 10.05.2011
comment
@sharth: ฉันคิดว่าทางเลือกอื่นของคุณเพิ่มขึ้น MAX_ORDER เป็นการเรียกของคุณว่าการคอมไพล์เคอร์เนลใหม่นั้นเป็นที่ต้องการน้อยกว่า - person Karmastan; 10.05.2011
comment
ณ ขณะนี้ มีแผนจะทำการจัดสรรจำนวนมากเมื่อใกล้ถึงเวลาบูต จากนั้นดูว่าส่วนใดบ้างที่ต่อเนื่องกันและปล่อยส่วนที่เหลือกลับคืนมา ฉันจะเป็นแฟนตัวยงของวิธีแก้ปัญหาที่สอดคล้องกันมากกว่านี้ - person Bill Lynch; 10.05.2011

CMA(Contiguous Memory Allocator) เป็นทางออกที่ดีที่สุดสำหรับ IMO ที่คุณต้องการ คุณเพียงแค่ต้องจัดส่งไปยังเคอร์เนลใหม่ล่าสุด

person Lai Jiangshan    schedule 14.07.2012
comment
ฉันเพิ่งค้นหาข้อมูลติดตามผลเกี่ยวกับเรื่องนี้ และฉันสงสัยว่าคุณจะอธิบายให้ชัดเจนได้ไหม จากสิ่งที่ฉันเห็น คุณจะต้องสร้างอาร์กิวเมนต์เวลาบูตเพื่อระบุจำนวนหน่วยความจำที่ควรสำรองไว้ หากเป็นกรณีนี้ ตัวเลือก mem= จะคล้ายกัน (แต่สะอาดกว่า ปลอดภัยกว่า และดีกว่า) นอกจากนี้ จากสิ่งที่ฉันเห็น มันไม่ได้อยู่ใน 3.4.4 หรือถัดไป-20120713 มีการนำเข้าสู่กระแสหลักจริงหรือ? - person Bill Lynch; 14.07.2012
comment
@sharth mem= บังคับให้เคอร์เนลไม่เข้าถึงหน่วยความจำที่สูงขึ้นและเหลือหน่วยความจำบางส่วนไว้สำหรับความต้องการของไดรเวอร์ แต่ผู้ใช้จำเป็นต้องทำสิ่งต่าง ๆ เพิ่มเติมเพื่อจัดการหน่วยความจำที่เหลือเท่าที่ฉันรู้ และหน่วยความจำนั้นไม่สามารถใช้งานได้แม้ว่าจะว่าง/ใช้งานได้ก็ตาม (เช่นเดียวกับ bootmem) หน่วยความจำ CMA สามารถใช้ได้กับระบบอื่น (พื้นที่ผู้ใช้เป็นหลัก) และหากไดรเวอร์ต้องการหน่วยความจำนั้น การจัดการหน่วยความจำจะเรียกคืนหน่วยความจำ CMA สำหรับไดรเวอร์ ไม่มีอะไรเสีย และ CMA ผสาน เข้าสู่เวอร์ชันหลักแล้วในขณะนี้ ใน 3.5 แต่เวอร์ชันใหม่ล่าสุดคือ v3.5-rc6 ดังนั้นคุณอาจต้องรอประมาณ 2~3 สัปดาห์สำหรับ 3.5 หรือใช้เวอร์ชัน -rc - person Lai Jiangshan; 14.07.2012
comment
คุณถูก. มันอยู่ใน 3.5-rc6 และฉันเห็นด้วยอย่างยิ่งว่า CMA ดูเหมือนจะเป็นอินเทอร์เฟซที่ดีกว่า mem= ไร้สาระมาก และความสามารถในการใช้ส่วนที่ไม่ได้ใช้สำหรับการแคชถือเป็นโบนัสที่ดี ขอขอบคุณที่แจ้งให้เราทราบเกี่ยวกับเรื่องนี้! - person Bill Lynch; 15.07.2012
comment
@sharth: แจ้งให้เราทราบ (หรือเปลี่ยนคำตอบที่ยอมรับของคุณ) หากคุณใช้ CMA ในที่สุด - person Lai Jiangshan; 17.07.2012