1. 添加一个系统调用, 该系统调用接受两个参数:参数1:以整型数表示的自己学号的后3位;参数2:flag,取值为0或1,若为0,该系统调用的返回值为参数1的个位。若为1。该系统调用的返回值为参数1的十位。 2. 对上面的系统调用进行修改,修改如下: i. 声明一个内核全局变量gOSE, 该系统首先将参数1的值赋给gOSE,并且,对于参数2:flag,取值为0或1,若为0,将gOSE的值按位取反,后赋值给gOSE,然后返回gOSE的值;若为1,则将gOSE的值与0Xffffffff异或,后赋值给gOSE,然后返回gOSE的值; ii. 加入内核互斥锁,使得两个进程在调用该系统调用时,能够做到互斥访问gOSE。 2. 对于系统调用编程题中的strict alternation算法,给出该算法中turn变量的虚地址,并且给出该变量的物理地址。
时间: 2023-12-21 13:06:15 浏览: 63
1. 系统调用代码如下:
```c
#include <linux/kernel.h>
#include <linux/syscalls.h>
asmlinkage long sys_my_syscall(int num, int flag) {
int result;
if (flag == 0) {
result = num % 10;
} else if (flag == 1) {
result = (num / 10) % 10;
} else {
result = -1;
}
return result;
}
```
2. 修改后的系统调用代码如下:
```c
#include <linux/kernel.h>
#include <linux/syscalls.h>
#include <linux/mutex.h>
int gOSE;
DEFINE_MUTEX(my_mutex);
asmlinkage long sys_my_syscall(int num, int flag) {
mutex_lock(&my_mutex);
gOSE = num;
if (flag == 0) {
gOSE = ~gOSE;
} else if (flag == 1) {
gOSE = gOSE ^ 0xffffffff;
} else {
mutex_unlock(&my_mutex);
return -1;
}
mutex_unlock(&my_mutex);
return gOSE;
}
```
3. 对于strict alternation算法中的turn变量,由于该变量是在用户空间定义的,所以它的虚地址与物理地址都不在内核空间中,无法直接获取。需要通过一些特殊的技术手段,比如内存映射,才能够访问该变量的虚地址和物理地址。
阅读全文