ලිනක්ස් කර්නල් පද්ධති ඇමතුම් ක්‍රියාත්මක කිරීම සොයා ගන්නේ කෙසේද?


376

mkdirකර්නල් ප්‍රභවය දෙස බැලීමෙන් ශ්‍රිතයක් ක්‍රියා කරන්නේ කෙසේද යන්න තේරුම් ගැනීමට මම උත්සාහ කරමි . මෙය කර්නල් අභ්‍යන්තරය අවබෝධ කර ගැනීමට සහ විවිධ කාර්යයන් අතර සැරිසැරීමට දරන උත්සාහයකි. මම දන්නේ mkdirඅර්ථ දක්වා ඇත sys/stat.h. මට මූලාකෘතිය හමු විය:

/* Create a new directory named PATH, with permission bits MODE.  */
extern int mkdir (__const char *__path, __mode_t __mode)
     __THROW __nonnull ((1));

දැන් මෙම ශ්‍රිතය ක්‍රියාත්මක කරන්නේ කුමන C ගොනුවේදැයි බැලීමට මට අවශ්‍යය. මූලාශ්‍ර නාමාවලියෙන් මම උත්සාහ කළා

ack "int mkdir"

පෙන්වන

security/inode.c
103:static int mkdir(struct inode *dir, struct dentry *dentry, int mode)

tools/perf/util/util.c
4:int mkdir_p(char *path, mode_t mode)

tools/perf/util/util.h
259:int mkdir_p(char *path, mode_t mode);

නමුත් ඒ කිසිවක් අර්ථ දැක්වීමට නොගැලපේ sys/stat.h.

ප්රශ්නය

  1. mkdirක්‍රියාත්මක කරන ගොනුව කුමක්ද?
  2. ඉහත වැනි ක්‍රියාකාරී අර්ථ දැක්වීමක් සමඟ, ක්‍රියාත්මක කරන්නේ කුමන ගොනුවදැයි සොයා ගන්නේ කෙසේද? ක්‍රම නිර්වචනය කිරීමේදී හා ක්‍රියාත්මක කිරීමේදී කර්නලය අනුගමනය කරන රටාවක් තිබේද?

සටහන: මම කර්නලය 2.6.36-rc1 භාවිතා කරමි .


2
මාර්ගය වන විට, මෙය පරීක්ෂා කරන්න: voinici.ceata.org/~tct/resurse/utlk.pdf
ටොම් බ්‍රිටෝ

Answers:


388

පද්ධති ඇමතුම් සාමාන්‍ය ක්‍රියාකාරී ඇමතුම් මෙන් හසුරුවනු නොලැබේ. පරිශීලක අවකාශයේ සිට කර්නල් අවකාශයට මාරුවීම සඳහා විශේෂ කේතයක් අවශ්‍ය වේ, මූලික වශයෙන් ඇමතුම් අඩවියේ ඔබේ වැඩසටහනට ඉන්ලයින් එකලස් කිරීමේ කේතයක් එන්නත් කරනු ලැබේ. පද්ධති ඇමතුම "අල්ලා ගන්නා" කර්නල් පැති කේතය ද ඔබට අවම වශයෙන් මුලදී ගැඹුරින් තේරුම් ගැනීමට අවශ්‍ය නොවන පහත් මට්ටමේ දේවල් වේ.

දී include/linux/syscalls.hඔබේ කර්නල් ප්රභවය බහලුම යටතේ, ඔබට මෙම සොයා:

asmlinkage long sys_mkdir(const char __user *pathname, int mode);

එවිට /usr/include/asm*/unistd.hඔබ මෙය සොයා ගනී:

#define __NR_mkdir                              83
__SYSCALL(__NR_mkdir, sys_mkdir)

මෙම කේතය කියන්නේ mkdir(2)පද්ධති ඇමතුම # 83 බවයි. එනම්, පද්ධති ඇමතුම් කැඳවනු ලබන්නේ අංකයෙන් මිස ඔබේම වැඩසටහන තුළ ඇති සාමාන්‍ය ශ්‍රිත ඇමතුමකින් හෝ ඔබේ වැඩසටහනට සම්බන්ධ පුස්තකාලයක ශ්‍රිතයකට නොවේ. මා ඉහත සඳහන් කළ පේළි එකලස් කිරීමේ මැලියම් කේතය මෙය භාවිතා කරන්නේ පරිශීලකයාගේ සිට කර්නල් අවකාශයට මාරුවීමටය, ඔබේ පරාමිතීන් ඒ සමඟ රැගෙන යයි.

මෙහි දේවල් ටිකක් අමුතු බවට තවත් සාක්ෂියක් නම් පද්ධති ඇමතුම් සඳහා සෑම විටම දැඩි පරාමිති ලැයිස්තුවක් නොමැති වීමයි: open(2)උදාහරණයක් ලෙස පරාමිති 2 ක් හෝ 3 ක් ගත හැකිය. මාධ්යයන් open(2)වන්නේ කුරුලෑ , C ++ නොවේ සී විශේෂාංග, තවමත් syscall අතුරු මුහුණත C-අනුකූල වේ. (මෙය C හි වර්රාග්ස් ලක්ෂණයට සමාන දෙයක් නොවේ , එමඟින් එක් ශ්‍රිතයකට විචල්‍ය තර්ක සංඛ්‍යාවක් ගැනීමට ඉඩ ලබා දේ.)

ඔබගේ පළමු ප්‍රශ්නයට පිළිතුරු සැපයීම සඳහා, තනි ගොනුවක් mkdir()නොමැත. ලිනක්ස් විවිධ ගොනු පද්ධති සඳහා සහය දක්වන අතර සෑම කෙනෙකුම "mkdir" මෙහෙයුම ක්‍රියාත්මක කරයි. තනි පද්ධති ඇමතුමකට පිටුපසින් සියල්ල සැඟවීමට කර්නලයට ඉඩ දෙන වියුක්ත ස්තරය VFS ලෙස හැඳින්වේ . ඉතින්, ඔබට බොහෝ විට කැණීම් ආරම්භ කිරීමට අවශ්‍ය වනු fs/namei.cඇත vfs_mkdir(). පහත් මට්ටමේ ගොනු පද්ධති වෙනස් කිරීමේ කේතයේ සත්‍ය ක්‍රියාත්මක කිරීම් වෙනත් තැනක තිබේ. උදාහරණයක් ලෙස, ext4 ක්‍රියාත්මක කිරීම ext4_mkdir()අර්ථ දක්වා ඇත fs/ext4/namei.c.

ඔබගේ දෙවන ප්‍රශ්නය සඳහා, ඔව් මේ සියල්ල සඳහා රටා ඇත, නමුත් එක රීතියක් නොවේ. ඔබට සැබවින්ම අවශ්‍ය වන්නේ කිසියම් විශේෂිත පද්ධති ඇමතුමක් සඳහා ඔබ සොයා බැලිය යුත්තේ කොතැනදැයි සොයා බැලීම සඳහා කර්නලය ක්‍රියා කරන ආකාරය පිළිබඳ තරමක් පුළුල් අවබෝධයකි. සියලුම පද්ධති ඇමතුම් වලට VFS සම්බන්ධ නොවේ, එබැවින් ඒවායේ කර්නල් පැත්තේ ඇමතුම් දාම සියල්ලම ආරම්භ නොවේ fs/namei.c. mmap(2), උදාහරණයක් ලෙස, ආරම්භ mm/mmap.cවන්නේ එය කර්නලයේ මතක කළමනාකරණ ("මි.මී.") උප පද්ධතියේ කොටසක් වන බැවිනි.

බොවෙට් සහ සීසැටි විසින් " ලිනක්ස් කර්නලය අවබෝධ කර ගැනීම " පිටපතක් ලබා ගැනීමට මම නිර්දේශ කරමි .


ඉතා හොඳ පිළිතුරක්. ඔබ සඳහන් කරන පොත පිළිබඳ එක් කරුණක් නම්, "ලිනක්ස් කර්නලය අවබෝධ කර ගැනීම". මට එය නැත, නමුත් මුදා හැරීමේ දිනයේ සිට (2000) සහ TOC (oreilly අඩවියේ) මට පෙනෙන්නේ එය කර්නල් 2.2 ක් පමණ වන අතර කර්නල් 2.4 කින් යම් අවබෝධයක් ලබා ගත හැකි බවයි (නමුත් මම වැරදියි). මගේ ප්‍රශ්නය: කර්නල් අභ්‍යන්තර 2.6 ක් ආවරණය වන සමාන පොතක් තිබේද? (හෝ ඊට වඩා හොඳ 2.2, 2.4 සහ 2.6 ආවරණය කරයි)?
ඩාවල්පි

