คำถามนี้มีความยาวพอสมควรดังนั้นฉันจะถามคำถามที่อยู่ด้านบนและจากนั้นผ่านวิธีการของฉันในการตอบคำถาม:
- ไม่ (ใช้ Busybox) rm ไม่ทำงานเนื่องจากมี RAM ต่อเนื่องไม่เพียงพอหรือไม่
- ถ้าเป็นเช่นนั้นจะมีวิธีที่มีน้ำหนักเบาในการจัดเรียงข้อมูล DMA โดยไม่ต้องรีสตาร์ทระบบหรือไม่?
- ถ้าไม่เกิดอะไรขึ้น ฉันจะป้องกันไม่ให้เกิดขึ้นในอนาคตได้อย่างไร
หลังจากที่ระบบทดสอบของเราทำงานค่อนข้างหนาแน่นในช่วงสองสามวันที่ผ่านมา - ฉันโทรเข้าระบบและตรวจสอบผลการทดสอบ เมื่อฉันลบข้อมูลบางส่วนระบบจะส่งคืนบรรทัดคำสั่ง (ราวกับว่าคำสั่งทำงานอย่างถูกต้อง) เมื่อฉันมาตรวจสอบไดเรกทอรีเพื่อดูผลลัพธ์อีกชุดฉันเห็นไฟล์นั้นยังคงมีอยู่ (โดยใช้ ls)
หลังจากนี้ฉันสังเกตเห็นคำสั่งเชลล์ของฉันมากขึ้นเรื่อย ๆ ไม่ได้ทำงานตามที่คาดไว้
ฉันจะเริ่มต้นด้วยการส่งออกจากdmesgหลังจาก rm ล้มเหลวในการดำเนินการอย่างถูกต้อง:
การจัดสรรความยาว 61440 จากกระบวนการ 6821 (rm) ล้มเหลว
DMA ต่อซีพียู:
CPU 0: hi: 0, btch: 1 usd: 0
Active_anon: 0 active_file: 1 inactive_anon: 0 inactive_file: 0 ไม่แน่นอน: 6 สกปรก: 0 writeback: 0 ไม่เสถียร: 0 ฟรี: 821 แผ่น: 353 แมป: 0 pagetables: 0 เด้ง: 0
ฟรี DMA: 3284kB ขั้นต่ำ: 360kB ต่ำ: 448kB สูง: 540kB active_anon: 0kB ไม่ได้ใช้งาน: 0kB active_file: 4kB อยู่ในสถานะ active_file: 0kB ไม่สามารถคาดเดาได้: 24kB หน้าปัจจุบัน: 8128kB pages_scanned: 0 all_unreclaimable ไม่
lowmem_reserve []: 0 0 0
DMA: 31 * 4kB 47 * 8kB 42 * 16kB 64 * 32kB 1 * 64kB 0 * 128kB 0 * 256kB 0 * 512kB 0 * 1024kB 0 * 2048kB 0 * 4096kB = 3284kB
14 หน้า pagecache ทั้งหมด
ไม่สามารถจัดสรร RAM สำหรับข้อมูลกระบวนการได้ errno 12
เริ่มแรกฉันคิดว่าฉันไม่สามารถเรียกใช้โปรแกรมในส่วนที่ใหญ่ที่สุดของหน่วยความจำต่อเนื่อง ความหมาย DMA นั้นมีการแยกส่วนมากเกินไปและฉันจะต้องหาวิธีในการทำให้ระบบจัดระเบียบหน่วยความจำ
จากนั้นฉันทำการตรวจสอบทางคณิตศาสตร์อย่างรวดเร็วและรู้ตัวว่าโปรแกรมควรจะสามารถทำงานในสล็อตหน่วยความจำต่อเนื่อง 64kB แต่เพียงผู้เดียว Rm กำลังร้องขอ 61440 ไบต์ (60kB)
ฉันทำได้ดีมาก "manual defrag" และรีบูตระบบ เมื่อฉันรีบูทระบบฉันจะส่งออก / proc / buddyinfo:
Node 0, zone DMA 2 8 3 12 0 1 0 1 0 1 0
ซึ่งฉันสงสัยว่าแผนที่เพื่อ:
- 2 x 4 kB
- 8 x 8 kB
- 3 x 16 kB
- 12 x 32 kB
- 1 x 128 kB
- 1 x 512 kB
แต่ถ้ามีผลรวมของรายการด้านบนค่าจะไม่ตรงกับเอาต์พุตของ/ proc / meminfo :
MemTotal: 6580 kB
MemFree: 3164 kB
Buffers: 0 kB
Cached: 728 kB
SwapCached: 0 kB
Active: 176 kB
Inactive: 524 kB
Active(anon): 0 kB
Inactive(anon): 0 kB
Active(file): 176 kB
Inactive(file): 524 kB`
Unevictable: 0 kB
Mlocked: 0 kB
MmapCopy: 844 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 0 kB
Writeback: 0 kB
AnonPages: 0 kB
Mapped: 0 kB
Slab: 1268 kB
SReclaimable: 196 kB
SUnreclaim: 1072 kB
PageTables: 0 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 3288 kB
Committed_AS: 0 kB
VmallocTotal: 0 kB
VmallocUsed: 0 kB
VmallocChunk: 0 kB
เพื่อสรุปคำถามของฉันคือ:
- rm ไม่ทำงานเพราะมี RAM ไม่ต่อเนื่องเพียงพอหรือไม่
- ถ้าเป็นเช่นนั้นจะมีวิธีที่มีน้ำหนักเบาในการจัดเรียงข้อมูล DMA โดยไม่ต้องรีสตาร์ทระบบหรือไม่?
- ถ้าไม่เกิดอะไรขึ้น ฉันจะป้องกันไม่ให้เกิดขึ้นในอนาคตได้อย่างไร
ฉันใช้ XPort Pro (8MB, Linux OS) ของ Lantronix ที่ใช้ uClinux เวอร์ชั่น 2.6.30 เชลล์ที่ใช้อยู่นั้นเงียบ