Pergunta

Eu quero aprender Linux de programação do kernel.

Quais seriam os pontos de partida para isso? O que poderia ser alguns dos problemas mais simples de alvo?

Foi útil?

Solução

Tente se apossar do livro de Robert Love on Linux Kernel programação. É muito conciso e fácil de seguir.

Depois disso ou junto com isso, você pode querer dar uma olhada em "Compreender o kernel Linux" .Mas eu não recomendo durante as fases iniciais.

Além disso, olhar para o Linux kernel do guia de programação . Desde muito pode ser aprendido com a programação módulos do kernel, que guia vai ajudá-lo. E sim, para um monte de informações, consulte o 'documentação' sub-diretório dos fontes do kernel arquivo tar.

Outras dicas

**TODO** +editPic: Linux Kernel Developer -> (Ring Layer 0)
         +addSection: Kernel Virtualization Engine

KERN_WARN_CODING_STYLE: Do not Loop unless you absolutely have to.

Livros recomendados para o Uninitialized void *i

"Os homens não entendem livros até que eles têm uma certa quantidade de vida, ou pelo menos ninguém entende um livro profundo, até que ele tenha visto e vivido pelo menos parte de seu conteúdo". -Ezra Pound

A viagem de mil código milhas deve começar com uma única etapa. Se você estiver em confusão sobre qual dos seguintes livros para começar, não se preocupe, escolher qualquer um de sua escolha. Nem todos os que vagueiam estão perdidos. Como todas as estradas em última análise, se conectar à estrada , você irá explorar coisas novas em sua jornada kernel como as páginas progredir sem encontrar quaisquer becos sem saída e, finalmente, conectar-se à code-set. Leia com a mente alerta e lembre-se:. Código não é Literatura

O que é esquerda não é uma coisa ou uma emoção ou uma imagem ou uma imagem mental ou uma memória ou até mesmo uma idéia. É uma função. Um processo de algum tipo. Um aspecto da vida que poderia ser descrito como uma função de algo "maior". E, portanto, parece que não é realmente "separado" de que algo outro. Como a função de uma faca - cortar alguma coisa - não é, de fato, separado a partir da própria faca. A função pode ou não pode estar em uso no momento, mas potencialmente nunca está separado.

Solovay Strassen Derandomized Algoritmo para Primality Teste :

Solovay Strassen Derandomized Algoritmo para Primality Test

Leia não contradizer e confute; nem para acreditar e tomar como garantido; nem para encontrar conversa e discurso; mas para pesar e considerar. Alguns livros devem ser provados, outros para ser engolidos, e alguns poucos a ser mastigados e digeridos: isto é, alguns livros devem ser lidos apenas em partes, outros para ser lido, mas não com curiosidade, e alguns poucos a ser lido integralmente , e com diligência e atenção.

static void tasklet_hi_action(struct softirq_action *a)
{
        struct tasklet_struct *list;

        local_irq_disable();
        list = __this_cpu_read(tasklet_hi_vec.head);
        __this_cpu_write(tasklet_hi_vec.head, NULL);
        __this_cpu_write(tasklet_hi_vec.tail, this_cpu_ptr(&tasklet_hi_vec.head));
        local_irq_enable();

        while (list) {
                struct tasklet_struct *t = list;

                list = list->next;

                if (tasklet_trylock(t)) {
                        if (!atomic_read(&t->count)) {
                                if (!test_and_clear_bit(TASKLET_STATE_SCHED,
                                                        &t->state))
                                        BUG();
                                t->func(t->data);
                                tasklet_unlock(t);
                                continue;
                        }
                        tasklet_unlock(t);
                }

                local_irq_disable();
                t->next = NULL;
                *__this_cpu_read(tasklet_hi_vec.tail) = t;
                __this_cpu_write(tasklet_hi_vec.tail, &(t->next));
                __raise_softirq_irqoff(HI_SOFTIRQ);
                local_irq_enable();
        }
}

Core Linux (5 -> 1 -> 3 -> 2 -> 7 -> 4 -> 6)

“Nature não tem nem semente nem casca; ela é tudo de uma vez”- Johann Wolfgang von Goethe

leitor deve ser bem versado com Conceitos de Sistema Operacional ; uma feira de compreensão de longa duração processos e suas diferenças com processos com rajadas curtas de execução; tolerância de falhas, sem descurar as restrições de tempo real moles e duros. Durante a leitura, é importante entender e n/ack as escolhas de design feitas pela fonte do kernel linux nos subsistemas centrais.

