Análise Experimental: https://www.zhihu.com/column/c_142990858
O Linux é um sistema operacional de código aberto. Os usuários podem adaptar e modificar o kernel de acordo com seu próprio sistema precisa personalizar sistemas com funções mais apropriadas e maior eficiência operacional. Portanto, compilar o kernel Linux é uma habilidade básica necessária para o desenvolvimento do kernel.
Adicionar novas chamadas de sistema conforme necessário no sistema é um método comum para modificar o kernel. Através deste experimento, os leitores devem entender o processo de chamadas do sistema de processamento do sistema Linux e o método de adicionar chamadas do sistema.
(1) Adicione uma chamada do sistema para implementar a função de modificação ou leitura do valor bom do processo especificado e retorne o valor mais recente e prioritário do processo. Recomenda -se chamar o protótipo como:
int mySetnice (pid_t pid, int sinalizador, int niceValue, void __user * prio, void __user * nice);
Significado do parâmetro: PID: ID do processo.
Sinalizador: se o valor for 0, significa ler o valor bom; Se o valor for 1, significa modificar o bom valor.
Prio, Nice: a prioridade atual e o valor bom do processo. Valor de retorno: retorne 0 quando a chamada do sistema for bem -sucedida e retorne o código de erro efault quando a chamada do sistema falhar.
(2) Escreva um teste de aplicativo simples adicionado em (1).
(3) Se a função do kernel do Linux for chamada no programa, será necessário ler o código -fonte da função relevante em profundidade.
O mecanismo do módulo fornecido pelo Linux pode expandir dinamicamente as funções Linux sem recompilar o kernel e tem sido amplamente utilizado na implementação de muitas funções do kernel Linux. Neste experimento, aprenderemos os conceitos básicos, princípios e técnicas de implementação dos módulos e, em seguida, usaremos o módulo do kernel para programar e acessar as informações básicas do processo, aprofundando assim nosso entendimento dos conceitos de processo e das técnicas de programação de módulos de masterização.
(1) Projete um módulo que requer listar os nomes do programa, números de PID, status do processo e prioridades de processo de todos os threads do kernel no sistema.
(2) Projete um módulo com parâmetros, cujos parâmetros são o número PID de um processo. A função deste módulo é listar as informações da família do processo, incluindo o nome do programa e o número de PID do processo pai, o processo irmão e o processo da criança.
(3) Leia ainda mais a implementação do código -fonte das funções relevantes do kernel usadas no programa com base em sua própria situação.
(1) Familiarize -se com a interface de comando do Linux.
(2) Através da aplicação de programação de chamadas do sistema relacionado ao controle do processo Linux, aprofundaremos ainda mais nossa compreensão dos conceitos de processo, esclareceremos a conexão e as diferenças entre processos e programas e entenderemos o significado específico da execução simultânea dos processos.
(3) Através do uso do mecanismo de comunicação do pipeline Linux, mecanismo de comunicação da fila de mensagens e mecanismo de comunicação de memória compartilhada, aprofundar o entendimento de diferentes tipos de métodos de comunicação de processo.
(4) Aprofundar o entendimento do mecanismo de sincronização de semáforo através da aplicação de semáforos POSIX no Linux. (5) Leia e analise ainda mais a implementação do código -fonte do kernel de chamadas de sistema relacionadas com base em sua própria situação.
(1) Familiarizado com os comandos Linux comuns: PWD, UserAdd, Passwd, que, PS, PSTree, Kill, Top, LS, CD, Mkdir, RMDIR, CP, RM, MV, CAT, More, Grep, etc.
(2) Implementar um shell simulado:
Escreva três programas diferentes CMD1.C, CMD2.C e CMD3.C. As funções de cada programa são personalizadas e compiladas em arquivos executáveis CMD1, CMD2 e CMD3, respectivamente. Em seguida, escreva um programa para simular a função do programa Shell. Ele pode criar um processo filho para o comando correspondente com base na string inserida pelo usuário (representando o nome do comando correspondente) e deixe executar o programa correspondente. O processo pai aguarda o processo infantil e aguarda o próximo comando ser recebido. Se o comando recebido estiver saindo, o processo pai será encerrado; Se o comando recebido for um comando inválido, "o comando não encontrado" será exibido e você continua esperando.
(3) Implementar um programa de comunicação de pipeline:
Um pipeline é criado pelo processo pai e, em seguida, são criados três processos filhos, e esses três processos filhos usam o pipeline para se comunicar com o processo pai: o processo filho envia informações, e o processo pai e outros três processos filhos recebem as informações após todas as mensagens de envio. O conteúdo específico da comunicação pode ser projetado à vontade de acordo com suas próprias necessidades, e é necessário testar várias situações no processo de leitura e escrita de bloqueio, testar o tamanho padrão do pipeline e usar o mecanismo de semáforo POSIX para obter acesso mutuamente exclusivo ao pipeline entre os processos. Execute o programa para observar o número real de bytes de ler e escrever pelo processo e o processo de bloqueio e despertar em várias circunstâncias.
(4) Use o mecanismo de comunicação da fila de mensagens do Linux para realizar a comunicação entre dois threads:
Escreva um programa para criar dois threads: threads de remetentes e thread, onde o thread do remetente executa o remetente da função (), que cria uma fila de mensagens e, em seguida, faz um loop para aguardar o usuário inserir uma sequência de caracteres através do terminal, enviando a sequência de caracteres para o thread do receptor através da fila da mensagem até que o usuário se encaixe na saída "; Finalmente, ele envia uma mensagem "END" para o tópico do receptor e aguarda a resposta do receptor. Após a mensagem de resposta, ele exibe as informações de resposta recebidas na tela do terminal, exclui a fila de mensagens relevantes e encerra a execução do programa. O thread do receptor é executado RECEBT (), que recebe mensagens do remetente através da fila de mensagens e exibe a mensagem na tela do terminal até receber uma mensagem com "End". No momento, ele envia uma mensagem de resposta "over" para o remetente, encerrando a execução do programa. Use semáforos sem nome para obter sincronização e exclusão mútua entre dois threads.
(5) Use o mecanismo de comunicação de memória compartilhada do Linux para realizar a comunicação entre dois processos:
Escreva um remetente de programa, que cria uma memória compartilhada e aguarda o usuário inserir uma sequência de caracteres através do terminal e envia a sequência de caracteres para o receptor através da memória compartilhada; Finalmente, espera a resposta do receptor. Depois de receber a mensagem de resposta, ele exibe as informações de resposta recebidas na tela do terminal, exclui a memória compartilhada e encerra a execução do programa. Escreva um programa de receptor, que recebe mensagens do remetente através da memória compartilhada, exibe a mensagem na tela do terminal e envia uma mensagem de resposta "sobre" para o remetente através da memória compartilhada, encerrando a execução do programa. Use um semáforo nomeado ou o sistema v semáforo para obter o uso mutuamente exclusivo e síncrono da memória compartilhada por dois processos.
Através do gerenciamento de espaço de armazenamento de arquivos específico, a estrutura física dos arquivos, a estrutura do diretório e as operações de arquivos, aprofundaremos nosso entendimento da estrutura de dados internos, funções e processo de implementação do sistema de arquivos.
(1) Abra um espaço de disco virtual na memória como uma partição de armazenamento de arquivos e implemente um sistema de arquivos simples em um único sistema de tarefa única do usuário com base em diretórios de vários níveis. Ao sair do sistema de arquivos, o sistema de arquivos virtual deve ser salvo no disco como um arquivo para que possa ser restaurado no espaço do disco virtual na memória na próxima vez.
(2) A alocação do espaço de armazenamento de arquivos pode ser feita por alocação explícita de link ou outros métodos.
(3) Você pode escolher diagramas de bits ou outros métodos para gerenciar o espaço livre em disco. Se o bitmap for usado para gerenciar o espaço de armazenamento de arquivos e usar a alocação explícita de links, o bitmap poderá ser mesclado na gordura.
(4) A estrutura do diretório de arquivos adota uma estrutura de diretório de vários níveis. Por simplicidade, os nós de índice podem ser usados, cada item de diretório deve conter informações como nome do arquivo, endereço físico, comprimento etc., e os arquivos de leitura e gravação também podem ser protegidos por meio de itens de diretório.
(5) Os seguintes comandos de operação são necessários: