Preguntas frecuentes sobre el kernel de Linux

     ¿Recomendaría algunos buenos libros de referencia del kernel de Linux?
  a. "Controladores de dispositivos Linux, segunda edición", hay una traducción al chino
  b. "Comprensión del kernel de Linux, segunda edición"
  c. "Análisis del escenario del código fuente del kernel de Linux", dividido en dos volúmenes
  d. "Aprendiendo haciendo-Linux guía del kernel "

    ¿Cómo obtener una determinada versión del código fuente del kernel de Linux?
  A. Http://www.kernel.org o ftp://ftp.kernel.org, este es el sitio web de lanzamiento de la versión del kernel de Linux.
  b) Muchos espejos o sitios web locales también proporcionan descargas de algunas versiones del kernel de Linux, y los motores de búsqueda ftp se utilizan principalmente.
  c. Las distribuciones generales de Linux como Redhat proporcionarán el código fuente del kernel correspondiente con el disco, pero este código fuente a menudo se cambia y puede ser algo diferente del kernel estándar de Linux de la misma versión.

    ¿Recomienda algunas herramientas de visualización de código fuente?
  El sistema Windows puede usar Source Insight, el sistema Linux puede usar Source Navigator.
  b. editor vim o emacs, con cscope, ctags, etags y otras herramientas de referencia cruzada.
  c. editor vim o emacs, con grep, egrep y otras herramientas de búsqueda de texto, pero es mejor estar familiarizado con la estructura del directorio del código fuente
  d. LXR, navegar a través del navegador en forma de página web, la instalación es complicada , puede descargarlo desde http: / /lxr.linux.no/ Para descargar la herramienta, también puede visitar directamente http://lxr.linux.no/source/ para leer el código fuente del kernel de Linux en línea.

    ¿En qué archivo fuente del kernel se encuentra la definición de estructura xx?
  a. Utilice la herramienta de visualización de código fuente, consulte la pregunta 2.2.
  b. Si utiliza herramientas de búsqueda de texto como grep, busque principalmente en los directorios include / linux e include / asm.

    ¿Qué significan volátil y __volátil__?
  a. Volatile es una palabra clave definida en el lenguaje C, y gcc define __volatile__ para sus necesidades, que tiene el mismo significado que volatile.
  b) El significado original de volátil es "volátil". Como la velocidad de acceso al registro es más rápida que el acceso a la memoria, el compilador generalmente optimiza para reducir el acceso a la memoria. Si la variable se modifica con volátil, el compilador no optimizará las operaciones de lectura y escritura de esta variable, es decir, accederá directamente a la memoria sin pasar por el búfer de registro.
  c. __asm__ __volatile__ together indica al compilador que no modifique ni optimice la declaración de ensamblaje posterior.

    ¿Qué significa {...} while (0)?
  a. Principalmente para evitar algunos errores que pueden ocurrir cuando la macro se expande en diferentes situaciones.
  b. Hay una introducción detallada en http://www.kernelnewbies.org/faq/.

    ¿Cuál es la definición de list_entry?
  a. La definición de list_entry está en el archivo fuente del kernel include / linux / list.h:
  #define list_entry (ptr, type, member) \
  ((type *) ((char *) (ptr) - (unsigned long) ( & ((type *) 0) -> member)))
  b. Su función es convertirla en la dirección inicial de su estructura de host de acuerdo con el puntero list_head ptr. La estructura de host es de tipo y ptr se define como miembro en su miembro de la estructura del anfitrión. Como se muestra abajo:

  req> | dirección de inicio del tipo de objeto
  |
  | ... ...
  ptr> | miembro dirección del miembro apuntada por el puntero ptr
  |
  | ... ...

  ptr apunta a la posición que se muestra en la figura, a través de (unsigned long) (& ((type *) 0) -> member) para obtener la diferencia entre ptr y req, ptr resta esta diferencia para obtener la estructura de host de tipo-tipo La puntero req, el tipo de retorno es (tipo *).

    ¿A qué se debe prestar atención en la programación de módulos?
  a. Agregue -c a
  la opción del compilador gcc b. Defina dos macros en la opción del compilador gcc: -DMODULE -D__KERENL__
  o defina estas dos macros directamente en el archivo fuente:
  #define MODULE
  #define __KERNEL__
  c. En el archivo fuente Incluya el archivo module.h:
  #include
  d. Si desea utilizar la función en línea, debe agregar -O2 a las opciones del compilador gcc

    ¿Por qué la versión no coincide al instalar un módulo?
  Suponiendo que la ruta absoluta del directorio de origen del kernel que está ejecutando es MyKernelSrcPath, agregue la opción al compilar gcc:
  -I $ MyKernelSrcPath / include

    ¿Por qué aparece el símbolo sin resolver?
  Primero revise el archivo / proc / ksyms para ver si el kernel ha generado este símbolo. Diferentes versiones del kernel como 2.2 y 2.4 tendrán algunos cambios en los símbolos de salida.
  b) Si el símbolo generado por el kernel tiene información de control de versión como el símbolo printk_R12345678, la naturaleza es la misma que en la pregunta 3.2.

    ¿Por qué no hay un error de licencia?
  Agregue la siguiente línea en el archivo fuente:
  MODULE_LICENSE ("GPL");

    ¿Por qué no puedo ver la información impresa con printk?
  a. El mensaje de impresión está restringido por el nivel. El nivel del mensaje se puede establecer mediante printk, como:
  printk ("algo"); / * donde 0 <= n <= 7 * /
  asumiendo que el nivel de mensaje de la consola es m, cuando n es tal Por un lado, puede aumentar el nivel del mensaje a imprimir (cuanto menor es el número, mayor es el nivel). Por otro lado, puede cambiar el nivel del mensaje de la consola (de 1 a 8). Por ejemplo, a 8 puede usar el siguiente comando:
  # echo "8"> / proc / sys / kernel / printk
  b. Use el comando dmesg para ver.
  c. Cuando el sistema ejecuta klogd y syslogd, los mensajes del kernel serán distribuidos por klogd a syslogd, y syslogd se encargará de ello de acuerdo con el archivo de configuración /etc/syslog.conf. Puede consultar las páginas man de syslogd y syslog. conf para más detalles.

    ¿Cómo crear y utilizar archivos de parche?
  El archivo de parche es generado por el comando diff. Para usar el archivo de parche y el comando de parche, puede ver la página de manual y la información de diff y parche.

    ¿Se pueden usar llamadas al sistema en el kernel?
  a. Sí. Hay ejemplos de uso de llamadas al sistema en el código fuente del kernel, como open (), execve (), etc.
  b. El uso de llamadas al sistema en el kernel debe incluir las siguientes dos líneas en el archivo fuente:
  #define __KERNEL_SYSCALLS__
  #include
  c. Las definiciones relevantes de las llamadas al sistema utilizadas en el kernel se pueden encontrar en el archivo include / asm / unistd. h.
  Si la llamada al sistema que se utilizará no está definida en el archivo, puede agregarla de acuerdo con su formato.

    ¿Cómo abrir y manipular un archivo en el kernel?
  Utilice open (), read () y otras llamadas al sistema directamente, consulte la pregunta 4.2.
  b) Utilice la función filp_open () para abrir el archivo y obtener el puntero fp del archivo struct *.
  Use el puntero fp para las operaciones correspondientes, como leer un archivo, puede usar fp-> f_ops-> read.
  Finalmente, use la función filp_close () para cerrar el archivo.
  Las funciones filp_open () y filp_close () se definen en fs / open.cy se declaran en include / linux / fs.h.
  c. Escriba la función contenedora usted mismo, consulte las funciones open_exec () y kernel_read () en el archivo fs / exec.c.
  Hay algunos códigos de referencia en http://www.linuxforum.net/forum/showflat.php?Cat=&Board=linuxK&Number=363455&page=&view=&sb=&o=&vc=1.

    ¿Por qué ocurren errores EFAULT al leer y escribir archivos en el kernel?
  Se espera que las funciones como read () y write () proporcionadas por el sistema de archivos del kernel sirvan programas en modo de usuario, por lo que verificará que el búfer de lectura y escritura no exceda el límite superior del espacio de usuario, que es 0xC000 0000. Pero ahora en el kernel para leer y escribir archivos, la dirección del búfer en el kernel superará 0xC000 0000.
  b. Obtenga el fs actual antes de leer y escribir el archivo: mm_segment_t old_fs = get_fs ();
  y establezca el fs actual como el kernel fs: set_fs (KERNEL_DS);
  restaure el fs original después de leer y escribir el archivo: set_fs (old_fs) ;
  set_fs (), Get_fs () y otras macros relacionadas se definen en el archivo include / asm / uaccess.h.

    ¿Qué archivo es el código fuente del comando xx y la biblioteca xx?
  a. Además del kernel, un sistema también necesita una serie de herramientas y comandos como shell, gcc y una serie de bibliotecas como las bibliotecas C. Como aplicación, el código fuente no está en el kernel, y el correspondiente el código fuente debe descargarse por separado.
  b) Para el sistema Redhat, puede usar el comando rqm -qf para encontrar el paquete de software donde se encuentra un comando determinado y luego encontrar el paquete de código fuente correspondiente para la instalación.

Supongo que te gusta

Origin blog.csdn.net/bcbobo21cn/article/details/115014841
Recomendado
Clasificación