(2)在linux-/kernel/Makefile中参加:obj-y
+=
mysyscall.o
(3)在linux-/include/linux/syscalls.h中参加:asmlinkage
sys_mysyscall(void);
(4)在linux-/arch/x86/kernel/syscall_table_32.S〔如果是64位机器那么32替换为64〕中参加:.long
sys_mysyscall
在linux-/arch/x86/ia32/ia32entry.S中参加:.quad
(5)在linux-/arch/x86/include/asm/unistd_32.h中参加:#define
__NR_mysyscall
349
并将#define
NR_syscalls
替换为#define
350
〔这里根据实际情况,__NR_mysyscall为现有最大值,NR_syscalls加一即可〕(6)重新编译、安装、重启(7)测试查看/proc/kallsyms中是否有mysyscall,如果有,表示符号已经导出。编译运行,输出0即为正确,-1为错误。
instindstini(stmp(ommond,mksom)//构建根本文件结构{hvtue;out
}i(strmpommond,"t)//显示文件内容(当前目录下指定数{hvtue;hrilnm[14];inilnmtilnm}i(stcmpommond,hmod)//改变文件权限{hvtue;hrnme[14innmhmodnm}i(stcmpommond,hown")//改变文件拥有者如拥有者在另一个组,那么组也要改掉){hvtue;hrnme[14innmhownnme}i(stmp(ommond,hp)//改变文件所属组){hvtue;hrnme[14innmhgpnm}i(stmp(ommond,hnm)//改变文件名{hvtue;hrnme[14innmhnmnme}//////////////////////////////////////////////////////////////////*对当前目录的操作*/i(stcmpommond,pwd)//显示当前目录{hvtue;out<"您的当前目录为: hvtuout<系统已重置i(stmp(ommond,xit)//退出{hvtue;tun;}i(hvelse//都不被接受{outommond<<"isnotalglommnd!!}}}///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////**/voidpintodvoid//根据结点路径,输出路径{out out tuna/////////////////////////////////////////////////////////////////////4.hso.h/////////////////////////////////////////////////////////////////////boolhvwpowe(NODEinod//判断当前用户对指定的结点有无写权限{i(stmp(us,inod.own)//是文件拥有者{}lse{ iinode.mod[2]wtuntutunflsi(stcmpgoup,inod.own)//是组内{iinod.mod[5]w')tuntutunls}ls//其他用户{iinod.mod[8]w')tuntutunls}}}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////voidhmodhr*nm)//改变文件权限{NODEinod,inod2;dinodeod[num1],inod;//当前点写入结点对象inti,indx;//i为录项下标indx2为目项中结点号i(hvsmnam,inod,i,indx2)){dinodindx2,inod2i(hvewpowinod2)){hrmod[3];out<1表示拥有者4表示组内7表示其他用户a表示模式b表示x模式c表示x模式nout<请输入修改方案例如4:inmodi(mod[0]1'||mod[0]4'||mod[0]7'){//intmod[0]49;强制类型转换是转成其ASCI码i(mod[1]a'){inod2.mod[intmod[0]48]-inod2.mod[intmod[0]148]wwritinodinod2,indx2out<修改完毕}lse{ i(mod[1]b'){inod2.mod[intmod[0]48]rinod2.mod[intmod[0]148]writinodinod2,indx2;out<修改完毕}lse{ i(mod[1]'c'){inod2.mod[intmod[0]48]rinod2.mod[intmod[0]148]wwritinodinod2,indx2out<修改完毕otond; }}lse{ }lse{}} out<"输入不合法;}}lse{ out<输入不合法!;otond;}}lse{ out<你无权修改该子目录或文件;otoend;out<不存在该子目录或文件;otond;}//修改当前i点和子结点hrtmpbu[9];_sttimtmpbustp(inod.tim,tmpbustp(inod2.tim,tmpbuwritinodinod,od[num1]writinodinod2,indx2nd:tun;}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////voidhownhar*nme)//改变文件拥有者如拥有者在另一个组,那么组也要改掉){NODEinod,inod2;dinodeod[num1],inod;//当前结点写结点对象inti,indx;//i为目项下标indx2为目录中结点号i(hvwpowrinod)){i(hvsmnam,inod,i,indx2)){dinodeindx2,inod2i(hvwpowinod2)){hrown2[6];hrus2[6];hrroup2[6out<请输入改后的文件所有者:inown2;boolisls;//判断输入的也是合法用户名us.opn(use.txt,ios:ino(intn0;nusnum;n+//用户名18*n0~18*n5密码18*n6~18*n1用户组18*n12~18*n17{us.sek18*nus>us2;i(stmpown2,use2)){istuus.sek18*n12us>goup2;bk;}}us.losi(is){ stpinod2.own,own2stpinod2.oup,goup2writinodinod2,index2out<修改成功//修改当前i结点和结点hrtmpbu[9];_sttimtmpbustp(inod.tim,tmpbustp(inod2.tim,tmpbuwritinodinod,od[num1]writinodinod2,indx2}lse{ }lse{} out<不存在该用户,修改失败out<"你没有权限}}}lse{ lse{} out<不存在该子目录或文件out<你没有权限}}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////voidhrphr*nme)//改变文件所属组{NODEinod,inod2;dinodeod[num1],inod;//当前结点写结点对象inti,indx;//i为目项下标indx2为目录中结点号i(hvwpowrinod)){i(hvsmnam,inod,i,indx2)){dinodeindx2,inod2i(hvwpowinod2)){hrroup2[6hragoup2[6];out<请输入改后的文件所所属组:in>roup2;boolisls;//判断输入的也是合法用户名us.opn(use.txt,ios:ino(intn0;nusnum;n+//用户名18*n0~18*n5密码18*n6~18*n1用户组18*n12~18*n17{us.sek18*n12us>aoup2;i(stmp(goup2,goup2)){}us.losi(is) istubk;}{stpinod2.oup,goup2writinodinod2,index2out<修改成功//修改当前i结点和结点hrtmpbu[9];_sttimtmpbustp(inod.tim,tmpbustp(inod2.tim,tmpbuwritinodinod,od[num1]writinodinod2,indx2}lse out<不存在该组,修改失败{out<"你没有权限}}}lse{ out<不存在该子目录或文件out<你没有权限}}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////voidhnmhar*nme)//改变文件名{NODEinod,inod2;dinodeod[num1],inod;//当前结点写结点对象inti,indx;//i为目项下标indx2为目录中结点号i(hvwpowrinod)){i(hvsmnam,inod,i,indx2)){dinodeindx2,inod2i(hvwpowinod2)){hrnam2[14];out<请输入更改后的文件名:innm2;disk.opn(disk.txt,ios::in|ios::out|ios::notedisk.skp(514*inod.dd[0]36*idiskstw(15)nme2;disk.los//如果是目录文件,其下的所有目录项都要改pnam[14]iinode2.mod[0]d{disk.opndisk.txt,ios::in|ios::out|ios::noteointi0;iinod2.siz/36;i//遍历所有的目录{disk.skg514*inod2.dd[0]36*i18diskstw(15)nm2;}disk.los}out<更改成功//修改当前i结点和子结点hrtmpbu[9];_sttimtmpbustp(inod.tim,tmpbustp(inod2.ctim,tmpbuwritinod(inod,od[num1]writinod(inod2,indx2}lse{}} out<"你没有权限}lse{ out<不存在该子目录或文件out<你没有权限}}/////////////////////////////////////////////////////////////////////5.di.h//////////////////////////////////////////////////////////////////////**///当前目录unm〔肯定是目录文件〕当前i结点od[num1]voidmkdihr*dinam//创立目录规定目录文件只占一个盘块)当前目录下创建{NODEinod,inod2;dinode(od[num1],inode;//把当前i结点od[num1]内读入inodei(hvwpowr(inod)//判断权限{i512inod.siz36//是否目录项已到达最多14个{}lse{ out<当前目录已满,创立子目录失败inti,indxi(hvsmdinm,inod,i,indx2)//有无重名存在着{out<该目录已存在,创立失败}ls//可以创立目录{intiidillo;//申请结点i(iid1){intbibllo;//申请盘块ibid!1){//当前目录盘块的修改disk.opndisk.txt,ios::in|ios::out|ios::nortedisk.skp(514*inod.dd[0]inod.sizediskstw(15)dinm;//写目录名diskstw(3)iid;//写结点diskstw(15) //当前目录i结点的修改inod.siz36;_sttimtmpbustpinod.tim,tmpbu//新创目录i结点的初始化/**/inod2.siz0;//intsiz文件大小inod2.bnum1;//intbnum;件盘块数inod2.dd[0]bid;//itdd[];四个直接盘块号0~512*42048)没有指向 ointa1;a4;a+//指向0#表示inod2.dd[]0;inod2.dd10;//intdd1;一个一次间址inod2.dd20;//intdd2;一个两次间址 stp(inod2.own,usr;stp(inod2.oup,aoup;stp(inod2.mod,drwxxx";//hrmod[1];文件类别及存储权限默认最高) _sttimtmpbustp(inod2.tim,tmpbuf;//hrtim[9];writinod(inod2,iid /*disk.opndisk.txt,ios::in|ios::out|ios::nortedisk.skp51464*iid2*iid/8diskstw(6)0;//intsiz;文件大小diskstw(6)<1;//intbnum;文盘块数diskstw(3) disk.los;*/out<目录已成功创立}lse{} iiid;//刚申请的结点释放掉out"盘块已用完,创立子目录失败”;}lse}}lse{ {out<结点已用完创立子目录失败}}out<你没权限创立}writinod(inod,od[num1];//把inoe写入指定结点}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////boolhvsm(hr*dirnm,NODEinod,inti,intindx2//判断对象inode指向的目录文件盘块中有无该名的目录项存在着,有返回1无返回0{//有该目录项那么按引用调用的i为待删子目录目录项下标indx2目录项中的待删子目录的结点号boolhvflshrnm[14];disk.opndisk.txt,ios:in|ios::out|ios::noteoi0;iinod.siz/36;i//遍历所有的目录项{disk.skg514*inod.add[0]36*idisknami(stmpdinm,nam)){}disk.lostunhv} hvtudiskindx2;bk;}/////////////////////////////////////////////////////////////////////intt0;//记录递归重数入口加1出口减1/////////////////////////////////////////////////////////////////////voidmdihr*dinam,intindx//删除目录当前目录下删除参数为子目录名,当前结点){tNODEinod,inod2;DRdidinodeindx,inod;//当前结点写入结点对象i(hvwpowrinod)//判断权限{inti,indx;//i待删子目录目录项下标indx2为目录项中的删子目录的结点号i(hvsmdinam,inod,i,indx2)//存在该子目录名{dinodeindx2,inod2;//待删子目录的结点写入结点对象i(hvwpowinod2)//判断权限{i(inod2.mod[0]d'//判断要删除的是目录文件而非数据文件{i(inod2.siz0//判断待删子目录有无子目录有{hres=''; //out该目录非空,不能删除it1){out<"该目录非空,如果删除的话,将失去目录下所有文件,要继续(/n)in>s;}i((s=='')||(es=Y')){递归将其删除 hrnm[14]; //遍历待删子目录inod2)所有子目录,intinx3;NODEinod3;ointi0;iinod2.siz/36;i//遍历所有的目录项{disk.opndisk.txt,ios::in|ios::out|ios::noctedisk.skginod2.dd[0]*51436*idisknamdisk.los diskindx3;dinodeindx3,inod3iinod3.mod[0]d//是目录文件{mdinm,indx2}ls//是数据文件{mnm}}mdidinm,indx;//子目录空了再删除自己}lse{out<目录删除失败}}ls/