Notas de estudo do kernel RT-Thread - compreensão aprofundada da estrutura da lista vinculada de objetos kernel

RT-Thread Kernel Study Notes-Kernel Object rt_object

RT-Thread Kernel Study Notes-Kernel Object Management

RT-Thread Kernel Study Notes-Kernel Object Operation API

RT-Thread kernel estudo notas - inicialização de objeto kernel organização de lista vinculada

Notas de estudo do kernel RT-Thread - compreensão aprofundada da estrutura da lista vinculada de objetos kernel

Notas de estudo do kernel RT-Thread - compreensão do modelo do dispositivo rt_device

RT-Thread Kernel Study Notes - Compreendendo threads de zumbi extintos

 

fundo

  • Para aprender o objeto kernel, você precisa entender a estrutura de dados básica.
  • A maioria das estruturas de dados mais complexas são estruturas de dados do objeto kernel, que são baseadas em estruturas de lista vinculada.
  • Precisa de uma compreensão profunda de como os objetos do kernel estão conectados.

 

Método um do link de lista vinculada

O próximo ponteiro da lista vinculada aponta para o primeiro endereço da próxima estrutura de objeto.

2021-02-15_093523.png

 

Método dois de link de lista vinculada

O próximo ponteiro da lista vinculada aponta para o próximo membro da lista vinculada da próxima estrutura de objeto.

2021-02-15_093610.png

 

O endereço de memória de entrada do objeto kernel (primeiro endereço)

  • Objeto de kernel RT-Thread, usando o método dois de link de lista vinculada.
  • Portanto, o endereço da lista de membros da estrutura do objeto pode ser obtido percorrendo a lista vinculada (o endereço do primeiro próximo membro da lista é o primeiro endereço da própria lista)
  • Sabendo o endereço do membro da estrutura, como encontrar o primeiro endereço da própria estrutura?

2021-02-15_093626.png

  • A estrutura da estrutura em si não mudará, o tamanho e o tamanho não mudarão, portanto, a posição de cada membro da estrutura é fixa.
  • O endereço do membro da estrutura, em relação ao primeiro endereço, o tamanho do deslocamento é fixo.

 

RT-Thread 使用 : rt_list_entry

 

/**
 * @brief get the struct for this entry
 * @param node the entry point
 * @param type the type of structure
 * @param member the name of list in structure
 */
#define rt_list_entry(node, type, member) \
    rt_container_of(node, type, member)
/**
 * rt_container_of - return the member address of ptr, if the type of ptr is the
 * struct type.
 */
#define rt_container_of(ptr, type, member) \
    ((type *)((char *)(ptr) - (unsigned long)(&((type *)0)->member)))
  • Se o primeiro endereço da estrutura for 0, o deslocamento do membro será o endereço da estrutura.
  • Supondo que o primeiro endereço da estrutura seja x, o deslocamento do membro é: x + deslocamento.
type a; /* 临时变量,主要为了求成员的偏移 */

/* 成员m 的地址偏移 */
offset = &a.member - &a;

/* 假如已知结构体的某个成员m的地址ptr */

p = ptr - offset; /* ptr - (&a.m - &a)  */
  • Encontre o deslocamento do membro (deslocamento), você pode obter o endereço da própria estrutura

 

Resumindo

  • Precisa entender profundamente o método de conexão e o método de operação da estrutura da lista vinculada.
  • O núcleo RT-Thread fornece uma API de operação de lista vinculada mais rica, que pode ser aprendida e usada.
  • Domine a operação da estrutura de dados para estabelecer a base para o estudo subsequente do kernel.

Acho que você gosta

Origin blog.csdn.net/tcjy1000/article/details/113813922
Recomendado
Clasificación