Tópicos [e] sinais [são] uma trilha dependente de plataforma de miséria, desespero, horror e loucura (~ Anthony Baxte). Dito isto, você deve ser um especialista em auto-avaliação C, antes de mergulhar no kernel. Você também deve ter boa experiência com listas encadeadas, pilhas, filas, Red Blacks Trees, Funções de Hash, et al.

volatile int i;
int main(void)
{
    int c;
    for (i=0; i<3; i++) {
        c = i&&&i;
        printf("%d\n", c);    /* find c */
    }
    return 0;
}

A beleza ea arte das mentiras source Linux Kernel na ofuscação de código deliberada usado junto. Isso é muitas vezes necessária como para transmitir o significado computacional envolvendo duas ou mais operações de uma forma limpa e elegante. Isto é especialmente verdadeiro quando escrever código para a arquitetura multi-core.

Vídeo Palestras em Tempo Real Sistemas , < a href = "https://www.youtube.com/watch?v=tp8n3ezVfkI" rel = "noreferrer"> agendamento de tarefas , Memória Compression , barreiras de memória , SMP

#ifdef __compiler_offsetof
#define offsetof(TYPE,MEMBER) __compiler_offsetof(TYPE,MEMBER)
#else
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#endif
  1. Linux Kernel Development - Robert love
  2. Compreender o Kernel Linux - Daniel P. Bovet, Marco Cesati
  3. The Art of Linux Kernel Projeto - Yang Lixiang
  4. Professional Linux Kernel Arquitetura - Wolfgang Mauerer
  5. projeto do sistema operacional UNIX - < em> Maurice J. Bach
  6. Entendendo o Gerenciador de Linux Memória Virtual - Mel Gorman
  7. Kernel Linux Internals - Tigran Aivazian
  8. incorporado Linux Primer - Christopher Hallinan

Linux Device Drivers (1 -> 2 -> 4 -> 3 -> 8 -> ...)

"A música não levá-lo junto. Você tem que levá-lo junto estritamente por sua capacidade de realmente se concentrar apenas no que pouco pequeno núcleo de emoção ou história". - Debbie Harry

A sua tarefa consiste em estabelecer uma relação de comunicação de alta velocidade entre o dispositivo de hardware e o kernel do software. Você deve ler o hardware referência folha de dados / manual para entender o comportamento do dispositivo e é controle e de dados estados e canais físicos fornecidos. O conhecimento da Assembléia para sua arquitetura particular e um bom conhecimento da VLSI Descrição de Hardware Linguagens como VHDL ou Verilog irá ajudá-lo no longo prazo.

Q : Mas, por que eu tenho que ler as especificações de hardware

A : Porque, "Há um abismo de carbono e silício, o software não pode fazer a ponte" - Rahul Sonnad

No entanto, o acima não representa um problema para Computacional Algoritmos ( driver código - metade inferior de processamento ), como pode ser totalmente simulado em um Máquina de Turing universal . Se o resultado computado é válido no , é uma certeza que também é verdade no .

Vídeo Palestras no Linux Device Drivers (Lec. 17 e 18), anatomia de um incorporado KMS driver , Controle Pin e GPIO Atualização , Common Framework Relógio , Escrever um real Linux driver - Greg KH

static irqreturn_t phy_interrupt(int irq, void *phy_dat)
{
         struct phy_device *phydev = phy_dat;

         if (PHY_HALTED == phydev->state)
                 return IRQ_NONE;                /* It can't be ours.  */

         /* The MDIO bus is not allowed to be written in interrupt
          * context, so we need to disable the irq here.  A work
          * queue will write the PHY to disable and clear the
          * interrupt, and then reenable the irq line.
          */
         disable_irq_nosync(irq);
         atomic_inc(&phydev->irq_disable);

         queue_work(system_power_efficient_wq, &phydev->phy_queue);

         return IRQ_HANDLED;
}
  1. Linux Device Drivers - Jonathan Corbet, Alessandro Rubini, e Greg Kroah-Hartman
  2. essenciais Linux Device Drivers - Sreekrishnan Venkateswaran
  3. Drivers dispositivo de escrita Linux - Jerry Cooperstein
  4. O Módulo de Kernel Linux Guia de Programação - Peter Jay Salzman, Michael Burian, Ori Pomerantz
  5. Guia
  6. Linux PCMCIA do programador - David Hinds
  7. Linux SCSI Programação Howto - Heiko Eibfeldt
  8. Guia de Programação Serial para sistemas operacionais POSIX - Michael R. doce
  9. Linux Gráfico: uma Introdução - Stéphane Marchesin
  10. Guia de Programação para Dispositivos USB Linux Drivers - Detlef Fliegl
  11. O Dispositivo Modelo Linux Kernel - Patrick Mochel

