Trace32 で Linux リンク リストをユーザー フレンドリーな方法で印刷しようとしています。
1. 利用可能な既知の方法は既にありますか?
そうでない場合は、モジュールリストの例を示します。
グローバル変数があります
static struct list_head modules;
どこ
struct list_head {
struct list_head *next, *prev;
};
そのため、T32 では、実行時に next および prev ポインターのリストが表示されるだけでv.v modules
、実際には有用な情報はありません。ただし、モジュール リストのすべてのノードはコンテナー タイプの一部です。この場合、構造体モジュール
struct module {
...
struct list_head list;
...
}
通常、Linux はコンテナー ポインターを抽出するために、container_ofマクロを使用します。
/**
* container_of - cast a member of a structure out to the containing structure
* @ptr: the pointer to the member.
* @type: the type of the container struct this is embedded in.
* @member: the name of the member within the struct.
*
*/
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
この例struct list_head
では、list
メンバーであるポインターを知っているので、コンテナーへのポインターを取得するためにstruct module
呼び出す必要があります。container_of(modules->next, struct module, list)
これを T32 でアーカイブできるようにするにはlist
、コンテナー タイプのメンバーのオフセットを計算する必要があります。
誰でもこれを達成する方法を知っていますか?