Módulos / construção / make / testing / poc / ensaio / notas / isenção de responsabilidade / licença / books / links
O módulo Linux Kernel (LKM) Sandbox é uma coleção de módulos diferentes para aprender, descobrir e experimentar o desenvolvimento de módulos do kernel Linux. O objetivo deste repositório também é praticar o desenvolvimento no kernel Linux e estudar conceitos diversos antes de seguir em frente para enviar o primeiro patch ao kernel.
A maioria dos módulos ilustra um conceito e mostra como usar a API do kernel. Alguns dos módulos combinam mais de um conceito para apresentar como os conceitos estão trabalhando juntos. Por exemplo, o módulo LKM_DEVICE está acessando um dispositivo de caractere e armazenando seu número principal em /proc. Ou o módulo LKM_MEM está expondo informações de memória /troca por arquivos em /proc.
Espero que possa ser valioso para outros desenvolvedores que tentam abordar o kernel Linux.
| Não. | Módulo | Fonte | Descrição |
|---|---|---|---|
| 1 | LKM Debugfs | lkm_debugfs.c | Módulo mostrando como usar o depuração de depuração de debugfs |
| 2 | Dispositivo LKM | lkm_device.c | Módulo mostrando como operar com dispositivos de caracteres e armazenar informações do dispositivo em /proc |
| 3 | Números de dispositivos LKM | lkm_device_numbers.c | Ilustrando números de dispositivos estaticamente e dinamicamente alocados |
| 3 | LKM Memory | LKM_MEM.C | Módulo expondo a memória e as informações de trocar para /proc |
| 4 | Dispositivo baseado em memória LKM | LKM_MEV.C | Driver para um dispositivo de caracteres baseado em memória, com base em algum grau de scull, desenvolvido no livro Drivers de dispositivo Linux, capítulo 3 |
| 5 | Parâmetros LKM | lkm_parameters.c | Módulo para passagem de parâmetros de usuário para kernelspace |
| 6 | LKM Pretty Printk | LKM_PP.C | Módulo para testar a integração de bastão |
| 7 | Lkm Proc | LKM_PROC.C | Módulo Acessando /Sistema de Arquivos Proc usando E /S seqüencial |
| 8 | Processo LKM | lkm_process.c | Acessando e imprimindo informações do processo atual |
| 9 | LKM Sandbox | lkm_sandbox.c | Módulo Sandbox para diferentes experimentos |
| 10 | Esqueleto LKM | LKM_SKELETON.C | Módulo de esqueleto para andaimes mais rápidos de novos módulos |
Ao clonar pela primeira vez, clone também os submódulos com --recurse-submodules para obter uma impressão bonita também.
git clone --recurse-submodules [email protected]:tpiekarski/lkm-sandbox.gitmake clean && make
Para executar todos os testes disponíveis, incluindo carregamento/descarregamento básico e todos os testes conceituais adicionais.
make testTestes com o carregamento, descarregamento e saída do buffer do anel do kernel (o sudo solicitará permissões de raiz).
make test-module name= < module-name > Testes adicionais para o dispositivo Sandbox, incluindo o módulo de carregamento, coletando o número principal do dispositivo de /proc, criando dispositivo e comparando a mensagem final, execute o alvo Makefile com make test-device ou execute os seguintes comandos.
Para criar um dispositivo de caracteres, o número principal é necessário e pode ser obtido catting o arquivo /proc /lkm_device_major. Esse número principal também é escrito para o buffer do anel do kernel. É possível fornecer esse número principal usando o parâmetro do módulo param_major_num e carregar este módulo como sudo insmod lkm_device.ko param_major_num=241 (nesse momento, essa alocação estática parece não funcionar confiável.
sudo insmod lkm_device.ko
dmesg | grep " Registered sandbox device "
sudo mknod /dev/lkm_device c $( cat /proc/lkm_device_major ) 0
test -c /dev/lkm_device && cat /dev/lkm_device || echo " Device /dev/lkm_device " not found. "
sudo rmmod lkm_device Testes adicionais para o acesso à Sandbox para /proc, incluindo o módulo de carregamento, testando se o arquivo interno /proc existe e a saída desse arquivo. Execute o teste de meta makefile-Proc com make test-proc ou os seguintes comandos:
sudo insmod lkm_proc.ko
test -f /proc/lkm_proc && cat /proc/lkm_proc || echo " File /proc/lkm_proc not found. "
sudo rmmod lkm_proc Para testes adicionais para que a passagem de parâmetros de passagem para o Module LKM_PARAMETERS execute o parâmetro de teste de destino makefile com make test-parameters . Isso carregará/descarregará o módulo e comparará o número e a mensagem dos parâmetros aprovados ao carregar o módulo com os valores lidos no sistema de arquivos/sys (/sys/module/lkm_parameters/parâmetros/*). Ou execute os seguintes comandos.
sudo insmod lkm_parameters.ko number=33 message= " Some message... "
cat /sys/module/lkm_parameters/parameters/number
cat /sys/module/lkm_parameters/parameters/message
sudo rmmod lkm_parametersDurante a tripla, a depuração e o trabalho com bugs e problemas, pode ser útil para experimentar algum código e escrever um POC para provar algumas declarações ou responder a uma pergunta. A seguir, é apresentado uma coleção desse POC que acompanha um líder para provar declarações, idéias e perguntas que encontrei recentemente.
| Arquivo | Descrição | Motivação |
|---|---|---|
| Comparando-IOPL-IOPERM.C | Comparando as permissões de E/S concedidas por iopl e ioperm | Bug 205317 - IOPL (2) - O nível de privilégio é definido por processo ou por thread? |
| permissões-revisited.c | Como as permissões de E/S são concedidas ao usar clone, garfo, execução ou pthread? | Bug 205317 - IOPL (2) - O nível de privilégio é definido por processo ou por thread? |
Para uma melhor compreensão dos conceitos no espaço de kernels, é necessário revisar e ensaiar básicos fundamentais da C e da biblioteca padrão. Ao lado de ser capaz de melhorar a compreensão, é possível comparar abordagens. A maioria desses básicos é de baixo nível, começando com a E/S do arquivo e pode ser analisada como uma fonte complementar. Nunca é ruim ensaiar as coisas, mas às vezes um pouco embaraçoso admitir ter que ensaiar essas coisas :)
| Arquivo | Conceito |
|---|---|
| CLONE.C | Processos de clonagem com clone () |
| execve.c | Executando outro processo com Execve () |
| Fork.c | Criação de processo infantil com fork () |
| io_ports.c | Operações de E/S mapeadas por porta de baixo nível |
| leia.c | Leitura de arquivos na baunilha C |
| Simple_circular_buffer.c | Buffer circular simples e direto |
| write.c | Escrevendo/anexando os arquivos na baunilha C |
Para construir esses arquivos, basta make clean && make in ./rehearsals/ e todos os executáveis serão colocados no diretório de compilação.
"Um módulo do kernel Linux é um pedaço de código binário compilado que é inserido diretamente no kernel Linux, executando no anel 0, o anel de execução mais baixo e menos protegido no processador x86-64".
"Os paradigmas tradicionais de desenvolvimento de aplicativos podem ser amplamente descartados. Além do carregamento e descarregamento do seu módulo, você estará escrevendo um código que responde aos eventos do sistema, em vez de operar em um padrão seqüencial".
"Com o desenvolvimento do kernel, você está escrevendo APIs, não os próprios aplicativos".
Este repositório solicitará permissão de raiz, porque certas operações como carregamento/descarga de módulos e acesso a arquivos no sistema Linux/GNU depende dos privilégios root. O Makefile declarará com antecedência o que essas permissões serão usadas.
Você pode revisar todas essas operações pesquisando este repositório para sudo e certifique -se de que isso não será mal utilizado de forma alguma. Estou ciente de que isso pode ser um problema de segurança, mas estou tentando tornar esse processo o mais transparente possível. Mas também esteja ciente de que esses módulos estão chegando sem qualquer garantia. O pânico do kernel e a perda de dados podem acontecer, use -os de preferência dentro de uma máquina virtual.
A seguir, é apresentado uma tabela com todos os locais onde o sudo é usado (exceto o readme.md).
grep -n -r " sudo " *| Arquivo: linha | Uso de sudo |
|---|---|
| Makefile: 118 | |
| Makefile: 119 | $ (avaliar número_file_content = sudo cat $(number_file) ) |
| Makefile: 122 | |
| Makefile: 123 | |
| Makefile: 126 | @sudo rmmod $ (module_filename) |
| Makefile: 140 | @sudo mknod $ (device_filename) C cat $(proc_filename) 0 |
| Makefile: 143 | @sudo rm $ (device_filename) |
| Makefile: 144 | @sudo rmmod $ (module_filename) |
| Makefile: 162 | @sudo rmmod $ (module_filename) |
| Makefile: 175 | @sudo mknod |
| Makefile: 176 | @echo "Testing" | sudo tee $ (device_file) |
| Makefile: 178 | @sudo rm -fv $ (device_file) |
| Makefile: 179 | @sudo rmmod $ (módulo) |
| Makefile: 190 | @Sudo Insmod |
| Makefile: 193 | @sudo rmmod $ (módulo) |
| Makefile: 207 | @sudo rmmod $ {módulo} |
| Makefile: 219 | @sudo insmod $ (módulo) .ko |
| Makefile: 222 | @sudo rmmod $ (módulo) |
| tests.mk:31 | @lsmod | awk '{print $$ 1}' | grep -qe "^$ (1) $$" && (sudo rmmod |
| tests.mk:75 | @Sudo DMESG -Clear |
| tests.mk:78 | @sudo rmmod $ (1) |
O LKM Sandbox é um software livre: você pode redistribuí -lo e/ou modificá -lo nos termos da licença pública geral da GNU, conforme publicado pela Free Software Foundation, versão 2 da licença ou (por sua opção) qualquer versão posterior.
O LKM Sandbox é distribuído na esperança de que seja útil, mas sem qualquer garantia; sem a garantia implícita de comercialização ou aptidão para uma finalidade específica. Veja a licença pública geral da GNU para obter mais detalhes.
Você deveria ter recebido uma cópia da licença pública geral da GNU, juntamente com o LKM Sandbox. Caso contrário, consulte https://www.gnu.org/license/.