Linux内核实验报告实验5Word文件下载.docx
- 文档编号:18579517
- 上传时间:2022-12-28
- 格式:DOCX
- 页数:80
- 大小:83.61KB
Linux内核实验报告实验5Word文件下载.docx
《Linux内核实验报告实验5Word文件下载.docx》由会员分享,可在线阅读,更多相关《Linux内核实验报告实验5Word文件下载.docx(80页珍藏版)》请在冰豆网上搜索。
无
结论分析与体会:
在本次实验中我们完整设计了两个系统调用,实现系统调用主要有三个过程:
1.在syscall_table_32.S这个汇编文件中添加系统调用的入口项
2.在unistd_32.h中添加系统调用号,以便用户程序调用
3.在内核中的某个地方实现系统调用
另外关于asmlinkage这个标记:
“"
asmlinkage"
isdefined,forexample,intheheaderfile
"
include/asm-i386/linkage.h"
as
__attribute__((regparm(0)))
thattellscompilerputallfunctionparametersinthestack(i.e.
disablescalloptimization).”
也就是说它告诉编译器把所有的参数都放在堆栈中,而不是寄存器,这样内嵌汇编代码的时候有好处?
程序完整源代码:
kernel/sys.c
/*
*linux/kernel/sys.c
*
*Copyright(C)1991,1992LinusTorvalds
*/
#include<
linux/module.h>
linux/mm.h>
linux/utsname.h>
linux/mman.h>
linux/notifier.h>
linux/reboot.h>
linux/prctl.h>
linux/highuid.h>
linux/fs.h>
linux/perf_event.h>
linux/resource.h>
linux/kernel.h>
linux/kexec.h>
linux/workqueue.h>
linux/capability.h>
linux/device.h>
linux/key.h>
linux/times.h>
linux/posix-timers.h>
linux/security.h>
linux/dcookies.h>
linux/suspend.h>
linux/tty.h>
linux/signal.h>
linux/cn_proc.h>
linux/getcpu.h>
linux/task_io_accounting_ops.h>
linux/seccomp.h>
linux/cpu.h>
linux/personality.h>
linux/ptrace.h>
linux/fs_struct.h>
linux/gfp.h>
linux/compat.h>
linux/syscalls.h>
linux/kprobes.h>
linux/user_namespace.h>
asm/uaccess.h>
asm/io.h>
asm/unistd.h>
#ifndefSET_UNALIGN_CTL
#defineSET_UNALIGN_CTL(a,b)(-EINVAL)
#endif
#ifndefGET_UNALIGN_CTL
#defineGET_UNALIGN_CTL(a,b)(-EINVAL)
#ifndefSET_FPEMU_CTL
#defineSET_FPEMU_CTL(a,b)(-EINVAL)
#ifndefGET_FPEMU_CTL
#defineGET_FPEMU_CTL(a,b)(-EINVAL)
#ifndefSET_FPEXC_CTL
#defineSET_FPEXC_CTL(a,b)(-EINVAL)
#ifndefGET_FPEXC_CTL
#defineGET_FPEXC_CTL(a,b)(-EINVAL)
#ifndefGET_ENDIAN
#defineGET_ENDIAN(a,b)(-EINVAL)
#ifndefSET_ENDIAN
#defineSET_ENDIAN(a,b)(-EINVAL)
#ifndefGET_TSC_CTL
#defineGET_TSC_CTL(a)(-EINVAL)
#ifndefSET_TSC_CTL
#defineSET_TSC_CTL(a)(-EINVAL)
*thisiswherethesystem-wideoverflowUIDandGIDaredefined,for
*architecturesthatnowhave32-bitUID/GIDbutdidn'
tinthepast
intoverflowuid=DEFAULT_OVERFLOWUID;
intoverflowgid=DEFAULT_OVERFLOWGID;
#ifdefCONFIG_UID16
EXPORT_SYMBOL(overflowuid);
EXPORT_SYMBOL(overflowgid);
*thesameasabove,butforfilesystemswhichcanonlystorea16-bit
*UIDandGID.assuch,thisisneededonallarchitectures
intfs_overflowuid=DEFAULT_FS_OVERFLOWUID;
intfs_overflowgid=DEFAULT_FS_OVERFLOWUID;
EXPORT_SYMBOL(fs_overflowuid);
EXPORT_SYMBOL(fs_overflowgid);
*thisindicateswhetheryoucanrebootwithctrl-alt-del:
thedefaultisyes
intC_A_D=1;
structpid*cad_pid;
EXPORT_SYMBOL(cad_pid);
*Ifset,thisisusedforpreparingthesystemtopoweroff.
void(*pm_power_off_prepare)(void);
*setthepriorityofatask
*-thecallermustholdtheRCUreadlock
staticintset_one_prio(structtask_struct*p,intniceval,interror)
{
conststructcred*cred=current_cred(),*pcred=__task_cred(p);
intno_nice;
if(pcred->
uid!
=cred->
euid&
&
pcred->
euid!
!
capable(CAP_SYS_NICE)){
error=-EPERM;
gotoout;
}
if(niceval<
task_nice(p)&
can_nice(p,niceval)){
error=-EACCES;
no_nice=security_task_setnice(p,niceval);
if(no_nice){
error=no_nice;
if(error==-ESRCH)
error=0;
set_user_nice(p,niceval);
out:
returnerror;
}
SYSCALL_DEFINE3(setpriority,int,which,int,who,int,niceval)
structtask_struct*g,*p;
structuser_struct*user;
conststructcred*cred=current_cred();
interror=-EINVAL;
structpid*pgrp;
if(which>
PRIO_USER||which<
PRIO_PROCESS)
/*normalize:
avoidsigneddivision(roundingproblems)*/
error=-ESRCH;
-20)
niceval=-20;
if(niceval>
19)
niceval=19;
rcu_read_lock();
read_lock(&
tasklist_lock);
switch(which){
casePRIO_PROCESS:
if(who)
p=find_task_by_vpid(who);
else
p=current;
if(p)
error=set_one_prio(p,niceval,error);
break;
casePRIO_PGRP:
pgrp=find_vpid(who);
pgrp=task_pgrp(current);
do_each_pid_thread(pgrp,PIDTYPE_PGID,p){
}while_each_pid_thread(pgrp,PIDTYPE_PGID,p);
casePRIO_USER:
user=(structuser_struct*)cred->
user;
if(!
who)
who=cred->
uid;
elseif((who!
uid)&
!
(user=find_user(who)))
gotoout_unlock;
/*Noprocessesforthisuser*/
do_each_thread(g,p){
if(__task_cred(p)->
uid==who)
error=set_one_prio(p,niceval,error);
}while_each_thread(g,p);
if(who!
uid)
free_uid(user);
/*Forfind_user()*/
out_unlock:
read_unlock(&
rcu_read_unlock();
*Ugh.Toavoidnegativereturnvalues,"
getpriority()"
will
*notreturnthenormalnice-value,butanegatedvaluethat
*hasbeenoffsetby20(ieitreturns40..1insteadof-20..19)
*tostaycompatible.
SYSCALL_DEFINE2(getpriority,int,which,int,who)
longniceval,retval=-ESRCH;
return-EINVAL;
if(p){
niceval=20-task_nice(p);
if(niceval>
retval)
retval=niceval;
}
uid==who){
niceval=20-task_nice(p);
if(niceval>
retval=niceval;
}
/*forfind_user()*/
returnretval;
/**
*emergency_restart-rebootthesystem
*Withoutshuttingdownanyhardwareortakinganylocks
*rebootthesystem.Thisiscalledwhenweknowwearein
*troublesothisisourbestefforttoreboot.Thisis
*safetocallininterruptcontext.
voidemergency_restart(void)
machine_emergency_restart();
EXPORT_SYMBOL_GPL(emergency_restart);
voidkernel_restart_prepare(char*cmd)
blocking_notifier_call_chain(&
reboot_notifier_list,SYS_RESTART,cmd);
system_state=SYSTEM_RESTART;
device_shutdown();
sysdev_shutdown();
*kernel_restart-rebootthesystem
*@cmd:
pointertobuffercontainingcommandtoexecuteforrestart
*or%NULL
*Shutdowneverythingandperformacleanreboot.
*Thisisnotsafetocallininterruptcontext.
voidkernel_restart(char*cmd)
kernel_restart_prepare(cmd);
if(!
cmd)
printk(KERN_EMERG"
Restartingsystem.\n"
);
else
Restartingsystemwithcommand'
%s'
.\n"
cmd);
machine_restart(cmd);
EXPORT_SYMBOL_GPL(kernel_restart);
staticvoidkernel_shutdown_prepare(enumsystem_statesstate)
reboot_notifier_list,
(state==SYSTEM_HALT)?
SYS_HALT:
SYS_POWER_OFF,NULL);
system_state=state;
*kernel_halt-haltthesystem
*Shutdowneverythingandperformacleansystemhalt.
voidkernel_halt(void)
kernel_shutdown_prepare(SYSTEM_HALT);
printk(KERN_EMERG"
Systemhalted.\n"
machine_halt();
EXPORT_SYMBOL_GPL(kernel_halt);
*kernel_power_off-power_offthesystem
*Shutdowneverythingandperformacleansystempower_off.
voidkernel_power_off(void)
kernel_shutdown_prepare(SYSTEM_POWER_OFF);
if(pm_power_off_prepare)
pm_power_off_prepare();
disable_nonboot_cpus();
Powerdown.\n"
machine_power_off();
EXPORT_SYMBOL_GPL(kernel_power_off);
staticDEFINE_MUTEX(reboot_mutex);
*Rebootsystemcall:
forobviousreasonsonlyrootmaycallit,
*andevenrootneedstosetupsomemagicnumbersintheregisters
*sothatsomemistakewon'
tmakethisrebootthewholemachine.
*Youcanalsosetthemeaningofthectrl-alt-del-keyhere.
*rebootdoesn'
tsync:
dothatyourselfbeforecallingthis.
SYSCALL_DEFINE4(reboot,int,magic1,int
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 内核 实验 报告