swapリストでのCのお勉強


Rev.2を表示中。最新版はこちら

swapon関数内でスワップ領域のプライオリティに応じ、そのリストを作成する箇所である。pが新規にリストにつなごうとするswap_infoで、swap_info[]がそれぞれのスワップ領域を表している。swap_list_t構造対はheadとnextの2つのメンバーをもつ構造体で、swap_info[]リストのヘッドとなる。初期値は-1,-1である。
static struct swap_list_t swap_list = {-1, -1};
static struct swap_info_struct swap_info[MAX_SWAPFILES];

  /* insert swap space into swap_list: */
   prev = -1;
   for (i = swap_list.head; i >= 0; i = swap_info[i].next) {
           if (p->prio >= swap_info[i].prio) {
                  break;
           }
           prev = i;
   }
   p->next = i;
   if (prev < 0) {
           swap_list.head = swap_list.next = p - swap_info;
   } else {
           swap_info[prev].next = p - swap_info;
   }
初めてスワップを登録するとき、swap_list の初期値が-1であることとi >= 0条件で、forループはスキップする。従ってprev = -1で、swap_list.headとswap_list.nextにはp - swap_infoが設定される。

2回目以降はforループでチェックされ、pより小さいプライオリティのswap_infoがあると、そこでループを抜ける。そして直前のpより大きいプライオリティのswap_infoはprevに設定されており、そのswap_info.nextにp - swap_infoを設定し、p->nextにpより次に小さいプライオリティの位置となるiを設定することでリストを作成している。このリストはswap_info[]内の配列インデックスで構成していることになるのだが。で・・・・

p - swap_infoは配列インデックスを算出するわけである。実はアドレスpからアドレスswap_infoまでの差とばっかし思い込んでいたため、ここの理解に悩んでしまった。
struct test {
       int dummy1;
       int dummy2;
};
struct test a[10];
main()
{
   struct test *p;
   p = a;
   p++;
   p++;
   printf("%d\n", a);
   printf("%d\n", p);
   printf("%d\n", p - a);
}
結果は以下の通りであった。
[root@KURO-BOXHG kitamura]# ./a.out
268503276
268503292
2


最終更新 2010/05/08 23:47:53 - north
(2010/05/08 23:37:42 作成)


検索

アクセス数
3592839
最近のコメント
コアダンプファイル - sakaia
list_head構造体 - yocto_no_yomikata
勧告ロックと強制ロック - wataash
LKMからのファイル出力 - 重松 宏昌
kprobe - ななし
ksetの実装 - スーパーコピー
カーネルスレッドとは - ノース
カーネルスレッドとは - nbyst
asmlinkageってなに? - ノース
asmlinkageってなに? - よろしく
Adsense
広告情報が設定されていません。