이 질문은 상당히 길기 때문에 맨 위에 질문을 한 다음 질문을하는 방법을 살펴 보겠습니다.
- 연속 RAM이 부족하여 (Busybox 기반) rm이 실행되지 않았습니까?
- 그렇다면 시스템을 다시 시작하지 않고 DMA를 조각 모음하는 간단한 방법이 있습니까?
- 그렇지 않은 경우 원인은 무엇입니까? 앞으로 발생하지 않도록하려면 어떻게해야합니까?
지난 며칠 동안 테스트 시스템이 상당히 집중적으로 실행 된 후 시스템에 텔넷으로 연결하여 테스트 결과를 확인했습니다. 일부 데이터를 삭제하려고 할 때 시스템은 명령이 올바르게 실행 된 것처럼 명령 줄을 반환했습니다. 디렉토리에서 다른 결과 세트를 확인하려고 할 때 파일이 여전히 존재 함을 보았습니다 (ls 사용).
그 후, 점점 더 많은 쉘 명령이 예상대로 수행되지 않는 것을 알았습니다.
rm이 올바르게 실행되지 않은 후 dmesg 의 출력으로 시작하겠습니다 .
프로세스 6821 (rm)에서 길이 61440을 할당하지 못했습니다.
CPU 당 DMA :
CPU 0 : 안녕 : 0, 똥 : 1 USD : 0
Active_anon : 0 active_file : 1 inactive_anon : 0 inactive_file : 0 uncvictable : 6 dirty : 0 writeback : 0 unstable : 0 비어있는 : 821 slab : 353 매핑 : 0 pagetables : 0 바운스 : 0
DMA 사용 안함 : 3284kB 최소 : 360kB 낮음 : 448kB 높음 : 540kB active_anon : 0kB 비활성 _anon : 0kB active_file : 4kB 비활성 _ 파일 : 0kB unevictable : 24kB 존재 : 8128kB 페이지 _ 스캔 : 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 개의 총 페이지 캐시 페이지
프로세스 데이터에 RAM을 할당 할 수 없음, errno 12
처음에는 연속 메모리의 가장 큰 부분에서 프로그램을 실행할 수 없다고 생각했습니다. DMA가 너무 조각화되어 시스템에서 메모리 조각 모음을 수행하는 방법을 찾아야한다는 것을 의미합니다.
그런 다음 빠른 수학 / 위생 검사를 수행하여 프로그램이 유일한 64kB 연속 메모리 슬롯에서 실행될 수 있어야한다는 것을 깨달았습니다. Rm이 61440 바이트 (60kB)를 요청했습니다.
오래된 "수동 조각 모음"을 수행하고 시스템을 재부팅했습니다. 시스템을 재부팅하면 / 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 32kB
- 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
요컨대 내 질문은 다음과 같습니다.
- 연속 RAM이 부족하여 rm이 실행되지 않았습니까?
- 그렇다면 시스템을 다시 시작하지 않고 DMA를 조각 모음하는 간단한 방법이 있습니까?
- 그렇지 않은 경우 원인은 무엇입니까? 앞으로 발생하지 않도록하려면 어떻게해야합니까?
uClinux 버전 2.6.30을 실행하는 Lantronix의 XPort Pro (8MB, Linux OS)를 사용하고 있습니다. 사용중인 쉘이 허쉬합니다.