2
Av ඩාවල්පි: මා දන්නා පරිදි බොවෙට් සහ සීසැටි තවමත් මෙම මාතෘකාව පිළිබඳ හොඳම තනි පොතයි. මට එය යාවත්කාලීන තොරතුරු සමඟ අතිරේකව සැපයීමට අවශ්‍ය වූ විට, මම Documentationවැඩ කරන කර්නලය සඳහා ප්‍රභව ගසෙහි උප බහලුම හාරා යන්නෙමි .
වොරන් යං

1
ඇත්ත වශයෙන්ම විවෘත (2) යනු වර්‍ග ශ්‍රිතයකි. එය ඇමතීමට ඇත්තේ ක්‍රම දෙකක් පමණි, එබැවින් මෑන්පේජ් එය මේ ආකාරයෙන් ලේඛනගත කරයි, සැබෑ ...වර්ටෝපය ඕනෑම වර්‍ගයක් ක්‍රියාත්මක වන පරිදි එහි ඇත. ඇත්ත වශයෙන්ම, මෙය libc මට්ටමින් ක්රියාත්මක වේ. තෙවන පරාමිතිය භාවිතා නොකරන විට එය 0 හෝ කසළ අගයක් ABI කර්නලය වෙත යැවිය හැකිය.
සසම්භාවී 832

"එය ඔබ තේරුම් ගත යුතු දෙයක් නොවේ". මේ ආකාරයේ වාක්‍යයක් කොටස් හුවමාරු ජාලය තුළ සොයාගත නොහැකි නම් ලෝකය වඩා හොඳ තැනක් වනු ඇත.
පීටර්

86

මෙය බොහෝ විට ඔබේ ප්‍රශ්නයට සෘජුවම පිළිතුරු සපයන්නේ නැත, නමුත් straceසරලම ෂෙල් විධාන සඳහා පවා කර ඇති යටින් පවතින පද්ධති ඇමතුම් තේරුම් ගැනීමට උත්සාහ කරන විට මම ඇත්තෙන්ම සිසිල් බව සොයාගෙන ඇත. උදා

strace -o trace.txt mkdir mynewdir

පද්ධතිය mkdir mynewdirනැරඹීම සඳහා විධාන සඳහා trace.txt වෙත දමනු ලැබේ.


5
+1 පිළිවෙලට! මම මීට පෙර එය භාවිතා කර නැත
ඩේවිඩ් ඔනිල්

3
වඩා හොඳ, ප්‍රතිදාන ගොනුව trace.strace බවට පත් කර එය VIM වලින් විවෘත කරන්න. VIM එය ඉස්මතු කරයි, එය කියවීම පහසු කරයි.
මාර්සින්

56

ලිනක්ස් කර්නල් ප්‍රභවය කියවීමට හොඳ ස්ථානයක් වන්නේ ලිනක්ස් හරස් යොමු (LXR) is ය . නොමිලේ පෙළ සෙවුම් ප්‍රති results ල වලට අමතරව සෙවුම් නැවත ටයිප් කළ ගැලපීම් (ක්‍රියාකාරී මූලාකෘති, විචල්‍ය ප්‍රකාශන ආදිය) ලබා දෙයි, එබැවින් එය හුදෙක් ග්‍රෙප් (හා වේගවත්) වලට වඩා පහසුය.

