Pregunta

Estoy tratando de implementar una función para rastrear un proceso de espacio de usuario bloqueado en el núcleo. Como estoy trabajando en Kernel, no tengo el lujo de ninguna biblioteca y la función de rastreo no es compatible con la arquitectura MIPS. Me pregunto si puedo emular lo que hace GDB. La versión del núcleo es 2.6.21.

¿Fue útil?

Solución

Creo que puede hacer referencia a la implementación de oprofile .

Oprofile usa frame-pointer para obtener la información de rastreo posterior, por lo que requiere las aplicaciones de espacio de usuario y sus bibliotecas relacionadas, todas construidas con frame-pointer habilitado. (" -fno-omit-frame-pointer quot; opción).

Otra forma es que si las aplicaciones del usuario contienen información de depuración, es posible que necesite verificar la información DWARF de la aplicación del usuario, la información de marco de llamada DWARF proporciona al depurador información suficiente sobre cómo se llama una función, de modo que pueda ubicar cada uno de los argumentos de la función, ubicar el marco de llamada actual y ubicar el marco de llamada para la información de llamada.

Si desea simplemente rastrear la información de rastreo posterior sin " frame-pointer " compatible o cualquier información de depuración, entonces debe verificar la instrucción mips de la aplicación del usuario, recorrer las cosas del contexto del niño (SP, IP, RP) para obtener el contexto padre (SP, IP, RP) según la especificación ABI de mips, esta es una poco complicado y lento ya que tiene que desmontar muchas instrucciones en la memoria, pero no funciona mal. Por ejemplo, para muchas rutinas, hay un & Quot; add sp, sp, -32 & Quot; como la instrucción al principio, y sabrás que el parent'sp es actual sp plus 32.

La segunda y tercera forma en que debe implementarlo usted mismo ya que trabaja en el núcleo.

Otros consejos

El archivo principal está en formato ELF . Este es un estándar, que está disponible en muchos sitios web a solo un google de distancia.

SIN EMBARGO, este formato de archivo no es trival. Un montón de peculiaridades y bits. Cualquier persona razonable debe usar una biblioteca de terceros. Si realmente quieres hacer eso, comienza con libelf y readelf. y desearte buena suerte.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top