Linuxカーネルに関する技術情報を集めていくプロジェクトです。現在、Linuxカーネル2.6解読室の第2章までを公開中。
シンボリックリンクファイルの作成は、vfs sys_symlink(do_symlink)関数においてlookup_dentry関数を用いて、ファイルを登録する親ディレクトリのiノードを求めた後、そのiノードのsymlinkオペレーションを呼び出すことにより実現されている。ext2ファイルシステムでは、ext_symlink関数が呼び出される。
ext2_symlink(親ディレクトリのiノード, 登録するdentry, 登録するパス名) フリーiノードを一つ確保(ext2_new_inode関数) iノードの初期化 if(登録するパス名が60文字以上?) { inode操作テーブルとして、page_symlink_inode_operations, ext2_aopsを登録 ページI/Oを利用してパス名をブロックに書き込む(block\_symlink関数) } else { /* パス名が60文字未満 */ inode操作テーブルとして、ext2_fast_symlink_inode_operationsを登録 iノード中に登録パス名をコピー iノードのファイルサイズ情報(i_sizeメンバ)に上記パス名長+1を設定 } ◇iノードの遅延書き込み要求(mark_inode_dirty関数) このiノードを親ディレクトリに登録(ext2_add_entry関数) 新規作成したシンボリックリンクファイルのdentryとiノードをリンク(d_instantiate関数) block_symlink(iノード, 登録するパス名, パス長) ページキャッシュを確保(grab_cache_page関数) ページ書き込み準備要求を出す(inodeのprepare_writeメソッド) ページにパス名をコピーする。 ページ書き込み要求を出す(inodeのcommit_writeメソッド) ページ読み込み要求を出す(inodeのreadpageメソッド) ページキャッシュの解放(page_cache_release関数) ◇iノードの遅延書き込み要求(mark_inode_dirty関数)
リンク先のパス名が長い場合は、以下のようになる。
リンク先のパス名が短い場合は、以下のようになる。
問題点, 注意点
(NIS)HirokazuTakahashi
2000年12月09日 (土) 23時55分06秒 JST1
[PageInfo]
LastUpdate: 2008-08-27 14:18:30, ModifiedBy: hiromichi-m
[Permissions]
view:all, edit:login users, delete/config:members