一 题目介绍
Linux是开源操作系统。在系统中根据需要添加新的系统调用是修改内核的一种常用手段,通过本次实验,我们可以理解Linux系统处理系统调用的流程以及增加系统调用的方法。Linux系统提供了多达几百种的系统调用,为了唯一地标识每一个系统调用,Linux为每个系统调用都设置了一个唯一的编号,称为系统调用号;同时每个系统调用需要一个服务例程完成其具体功能。
每个系统调用都对应一个内核服务例程来实现该系统调用的具体功能,其命名格式都是以”sys_”开头。服务例程的原型声明则是在./include/linux/syscall.h中,通常都有固定的格式。
与普通函数一样,系统调用通常也需要输入/输出参数。当系统调用执行成功时,将返回服务例程的返回值,通常是0。但如果执行失败,为防止与正常的返回值混淆,系统调用并不直接返回错误码,而是将错误码放入一个名为errno的全局变量中,通常是一个负值,通过调用perror()库函数,可以把errno翻译成用户可以理解的错误信息描述。
系统调用必须仔细检查用户传入的参数是否合法有效。最重要的是要检查用户提供的指针是否有效,以防止用户进程非法访问数据。
题目内容:添加一个系统调用,实现对指定进程的nice值得修改或读取功能,并返回进程最新的nice值及优先级prio。
考察的知识点:在系统中根据需要添加新的系统调用。
问题的关键点:添加的系统调用实现对指定进程的nice值得修改或读取功能。
二 实验思路
添加系统调用的主要步骤为:
- 修改系统调用表
- 声明系统调用服务例程原型
- 实现系统调用服务例程
调用原型:int mysetnice(pid_t pid,int flag,int nicevalue,void _user*prio,void _user*nice);
pid:进程ID
flag:若值为0,则表示读取nice值;若值为1,则表示修改nice值。
nicevalue:为指定进程设置的新nice值。
prio、nice:指向进程当前优先级及nice值。
返回值:系统调用成功时返回0;失败时返回错误码EFAULT。
三 遇到问题及解决方法
1.提示权限不够
解决:命令行以su开头,或者首先输入sudo -s进入root模式。
2. 1 http://cn.archive.ubuntu.com/ubuntu bionic/main amd64 make amd64 4.1-9.1ubuntu1
无法解析域名“cn.archive.ubuntu.com”
E: 无法下载 http://cn.archive.ubuntu.com/ubuntu/pool/main/m/make-dfsg/make_4.1-9.1ubuntu1_amd64.deb 无法解析域名“cn.archive.ubuntu.com”
E: 有几个软件包无法下载,要不运行 apt-get update 或者加上 --fix-missing 的选项再试试?
解决:执行 apt-get update
- E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用)
E: 无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它?
解决:ps -e | grep apt
738 ? 00:00:00 apt.systemd.dai
808 ? 00:00:00 apt.systemd.dai
1610 ? 00:00:00 apt.systemd.dai
root@eowyn-virtual-machine:~/linux-5.0.5# sudo kill 738
root@eowyn-virtual-machine:~/linux-5.0.5# sudo kill 808
root@eowyn-virtual-machine:~/linux-5.0.5# sudo kill 1610
- dpkg: 错误: 正在解析文件 '/var/lib/dpkg/updates/0004' 第 0 行附近:
在字段名 #padding 中有换行符
解决: sudo rm /var/lib/dpkg/updates/*
sudo apt-get update
- /boot/config-4.18.0-15-generic:5814:warning: symbol value 'm' invalid for HSA_AMD