පද්ධති ඇමතුම් සාමාන්ය ක්රියාකාරී ඇමතුම් මෙන් හසුරුවනු නොලැබේ. පරිශීලක අවකාශයේ සිට කර්නල් අවකාශයට මාරුවීම සඳහා විශේෂ කේතයක් අවශ්ය වේ, මූලික වශයෙන් ඇමතුම් අඩවියේ ඔබේ වැඩසටහනට ඉන්ලයින් එකලස් කිරීමේ කේතයක් එන්නත් කරනු ලැබේ. පද්ධති ඇමතුම "අල්ලා ගන්නා" කර්නල් පැති කේතය ද ඔබට අවම වශයෙන් මුලදී ගැඹුරින් තේරුම් ගැනීමට අවශ්ය නොවන පහත් මට්ටමේ දේවල් වේ.
දී 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
වන්නේ එය කර්නලයේ මතක කළමනාකරණ ("මි.මී.") උප පද්ධතියේ කොටසක් වන බැවිනි.
බොවෙට් සහ සීසැටි විසින් " ලිනක්ස් කර්නලය අවබෝධ කර ගැනීම " පිටපතක් ලබා ගැනීමට මම නිර්දේශ කරමි .