Kernel Networking (1 -> 2 -> 3 -> ...)

“Chamá-lo de um clã, chamá-lo de uma rede, chamá-lo de uma tribo, chamá-lo de uma família: O que quer que você chamá-lo, quem você é, você precisa de um.” - Jane Howard

Entender um pacote de walk-through no kernel é a chave para a rede do kernel entendimento. Compreender é uma necessidade, se queremos entender Netfilter ou IPSec internos, e muito mais. Os dois mais importantes estruturas de camada linux rede do kernel são: struct sk_buff e struct net_device

static inline int sk_hashed(const struct sock *sk)
{
        return !sk_unhashed(sk);
} 
  1. Compreender Linux Internals de rede - Christian Benvenuti
  2. Linux Kernel Networking: Implementação e Teoria - Rami Rosen
  3. Rede UNIX Programação - W . Richard Stevens
  4. The Definitive Programming Guide to Linux Network - Keir Davis, John W. Turner, Nathan Yocom
  5. O Linux TCP / IP Stack: Networking para Sistemas Embarcados - Thomas F. Herbert
  6. Linux soquete de programação por exemplo - Warren W. Gay
  7. Linux Avançado Routing & controlo de tráficoCOMO FAZER - Bert Hubert

Kernel Debugging (1 -> 4 -> 9 -> ...)

A não ser em se comunicar com ele se diz exatamente o que um meio, o problema é obrigado a resultar. ~ Alan Turing, sobre computadores

Brian W. Kernighan, no jornal Unix para iniciantes (1979) disse: "A ferramenta de depuração mais eficaz ainda é o pensamento cuidadoso, juntamente com instruções de impressão judiciosamente colocados". Saber o que coletar irá ajudá-lo a obter os dados corretos rapidamente para um diagnóstico rápido. O grande cientista da computação Edsger Dijkstra disse uma vez que os testes podem demonstrar a presença de erros, mas não a sua ausência. Boas práticas de investigação devem equilibrar a necessidade de resolver problemas rapidamente, a necessidade de construir suas habilidades, eo uso eficaz de especialistas no assunto.

Há momentos em que você bateu rock-bottom, nada parece funcionar e você correr para fora de todas as suas opções. Seu então que a depuração real começa. Um bug pode fornecer a pausa que você precisa para desengatar a partir de uma fixação na solução ineficaz.

Vídeo Palestras no Kernel Debug e Profiling , < a href = "https://www.youtube.com/watch?v=CR569T-B2M0" rel = "noreferrer"> Núcleo Dump Análise , Multicore depuração com GDB , Controlling multi-Core Condições de corrida , depuração Eletrônica

/* Buggy Code -- Stack frame problem
 * If you require information, do not free memory containing the information
 */
char *initialize() {
  char string[80];
  char* ptr = string;
  return ptr;
}

int main() {
  char *myval = initialize();
  do_something_with(myval);
}
/*  “When debugging, novices insert corrective code; experts remove defective code.”
 *     – Richard Pattis
#if DEBUG
 printk("The above can be considered as Development and Review in Industrial Practises");
#endif
 */
  1. Linux Depuração e Performance Tuning - Steve Melhor
  2. aplicações Linux depuração Techniques - Aurelian Melinte
  3. depuração com GDB: O depurador GNU fonte de nível de - Roland H. Pesch
  4. depuração incorporado Linux - Christopher Hallinan
  5. The Art of Depuração com GDB, DDD, e Eclipse - Norman S. Matloff
  6. Porque os programas Fail: Um Guia para depuração sistemática - Andreas Zeller
  7. Software Exorcismo: Um Manual para depuração e otimização de código legado - Bill Blunden
  8. Debugging: achado mais Elusive software e de hardware - David J. Agans
  9. depuração por Pensamento: A Multidisciplinary Approach - Robert Charles Metzger
  10. encontrar o erro: Um Livro de Programas incorretas - Adam Barr

Sistemas arquivo (1 -> 2 -> 6 -> ...)

"Eu queria ter memória virtual, pelo menos, como é juntamente com sistemas de arquivos". - Ken Thompson

Em um sistema UNIX, tudo é um arquivo; se algo não é um arquivo, ele é um processo, eXCEPT para tubos e tomadas nomeados. Em um sistema de arquivos, um arquivo é representado por um inode, uma espécie de número de série contém informações sobre os dados reais que compõem o arquivo. O Sistema Linux Virtual File VFS armazena informações na memória de cada sistema de arquivos como ele é montado e utilizado. Uma série de cuidados devem ser tomados para atualizar o sistema de arquivos corretamente como dados dentro desses caches é modificado como arquivos e diretórios são criados, gravados e apagados. O mais importante desses caches é o cache de buffer, que está integrado na maneira que os sistemas de arquivos individuais acessar seus dispositivos de armazenamento de blocos subjacentes.

