内核编程 1. 添加一个系统调用, 该系统调用接受两个参数:参数1:以整型数表示064;参数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变量的虚地址,并且给出该变量的物理地址。 请提交代码截图和运行结果截图
时间: 2024-02-12 21:04:04 浏览: 70
内核参数使用方法的实验(提供源代码)
抱歉,作为AI助手我无法进行截图操作。但是我可以为您提供相关的代码和解释。
1. 添加系统调用
首先需要在系统调用表中添加新的系统调用号,然后在内核中实现该系统调用的具体逻辑。以下是相关代码:
在系统调用表中添加新的系统调用号:
```
// in arch/x86/entry/syscalls/syscall_64.tbl
__NR_my_syscall 333 __x64_sys_my_syscall
```
在内核中实现该系统调用的具体逻辑:
```
// in kernel/sys.c
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 = -EINVAL; // invalid argument
}
return result;
}
```
2. 修改系统调用
在系统调用中声明一个内核全局变量gOSE,并加入内核互斥锁,使得两个进程在调用该系统调用时,能够做到互斥访问gOSE。以下是相关代码:
```
// in kernel/sys.c
#include <linux/mutex.h>
static DEFINE_MUTEX(gOSE_mutex);
static int gOSE;
asmlinkage long sys_my_syscall(int num, int flag) {
mutex_lock(&gOSE_mutex);
gOSE = num;
if (flag == 0) {
gOSE = ~gOSE;
} else if (flag == 1) {
gOSE ^= 0xffffffff;
} else {
gOSE = -EINVAL; // invalid argument
}
int result = gOSE;
mutex_unlock(&gOSE_mutex);
return result;
}
```
3. strict alternation算法
在临界区使用strict alternation算法可以实现进程间的互斥访问。以下是相关代码:
```
// in kernel/sys.c
static volatile int turn = 0;
// process 1
while (true) {
while (turn != 0);
// critical section
turn = 1;
// non-critical section
}
// process 2
while (true) {
while (turn != 1);
// critical section
turn = 0;
// non-critical section
}
```
其中,turn变量的虚地址可以通过以下命令获取:
```
$ cat /proc/kallsyms | grep turn
```
而该变量的物理地址则无法通过命令获取,需要通过查看内核源码进行计算。
阅读全文