操作系统实验之系统调用

1。今天整理了一下实验报告

 在unistd.h中可以看到现在Linux 0.11 支持3个参数的传递。添加参数的方法大概有3条
           1.可以采用ESI,EDI,EBP,ESP这几个寄存器传递参数。
           2.可以采用《Linux 0.11注释》中提到的系统调用门的办法。
           3.可以开辟一块用户态的空间,允许内核态访问,传递参数时,只需传递此空间的首地址指针即可。

2。具体实现思路如下:

1)在include/unistd.h中添加系统调用的功能号
这里写图片描述
2)并且相应的在include/linux/sys.h中声明新的系统调用处理函数以及添加系统调用处理程序指针数组表中该项的索引值
这里写图片描述
3)修改system_call.s中系统调用总数。
这里写图片描述
4)在内核中编写系统调用处理函数,放在kernel下面(who.c)。

#define  __LIBRARY__
#include <unistd.h>
#include <errno.h>
#include <asm/segment.h>

//实现将用户空间的字符串拷贝到内核空间中
//建立变量存储
char tmp[64]={0}  
int sys_iam(const char * name)
{
   int i = 0;
   //字符串长度不能超过32,放回拷贝的字符串的个数,
   //如果超过32,返回-1,同时将errno置为EINVAL
   while(get_fs_byte(name+i) != '\0')
    {
       i++;
    }
   if(i > 23)
    {
       return -EINVAL;
    }
    i = 0;
    //包括字符串结束符
    while((tmp[i] = get_fs_byte(name+i))!= '\0')
    {
        i++;
    }
    return i;  //返回实际拷贝的字符串个数
}

//获取sys_iam在内核中存储的字符串
//长度不能超过32
int sys_whoami(char * name,unsigned int size)
{
   int i =0;
   while(tmp[i++] != '\0');
   if(size < i)
    {
        //name的空间小于字符串的长度,返回-1
        return -1;
    }
   i = 0;
   //拷贝到用户空间
   while(tmp[i] != '\0')
    {
       put_fs_byte(temp[i],(name + i));
       i++;
    }
    return i;
}

4)在make file中添加新系统调用所在文件的编译、链接规则(依赖关系)。
这里写图片描述
这里写图片描述
5)在应用程序中提供接口,调用系统调用。
① ami:

#define __LIBRARY__
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <stdio.h>
_syscall1(int,iam,const char*,name)

int main(int argc,char* argv[])
{

    if(argc>1){
    if(iam(argv[1])<0){
        printf("SystemCall Exception!\n");
        return -1;
    }
    }
    else{
    printf("Input Exception!\n");
    return -1;
    }       
    return 0;
}

② whoami:

#define __LIBRARY__  //一定要加,不然的话_syscall2不能识别
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <stdio.h>
//系统调用
_syscall2(int,whoami,char*,name,unsigned int,size)

int main()
{
    int counter;
    char buff[128]={0};

    counter=whoami(buff,128);
    if(counter < 0)
    {
       printf("SystemCall Exception!");
       return -1;
        }
    else{
        printf("%s\n",buff);
        }
    return 0;
}

2。实现结果
这里写图片描述

3。实验过程中出现的问题总结:

1)关于linux0.11和ubuntu之间文件共享的问题
按照实验手册上面所示,不能显示,我的解决:
先挂载,加需要添加的文件或者新建文件到 /hdc/usr/root/目录下面就行了,修改完成之后,卸载,运行linux0.11,在linux0.11中/home/root/目录下面ls就能显示出来
2)提示_NR_ami 没有找到问题
我们在前面所示,我们需要虚拟机中的unistd.h才行,具体的路径是:
/hdc/usr/include/unistd.h 就可以了

【实验目的】 1. 了解文件系统的原理; 2. 用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。 【实验准备】 1.文件的逻辑结构  顺序文件  索引文件  索引顺序文件  直接文件和哈希文件 2.外存分配方式  连续分配  链接分配  索引分配 【实验内容】 1. 实验要求 要求设计一个 n个用户的文件系统,每次用户可保存m个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。 2. 实验题目  设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。  程序采用二级文件目录(即设置主目录[MFD])和用户文件目录(UED)。另外,为打开文件设置了运行文件目录(AFD)。  为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作。 因系统小,文件目录的检索使用了简单的线性搜索。文件保护简单使用了三位保护码:允许读写执行、对应位为 1,对应位为0,则表示不允许读写、执行。程序中使用的主要设计结构如下:主文件目录和用户文件目录( MFD、UFD)打开文件目录( AFD)(即运行文件目录)。 M D F 用户名 文件目录指针 用户名 文件目录指针 U F D 文件名 保护码 文件长度 文件名 A F D 打开文件名 打开保护码 读写指针
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值