Vídeo Palestras em sistemas de armazenamento , Arquivo flash amigável Sistema

long do_sys_open(int dfd, const char __user *filename, int flags, umode_t mode)
{
        struct open_flags op;
        int fd = build_open_flags(flags, mode, &op);
        struct filename *tmp;

        if (fd)
                return fd;

        tmp = getname(filename);
        if (IS_ERR(tmp))
                return PTR_ERR(tmp);

        fd = get_unused_fd_flags(flags);
        if (fd >= 0) {
                struct file *f = do_filp_open(dfd, tmp, &op);
                if (IS_ERR(f)) {
                        put_unused_fd(fd);
                        fd = PTR_ERR(f);
                } else {
                        fsnotify_open(f);
                        fd_install(fd, f);
                }
        }
        putname(tmp);
        return fd;
}

SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode)
{
        if (force_o_largefile())
                flags |= O_LARGEFILE;

        return do_sys_open(AT_FDCWD, filename, flags, mode);
}
  1. Linux File Systems - Moshe bar
  2. Linux Filesystems - William Von Hagen
  3. UNIX Filesystems: Evolução, design e implementação - Steve D. Pate
  4. Arquivo Prático System Design - Dominic Giampaolo
  5. Arquivo Sistema de Análise Forense - Brian Carrier
  6. Linux Filesystem Hierarchy - Binh Nguyen
  7. Btrfs: O Linux B-tree sistema de arquivos - Ohad Rodeh
  8. StegFS: um sistema de arquivos steganographic para Linux - Andrew D. McDonald , Markus G. Kuhn

Segurança (1 -> 2 -> 8 -> 4 -> 3 -> ...)

"UNIX não foi projetado para parar seus usuários de fazer coisas estúpidas, como que também iria impedi-los de fazer as coisas inteligentes". - Doug Gwyn

Sem técnica funciona se não for usado. mudança de Ética com a tecnologia.

" F × S = k " o produto de liberdade e segurança é uma constante. - Leis de Niven

Cryptography forma a base de confiança online. Hacking está explorando controles de segurança ou em um elemento técnico, físico ou um de base humana. Proteger o kernel de outros programas em execução é um primeiro passo em direção a um sistema seguro e estável, mas este não é obviamente suficiente: algum grau de proteção deve existir entre diferentes aplicações user-terra também. Exploits pode direcionar serviços locais ou remotos.

“Você não pode cortar o seu destino, a força bruta ... você precisa de uma porta traseira, um canal lateral para a vida." - Clyde Dsouza

Computadores não resolvem os problemas, eles executam soluções. Atrás de cada href="http://en.wikipedia.org/wiki/Nondeterministic_algorithm" rel="noreferrer"> código algorítmico , há um determinada mente . - / var / log / dmesg

Vídeo Palestras em Criptografia e Segurança de Rede , Namespaces para a Segurança , proteção contra ataques remotos , Secure Linux Embedded

env x='() { :;}; echo vulnerable' bash -c "echo this is a test for Shellsock"
  1. Hacking: The Art of Exploitation - Jon Erickson
  2. O Rootkit Arsenal: Fuga e Evasão nos cantos escuros do Sistema - Bill Blunden
  3. Hacking Exposed: Secrets Network Security - Stuart McClure, Joel Scambray, George Kurtz
  4. Um Guia para Kernel Exploração: Atacar o Núcleo - Enrico Perla, Massimiliano Oldani
  5. The Art of Memory Forensics - Michael Hale Ligh, Andrew Case, Jamie Levy, Aaron Walters
  6. Engenharia Reversa
  7. Prático - Bruce Dang, Alexandre Gazet, Elias Bachaalany
  8. Prático Análise de Malware - Michael Sikorski, Andrew Honig
  9. máxima Linux Security: um hacker Guia em proteger a sua Linux Servidor - < em> Anonymous
  10. Linux Segurança - Craig caça
  11. Real World Segurança Linux - Bob Toxen

Kernel Fonte (0,11 -> 2.4 -> 2.6 -> 3,18)

"Como o vinho, o domínio da amadurece programação do kernel com o tempo. Mas, ao contrário do vinho, fica mais doce no processo". --Lawrence Mucheka

