Pergunta

Existe uma maneira para programaticamente limpar o cache de buffer no Mac, de preferência em C?

Basicamente, eu estou procurando o equivalente da fonte de 10.5 (e maior) 's comando purge. EDIT: Agora vejo isso faz parte das ferramentas chud, para a qual parece a fonte não está diretamente disponível. No entanto, eu ainda estou procurando algum código para fazer o mesmo.

Foi útil?

Solução

Eu desmontado a função em questão (_utilPurgeDiskBuffers) do quadro CHUD. A função não parece ser muito complexo, mas desde que eu não sou programador MacOS, as importações e as APIs chamadas sys não faz muito sentido para mim.

A primeira coisa que a API faz é chamar uma outra função, ou seja, _miscUtilsUserClientConnect_internal. Esta função parece estabelecer uma conexão com a extensão do CHUD kernel.
Para fazer isso, ele chama _getCHUDUtilsKextService que tenta localizar extensão do CHUD do kernel, enumerando todos os kexts usando o IORegistryCreateIterator importado do kit I / O. Após o kext foi encontrado, ele é aberto via _IOServiceOpen.

Neste momento temos uma conexão com o kext CHUD (pelo menos essa é a minha compreensão da lista desmontagem).

Finalmente uma chamada para IOConnectMethodStructureIStructureO é feito, que eu acho que realiza a verdadeira magia.
Sem saber alguns detalhes internos ou a assinatura desta função os parâmetros não faz sentido para mim.

Aqui está a desmontagem, no entanto:

__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

Note que var_1C foi zerado antes.

Esperamos que alguns de vocês podem fazer mais sentido fora dessas syscalls. Se você quiser mais informações, deixe-me saber.

Update:
Para começar, basta dar o exemplo AppleSamplePCIClient.c do kit SDK IO. Isso faz basicamente o que a aplicação purga a partir das ferramentas chud faz.
A única coisa que você tem que mudar são os parâmetros para a chamada _IOConnectMethodStructureIStr final. Levá-los a partir da desmontagem lista acima. Eu não posso testar tudo isso desde que eu não tenho um Mac.

Outras dicas

Parece que:

Você pode usar usr / bin / purga (tipo purga no terminal) para liberar o disco cache (memória inativo), ou você pode fazer muitas leituras aleatórias do disco rígido para fazer a mesma coisa .

Tomado de um comentário do usuário armas .

Você pode usar sync(2) várias vezes (como no sync; sync; sync expressão bem conhecida). Eu não consigo encontrar o código-fonte purge mas pode ser apenas parte dos pacotes homem disponível em 10.5.6 código

você não iria estar interessado em desligar o cache para um arquivo em vez disso? Dependendo do que você está tentando alcançar, poderia ser uma alternativa. bom resumo aqui .

UBC pode ser afastada pelo 'purga' correndo que aloca muita memória para forçar o cache para limpar.

fcntl(fd, F_GLOBAL_NOCACHE, 1)  

pode ser usado por sua vez, o cache off para um determinado Arquivo. Isso pode ser feito em qualquer processo e o arquivo pode ser fechado depois.

Quando você não tem o código fonte para a ferramenta que você deseja emular (como é o caso aqui), há uma série de maneiras de ir sobre ele.

1 / De seu código C, basta ligar para a ferramenta com uma chamada de função system(). Isso funciona bem, desde que não há nenhum efeito visível (como abrir uma janela gráfica). Você poderia usar system("/path/to/purge -purgargs >/dev/null 2>&1");, por exemplo.

2 / engenharia reversa do código para ver como ele é realmente fazê-lo. Isso é um pouco mais complicado, uma vez que vai exigir conhecimento do idioma assembler, chamadas de sistema e muitas outras coisas.

3 / contato com os desenvolvedores para obter dicas sobre como ele foi feito. Isso não tem que ser um "me enviar o código para que eu possa arrancá-lo e ganhar dinheiro" pergunta. Você poderia frase como "Eu tenho um interesse em utilizar purga para o desenvolvimento mas não estou certo exatamente o que é faz" ou "Eu tenho problemas de segurança com a execução do código, os poderes que não me deixa executá-lo a menos que saibamos exatamente o que faz". Então você o seu código para fazer o mesmo.

Me, gostaria apenas de usar a opção 1, se possível (eu sou inerentemente preguiçosos :-). Se você estiver indo para escrever uma ferramenta para competir com purga (e isso vai ser difícil dado que é gratuito), a opção 2 é provavelmente a melhor aposta.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top