lendo e compreendendo o código c


8

Eu quero entender o código do kernel do linux, e já o tenho analisado, mas não consigo entender completamente o que está acontecendo (estou me concentrando na parte de rede do kernel do linux), então qualquer um de vocês pode sugerir boas práticas de leitura do código C (ou qualquer outro idioma) em geral e específico da parte da rede do kernel do Linux. desde já, obrigado


12
O kernel do Linux é louco. Ele faz muitas coisas estranhas pelo desempenho. Portanto, é muito mais difícil ler do que o nível de aplicativo c. Nunca escreva código assim!
Byron Whitlock

Respostas:


10

Se você precisa aprender C lendo primeiro, o kernel do Linux não é o local onde você começaria: é um programa bastante atípico e de baixo nível (embora eu tenha achado bem estruturado).

Em vez disso, consulte o código-fonte para algum programa utilitário BSD, por exemplo, aqueles no OpenBSD . Leia sua página de manual para obter uma especificação semi-formal e de alto nível do programa.

Pegue uma cópia da leitura de código de Spinellis e / ou da prática de programação de Kernighan e Pike .

Por fim, leia um bom livro sobre os componentes internos do kernel do Unix ou Linux e comece a ler o kernel. (Eu achei o Design do sistema operacional Unix de Maurice J. Bach (ca. 1986) ainda um bom começo, mesmo para o Linux.)


obrigado larsmans, o livro de leitura de código fala muito sobre c, você pode sugerir um livro semelhante em C ++

@ hue: Eu nunca encontrei um livro tão bom sobre C ++. Se alguém conhece um, eu estaria interessado.
Fred Foo

2

O que fiquei surpreso ao ver quando tentei fazer a mesma coisa (que você deseja fazer) é encontrar tão poucos comentários relevantes (se houver) em um código tão complexo.

A documentação deve ser o código, certo, mas o recurso de comentários existe na linguagem de programação C por um motivo.

Se eles foram removidos, provavelmente é também por um motivo: para mantê-lo longe disso.

Eu sinceramente duvido que todos os desenvolvedores do kernel tenham que trabalhar nessa base de código limpa e minha opinião é que (pelo menos) o autor de qualquer "recurso" do kernel (como epoll, pelo bem da discussão) mantém uma versão privada do código COM todos esses comentários ausentes.

Por que eu acredito nisso?

Um desenvolvedor de kernel proeminente, tentando me convencer a liberar o código-fonte do servidor G-WAN como código-fonte aberto, me aconselhou a "dificultar a leitura possível".

Ele acrescentou que essa tática funcionou maravilhosamente para ele durante décadas em todos os seus projetos de "código aberto".

Manter o controle sobre qualquer parte crítica de um projeto de "código aberto" amplamente usado obviamente cria oportunidades quando suas receitas provêm exclusivamente de consultoria.

Portanto, voltando à sua pergunta, a coisa mais útil que você pode fazer para entender esse código é estudá-lo passo a passo e adicionar os comentários ausentes.

Então, progressivamente, começará a fazer sentido (e você descobrirá por que os comentários foram removidos).


4
-1 para acusações anônimas.

Embora eu concorde que os comentários sejam importantes, certamente alguém poderia argumentar que o kernel do Linux foi escrito por especialistas e que apenas pretendia ser lido / modificado por outros especialistas. Muitos dos comentários que você e eu acharíamos úteis provavelmente seriam considerados "ruído" para o público-alvo, como nunca escreveríamos:i++ // increment i by 1
Cody Gray

@ Larsman, eu me apresento na minha conta, então isso NÃO é uma acusação anônima.

@ Cody, o dia em que você escreverá o código tão rápido quanto G-WAN (eu gostaria que você pudesse), você entenderá que, embora eu comente fortemente meu código, provavelmente não preciso que "i ++" seja comentado.

3
-1. Eu gostaria de poder subtrair mais.

0

O que às vezes me ajuda é a depuração do código. A visualização de dados reais e os caminhos reais tendem a torná-lo mais compreensível para mim. Conforme apontado por outros membros, o código do kernel Linux é um ponto de partida muito ruim para a compreensão c.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.