O kernel do linux (especificamente 2.6 em diante) possui alguma função recursiva?

4

Dado o tamanho fixo limitado da pilha do kernel, meu palpite é que, embora teoricamente possamos ter uma função recursiva se sua recursão não for muito profunda, o pragmatismo sugeriria eliminar todas as funções recursivas, para estar em uma lado mais seguro. Afinal, muita recursão pode resultar na limpeza da estrutura * thread_info_t * e um pânico do kernel resultante

    
por gjain 25.04.2012 / 21:28

3 respostas

8

Sim!

Talvez algumas das chamadas recursivas sejam documentadas ou façam parte de nomes de função? Então, um find / grep deve revelá-los. Aqui está um comando para fazer isso:

find /usr/src/linux/ -name "*.c" -exec grep recursive {} ";" -ls 

Conduzindo isso através | wc -l me dá 270, ou seja, desde -ls imprime uma linha adicional por arquivo, pelo menos 135 arquivos + funções.

Vamos dar uma olhada no primeiro jogo:

/usr/src/linux/fs/jfs/jfs_dmap.c

A partida é um comentário:

  • if the adjustment of the dmap control page, itself, causes its
  • root to change, this change will be bubbled up to the next dmap
  • control level by a recursive call to this routine, specifying
  • the new root value and the next dmap control page level to
  • be adjusted.

na frente do método

static int
dbAdjCtl(struct bmap * bmp, s64 blkno, int newval, int alloc, int level)

e, de fato, a linha 2486 e os vizinhos são:

if (dcp->stree[ROOT] != oldroot) {
    /* are we below the top level of the map.  if so,
     * bubble the root up to the next higher level.
     */
    if (level < bmp->db_maxlevel) {
        /* bubble up the new root of this dmap control page to
         * the next level.
         */
        if ((rc =
             dbAdjCtl(bmp, blkno, dcp->stree[ROOT], alloc,
                  level + 1))) {
            /* something went wrong in bubbling up the new
             * root value, so backout the changes to the
             * current dmap control page.
             */

Como a pergunta era: se há qualquer função recursiva , não precisamos visitar as próximas 135 ou mais correspondências ou pesquisar por recursões não mencionadas explicitamente. A resposta é

Sim!

    
por 26.04.2012 / 03:25
7

O estilo de codificação do kernel do Linux não proíbe funções recursivas.

Você precisa ser cuidadoso e não sobrecarregar a pilha, mas esse cuidado não é específico para funções recursivas. Não use recursão quando um loop for , e tenha em mente que você e as funções que chamam você recebem apenas 8kB no total, mas ocasionalmente a recursão é a ferramenta certa.

    
por 26.04.2012 / 03:00
2

Os kernels atuais têm mais de 10 milhões de linhas de código. Estou convencido de que algumas dessas linhas de código são recursivas. A programação recursiva é muito poderosa e você não precisa correr muitos níveis para fazê-la pagar.

    
por 25.04.2012 / 22:34