LXR විසින් පෙර සැකසුම් අර්ථ දැක්වීම් පුළුල් නොකරයි. පද්ධති ඇමතුම්වල සෑම තැනකම පෙර සැකසුම්කරු විසින් ඔවුන්ගේ නම වෙනස් කර ඇත. කෙසේ වෙතත්, බොහෝ (සියල්ල?) පද්ධති ඇමතුම් අර්ථ දැක්වෙන්නේ මැක්‍රෝගේ එක් SYSCALL_DEFINExපවුලක් සමඟ ය. mkdirතර්ක දෙකක් ගෙන ඇති හෙයින් , සෙවීමක් සිස්කල් ප්‍රකාශනයටSYSCALL_DEFINE2(mkdir තුඩු දෙයි :mkdir

SYSCALL_DEFINE2(mkdir, const char __user *, pathname, int, mode)
{
    return sys_mkdirat(AT_FDCWD, pathname, mode);
}

හරි, sys_mkdiratඑයින් අදහස් වන්නේ එය mkdiratසිස්කල් ය, එබැවින් එය මත ක්ලික් කිරීමෙන් ඔබව ප්‍රකාශයට පත් කරනු ඇත include/linux/syscalls.h, නමුත් අර්ථ දැක්වීම ඉහළින් ඇත.

මෙහි ප්‍රධාන කාර්යය mkdiratවන්නේ vfs_mkdirඇමතීමයි (VFS යනු සාමාන්‍ය ගොනු පද්ධති ස්ථරයයි). එය මත ක්ලික් කිරීමෙන් සෙවුම් ප්‍රති results ල දෙකක් පෙන්වයි: ප්‍රකාශනය include/linux/fs.hසහ ඉහත පේළි කිහිපයක් අර්ථ දැක්වීම. මෙහි ප්‍රධාන කාර්යය vfs_mkdirවන්නේ ගොනු පද්ධති විශේෂිත ක්‍රියාත්මක කිරීම ලෙස හැඳින්වීම : dir->i_op->mkdir. කෙසේ සොයා ගැනීමට මෙම ක්රියාත්මක වේ, ඔබ තනි තනි ගොනු පද්ධතිය ක්රියාත්මක කිරීම සඳහා සක්රිය කිරීමට අවශ්ය, සහ කිසිදු දෘඪ-සහ-ආශ්චර්යයේ පාලනයට තියෙනවා - පවා එය කර්නලය ගසක් පිටත මොඩියුලය විය හැක.

X LXR යනු සුචිගත කිරීමේ වැඩසටහනකි. තරමක් වෙනස් දන්නා අනුවාද කට්ටල සහ තරමක් වෙනස් වෙබ් අතුරු මුහුණත් සහිත LXR වෙත අතුරු මුහුණතක් සපයන වෙබ් අඩවි කිහිපයක් තිබේ. ඔවුන් පැමිණීමට සහ යාමට නැඹුරු වන අතර, එබැවින් ඔබ පුරුදු වී සිටි කෙනා නොමැති නම්, තවත් එකක් සොයා ගැනීමට “ලිනක්ස් හරස් යොමු” සඳහා වෙබ් සෙවුමක් කරන්න.


එය සම්පතක එක් අතකි. නියම පිළිතුර.
ස්ටේබල්ඩෝග්

Linux.no සබැඳියේ "අභ්‍යන්තර සේවාදායක දෝෂය" .
ෆෙඩ්රික් ගෝස්

RedFredrickGauss ටික කලකට lxr.linux.no එය LXR සඳහා ඇති හොඳම අතුරුමුහුණත වූ නමුත් එය නිතර අක්‍රීය විය. දැන් මම හිතන්නේ එය හොඳ අතට හැරී ඇත. මම පළමු සබැඳිය වෙනත් LXR අතුරුමුහුණතකට ආදේශ කළෙමි.
ගිලෙස්ගේ SO- නපුරු වීම නවත්වන්න '

22

පද්ධති ඇමතුම් සාමාන්‍යයෙන් SYSCALL_DEFINEx()සාර්ව ඔතා ඇත , ඒ නිසා සරල grepඒවා සොයා නොගනී:

fs/namei.c:SYSCALL_DEFINE2(mkdir, const char __user *, pathname, int, mode)

සාර්ව පුළුල් කිරීමෙන් පසු අවසාන ශ්‍රිත නාමය අවසන් වේ sys_mkdir. මෙම SYSCALL_DEFINEx()මහා පරිමාණ එක් එක් syscall නිර්වචනය අවශ්යතා ඇති බව කේතය සොයා දීම වැනි ගිනි උදුනක් දේවල් කරයි.


17

සටහන: .h ගොනුව මඟින් ශ්‍රිතය අර්ථ දක්වන්නේ නැත . එය .h ගොනුවේ ප්‍රකාශයට පත් කර ඇති අතර වෙනත් තැනක අර්ථ දක්වා ඇත (ක්‍රියාත්මක කර ඇත). ශ්‍රිතයේ අත්සන (මූලාකෘති) පිළිබඳ තොරතුරු ඇතුළත් කිරීමට මෙය සම්පාදකයාට ඉඩ දෙයි.

සාමාන්‍යයෙන් C හි .h (ශීර්ෂක) ගොනු ශ්‍රිත ප්‍රකාශ කිරීමට සහ මැක්‍රෝස් අර්ථ දැක්වීමට භාවිතා කරයි.

mkdirවිශේෂයෙන් පද්ධති ඇමතුමකි. එම පද්ධති ඇමතුම වටා GNU libc එතුමක් තිබිය හැකිය (ඇත්ත වශයෙන්ම පාහේ). mkdirකර්නල් ප්‍රභවයන් සහ විශේෂයෙන් පද්ධති ඇමතුම් සෙවීමෙන් සත්‍ය කර්නල් ක්‍රියාත්මක කිරීම සොයාගත හැකිය.

සෑම ගොනු පද්ධතියක් සඳහාම යම් ආකාරයක නාමාවලි නිර්මාණය කිරීමේ කේතයක් ක්‍රියාත්මක වන බව සලකන්න. VFS (අතථ්‍ය ගොනු පද්ධති) ස්තරය මඟින් පද්ධති ඇමතුම් ස්ථරයට ඇමතිය හැකි පොදු API එකක් සපයයි. සෑම ගොනු පද්ධතියක්ම VFS ස්තරය ඇමතීමට කාර්යයන් ලියාපදිංචි කළ යුතුය. ඩිරෙක්ටරි ව්‍යුහගත කර ඇති ආකාරය සඳහා විවිධ ගොනු පද්ධතිවලට තමන්ගේම අර්ථකථන ක්‍රියාත්මක කිරීමට මෙය ඉඩ දෙයි (නිදසුනක් ලෙස ඒවා නිශ්චිත ප්‍රවේශයන් සෙවීම වඩාත් කාර්යක්ෂම කිරීම සඳහා යම් ආකාරයක හැෂිං ක්‍රමයක් භාවිතා කර ගබඩා කර තිබේ නම්). මම මෙය සඳහන් කරන්නේ ඔබ ලිනක්ස් කර්නල් ප්‍රභව ගස සොයන්නේ නම් මෙම ගොනු පද්ධති විශේෂිත නාමාවලි නිර්මාණය කිරීමේ කාර්යයන් හරහා ගමන් කිරීමට ඉඩ ඇති බැවිනි.


8

ඔබ සොයාගත් කිසිවක් ක්‍රියාත්මක කිරීම sys / stat.h හි මූලාකෘතියට නොගැලපේ. සමහර විට මෙම ශීර්ෂ ගොනුව සමඟ ඇතුළත් කිරීමේ ප්‍රකාශයක් සෙවීම වඩා සාර්ථක වේද?


1
ක්‍රියාත්මක කිරීම (sys / stat.h හි විස්තර කර ඇති පරිදි) පරිශීලක භූමියේ සහ libc හි ව්‍යාපාරයකි. කර්නල් අභ්‍යන්තර දේවල් (එය සැබවින්ම සිදු කරන්නේ කෙසේද ) යනු කර්නල් අභ්‍යන්තර ව්‍යාපාරයයි. සියලුම කර්නල් හැකර් සත්කාර සඳහා, අභ්‍යන්තර ශ්‍රිතය xyzzy ලෙස හැඳින්විය හැකි අතර පරාමිති 5 ක් ගත හැකිය. පරිශීලක භූමි ඇමතුම ලබා ගැනීම, අවශ්‍ය ඕනෑම කර්නල් අක්ෂර වින්‍යාසයකට පරිවර්තනය කිරීම, නැව්ගත කිරීම සහ ප්‍රති .ල ලබා ගැනීම ලිබ්සීගේ කාර්යය වේ.
වොන්බ්‍රෑන්ඩ්

6

පහත් මට්ටමේ කර්නල් ප්‍රභව කේත දඩයම් කිරීම සඳහා විවිධ ශිල්පීය ක්‍රම විස්තර කරන යුවළක් ඉතා හොඳ බ්ලොග් සටහන් කිහිපයක් මෙන්න.


12
කරුණාකර බ්ලොග් හෝ සංසද වලට සබැඳි පමණක් පළ නොකරන්න, ඒවායේ අන්තර්ගතය සාරාංශ කරන්න එවිට පා readers කයන්ට ඔවුන් ගැන කුමක් දැයි දැක ගත හැකි අතර වෙබ් අඩවි අතුරුදහන් වුවහොත් යමක් ඉතිරි වේ. එසේම, ඔබගේ පළමු සබැඳිය libc ගැන වන අතර එය මෙම ප්‍රශ්නයට මාතෘකාවක් නොවේ.
ගිලෙස්ගේ SO- නපුරු වීම නවත්වන්න '
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.