문제

C에서 MAC의 버퍼 캐시를 프로그래밍 방식으로 지우는 방법이 있습니까?

기본적으로 나는 10.5 (그리고 더 큰)의 소스와 동등한 것을 찾고 있습니다. purge 명령. 편집하다: 나는 이것이 CHUD 도구의 일부라는 것을 알았습니다. 소스는 직접 사용할 수없는 것 같습니다. 그러나 나는 여전히 같은 코드를 찾고 있습니다.

도움이 되었습니까?

해결책

문제의 기능을 분해했습니다 (_utilPurgeDiskBuffers) Chud 프레임 워크에서. 이 기능은 그다지 복잡하지는 않지만 MACOS 프로그래머가 아니기 때문에 수입 및 SYS API라고 불리는 것은 나에게 큰 의미가 없습니다.

API가하는 첫 번째 일은 다른 기능, 즉 _miscUtilsUserClientConnect_internal. 이 기능은 Chud 커널 확장에 연결되는 것으로 보입니다.
이렇게하려면 전화합니다 _getCHUDUtilsKextService 이것은 모든 kexts를 IORegistryCreateIterator I/O 키트에서 가져옵니다. kext가 발견 된 후 _IOServiceOpen.

이 시점에서 우리는 Chud Kext와 연결되어 있습니다 (적어도 그것은 분해 목록에서 내 이해입니다).

마지막으로 전화 IOConnectMethodStructureIStructureO 내가 만들어 졌는데, 나는 진짜 마법을 불러 일으킨다 고 생각합니다.
이 기능의 내부 세부 사항이나 서명을 알지 못하고 매개 변수는 나에게 의미가 없습니다.

그러나 분해는 다음과 같습니다.

__text:4B0157A7 lea     eax, [ebp+var_1C]
__text:4B0157AA mov     dword ptr [esp+14h], 0
__text:4B0157B2 mov     [esp+10h], eax
__text:4B0157B6 mov     [esp+0Ch], eax
__text:4B0157BA mov     dword ptr [esp+8], 0
__text:4B0157C2 mov     dword ptr [esp+4], 0Eh
__text:4B0157CA mov     [esp], edx
__text:4B0157CD call    _IOConnectMethodStructureIStr

주목하십시오 var_1C 전에 제로화되었습니다.

바라건대 여러분 중 일부는 이러한 SYSCALL에서 더 이해할 수 있기를 바랍니다. 더 많은 정보를 원한다면 알려주세요.

업데이트:
당신을 시작하려면 그냥 가져 가십시오 AppleSamplePCIClient.c IO 키트 SDK의 예. 이것은 기본적으로 Chud 도구의 퍼지 애플리케이션이하는 일입니다.
변경해야 할 유일한 것은 최종의 매개 변수입니다. _IOConnectMethodStructureIStr 전화. 위의 분해 목록에서 가져 가십시오. Mac이 없기 때문에이 모든 것을 테스트 할 수 없습니다.

다른 팁

그것은 다음과 같습니다.

USR/BIN/퍼지 (터미널의 퍼지 유형)를 사용하여 디스크 캐시 (비활성 메모리)를 플러시 할 수 있습니다. 또는 똑같은 일을하기 위해 하드 디스크에서 많은 무작위 읽기를 할 수 있습니다..

a 논평 사용자로부터 총포.

당신은 사용할 수 있습니다 sync(2) 여러 번 (잘 알려진 관용구와 마찬가지로 sync; sync; sync). 나는 찾을 수없는 것 같다 purge 소스 코드이지만 사용 가능한 Man 패키지의 일부일 수 있습니다. 10.5.6 코드

대신 파일의 캐시를 끄는 데 관심이 없습니까? 달성하려는 것에 따라 대안이 될 수 있습니다. 여기에 좋은 요약.

UBC는 '퍼지'를 실행하여 청소할 수 있으며, 이는 캐시가 지우도록 많은 메모리를 할당합니다.

fcntl(fd, F_GLOBAL_NOCACHE, 1)  

특정 파일에 대한 캐싱 끄기를 사용할 수 있습니다. 이것은 모든 프로세스에서 수행 할 수 있으며 파일은 다음에 닫을 수 있습니다.

에뮬레이션하려는 도구의 소스 코드가 없으면 (여기서와 같이) 여러 가지 방법이 있습니다.

1/ C 코드에서 단순히 도구를 system() 기능 호출. 이는 눈에 보이는 효과가없는 한 (예 : 그래픽 창을 여는 것과 같은) 잘 작동합니다. 당신은 사용할 수 있습니다 system("/path/to/purge -purgargs >/dev/null 2>&1");, 예를 들어.

2/ 리버스 엔지니어 코드가 실제로 어떻게 작동하는지 확인하십시오. 어셈블러 언어, 시스템 호출 및 기타 여러 가지에 대한 지식이 필요하기 때문에 이것은 다소 까다로워집니다.

3/ 개발자에게 연락하여 수행 방법에 대한 팁을 얻으십시오. 이것은 "코드를 보내서 돈을 벌 수 있도록 코드를 보내야합니다"라는 질문 일 필요는 없습니다. "Purge for Development를 사용하는 데 관심이 있지만 정확히 무엇이 무엇인지 확실하지 않습니다"또는 "코드를 실행하는 데있어 보안 문제가 있습니다. 우리가 알지 않으면 실행할 수없는 힘이 있습니다. 정확히 무엇을하는지 ". 그런 다음 동일한 작업을 수행하도록 코딩합니다.

나, 가능한 경우 옵션 1을 사용하겠습니다 (본질적으로 게으른 :-). Purge와 경쟁하기위한 도구를 작성하려면 (무료로 주어지면 어려울 것입니다) 옵션 2가 가장 좋은 방법 일 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top