当前位置:文档之家› 西电 Linux上机 Modern Operating Systems 现代操作系统 PPT课件

西电 Linux上机 Modern Operating Systems 现代操作系统 PPT课件


/* streams2 */ /* 190 */
/* * NOTE!! ...
需要修改
*/
.rept NR_syscalls - 190
.long SYMBOL_NAME(sys_ni_syscall)
系统调用实现
1. 修改 usr/src/linux/arch/i386/kernel/entry.S, 增加新的系 统调用表项:
make mrproper /* 清理旧的配置信息 */
make clean /*清理上次构建时生成的 文件*/
make menuconfig /* 进入后直接Exit并且 save*/
make dep
检查各模块的依赖关系
make bzImage 生成新内核(压缩格式),
Linux内核的构建
4. 将新内核复制到/boot下:
3. 修改 usr/include/asm/unistd.h, 增加新的系统调用编号:
#define __NR_mycall
191 /* my syscall */
4. 通过编译产生新内核,并重启操作系统。
Linux内核的构建
1. 确保是root用户
2. cd /usr/src/linux
3. 依次执行以下make语句
课设题目的测试函数
题目要求的测试函数可能形如
#include <linux/unistd.h> _syscall1(int,mycall,int,ret); //假设mycall接受一个int参数 int main(){
printf("My name is XXX,and my number is %d.\n",mycall(0)); printf("The last of my number is %d.\n",mycall(1)); return 0;}

Hardware
系统调用实现
include/asm/unistd.h中定义了所有系统调用的 编号
跳转表以系统调用编号为下标,大小由 NR_syscalls确定[include/linux/sys.h]
没有定义的跳转表项,一律指向函数 sys_ni_syscall()/*kernel/sys.c*/ {return -ENOSYS;}
如sys_fork, sys_exit.
系统调用
SYSCALL、libc、API
App

call fork()/printf()/strlen()/…


fork() printf() write() strlen() …
间 libc
内 核 空
sys_fork()
sys_write() sys_... … Kernel
2. 对于自定义的系统调用,需要经过特殊处理:
#include <linux/unistd.h> /* generate the stub for our new syscall * int sys_mycall(int a, int b) */ _syscall2 (int, mycall, int, a, int, b); //注意参数与mycall 要求的参数一致
。如学号为13091248 ,则返回8。 3. 若参数小于或等于0,则返回自己的学号后
三位。如学号为13091248,则返回248。
系统调用
系统调用
内核为用户进程提供的服务; 提供用户模式的进程和硬件设备的接口; 保护对内核所管理的资源的访问,提高系统
安全; 提高程序的可移植性; Linux系统调用在内核中全部以“sys_”开头,
修改后的代码:
.long SYMBOL_NAME(sys_ni_syscall)/* streams2 */
.long SYMBOL_NAME(sys_vfork)
Байду номын сангаас
/* 190 */
.long SYMBOL_NAME(sys_mycall) /* 191 */
/* * NOTE!! ... */
.rept NR_syscalls - 19901
操作系统课程设计
标题添加
点击此处输入相 关文本内容
标题添加
点击此处输入相 关文本内容
总体概述
点击此处输入 相关文本内容
点击此处输入 相关文本内容
实验内容2 系统调用
题目要求
为Linux内核增加一个系统调用,并编写用 户进程的程序来测试。
要求该系统调用能够完成以下功能:
1. 该系统调用有1个int型参数,返回值为int。 2. 若参数大于0,则返回自己学号的最后一位
说明
使用2.4或更高版本的内核可获得加分 参考资料:google搜索“linux增加系统
.long SYMBOL_NAME(sys_ni_syscall)
课设题目的系统调用函数
题目要求的系统调用函数可能形如
asmlinkage int sys_mycall(int num) { if(num > 0){ return 2;} else { return 13081032;}
}
系统调用实现
增加系统调用
1. 修改 usr/src/linux/arch/i386/kernel/entry.S(S必须为大写), 找Entry(sys_call_table)增加新的系统调用表项:
修改前的代码: .long SYMBOL_NAME(sys_ni_syscall) .long SYMBOL_NAME(sys_vfork)
cp arch/i386/boot/bzImage /boot/bzImage-new
注意:此处arch为相对路径,完整路径前面有/usr/src/linux
5.修改LILO配置文件 /etc/lilo.conf,在尾部添加(不能 修改原有内容)
image= /boot/bzImage-new label=linux-new root=/dev/sda5 initrd=/boot/initrd.img append=“” read-only
应与其他引导内核相同
这里与其他内核相同
应与其他引导内核相同 应与其他引导内核相同
运行:/sbin/lilo 6. 重启虚拟机:reboot,系统启动时按tab选择新的内核
系统调用实现
如何使用系统调用
1. 对于内核本身提供的系统调用,在libc中都已经提供了相 应的API,可以当做普通的库函数调用:
相关主题