Você não pode pensar que os programadores são artistas, mas a programação é uma profissão extremamente criativo. É de criatividade baseada em lógica. educação ciência da computação não pode fazer alguém um programador especialista mais do que estudar pincéis e pigmentos não fazem um pintor especialista. Como você já sabe, há uma diferença entre conhecer o caminho e percorrer o caminho; é de extrema importância para arregaçar as mangas e sujar as mãos com o código fonte do kernel. Finalmente, com o seu kernel, assim, ganhou conhecimento , onde quer que vá, você irá brilho .

codificadores imaturos imitam; codificadores maduros roubar; codificadores maus desfigurar o que eles tomam, e bons codificadores torná-lo em algo melhor, ou pelo menos algo diferente. A boa codificador soldas seu furto em um todo de sentimento que é único, totalmente diferente daquele de onde foi rasgado.

Vídeo Palestras no Kernel Receitas

linux-0.11
├── boot
│   ├── bootsect.s      head.s      setup.s
├── fs
│   ├── bitmap.c    block_dev.c buffer.c        char_dev.c  exec.c
│   ├── fcntl.c     file_dev.c  file_table.c    inode.c     ioctl.c
│   ├── namei.c     open.c      pipe.c          read_write.c
│   ├── stat.c      super.c     truncate.c
├── include
│   ├── a.out.h     const.h     ctype.h     errno.h     fcntl.h
│   ├── signal.h    stdarg.h    stddef.h    string.h    termios.h
│   ├── time.h      unistd.h    utime.h
│   ├── asm
│   │   ├── io.h    memory.h    segment.h   system.h
│   ├── linux
│   │   ├── config.h    fdreg.h fs.h    hdreg.h     head.h
│   │   ├── kernel.h    mm.h    sched.h sys.h       tty.h
│   ├── sys
│   │   ├── stat.h      times.h types.h utsname.h   wait.h
├── init
│   └── main.c
├── kernel
│   ├── asm.s       exit.c      fork.c      mktime.c    panic.c
│   ├── printk.c    sched.c     signal.c    sys.c       system_calls.s
│   ├── traps.c     vsprintf.c
│   ├── blk_drv
│   │   ├── blk.h   floppy.c    hd.c    ll_rw_blk.c     ramdisk.c
│   ├── chr_drv
│   │   ├── console.c   keyboard.S  rs_io.s
│   │   ├── serial.c    tty_io.c    tty_ioctl.c
│   ├── math
│   │   ├── math_emulate.c
├── lib
│   ├── close.c  ctype.c  dup.c     errno.c  execve.c  _exit.c
│   ├── malloc.c open.c   setsid.c  string.c wait.c    write.c
├── Makefile
├── mm
│   ├── memory.c page.s
└── tools
    └── build.c
  1. início do novato com Linux 0.11 fonte (menos de 20.000 linhas de código-fonte). Após 20 anos de desenvolvimento, em comparação com Linux 0.11, Linux tornou-se muito grande, complexo e difícil de aprender. Mas o conceito de design e estrutura principal não têm c fundamentaisHanges. Aprender Linux 0,11 ainda tem significado prático importante.
  2. Leitura obrigatória para Kernel Hackers => Linux_source_dir/Documentation/*
  3. Você deve ser subscrito e ativo na lista de discussão em-menos do kernel um. Comece com do kernel novatos .
  4. Você não precisa ler o código fonte completo. Quando estiver familiarizado com o kernel APIs e seu uso, iniciar diretamente com o código-fonte do sub-sistema que você está interessado. Você também pode começar a escrever seus próprios módulos de plug-n-play para experimento com o kernel.
  5. escritores de driver de dispositivo iria beneficiar por ter o seu próprio hardware dedicado. Comece com Raspberry Pi .

Confira O Kernel Janitor Projeto Linux

'' Nós passamos por código fonte do Linux kernel, fazendo revisões de código, fixando-se o código não mantido e fazer outras limpezas e conversões de API. Ele é um bom começo para kernel hacking. ''

Eu teria que dizer: "aprender C". :)

Tente este livro online grátis.

Linux Kernel Module Guia de Programação http://www.linuxhq.com/guides/LKMPG/mpg.html

Verifique kernelnewbies.org, assine a lista de discussão KernelNewbies, tem que irc.oftc.org #kernelnewbies

Alguns recursos:

  • Livro: Robert Love, Linux Kernel Development, 3ª edição
  • Livro: Corbet, Rubini, drivers de dispositivo Linux, 3ª edição (versão livre aqui )
  • Livro: kernel do Linux em poucas palavras (versão gratuita aqui )
  • Material gratuito fornecido pela gratuito elétrons
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top