作者:别扭小孩
实验内容
此次实验的基本内容是:在Linux 0.11上添加两个系统调用,并编写两个简单的应用程序测试该系统调用。实验过程分两步。
第一步是在Linux 0.11上增加一个系统调用whoami(),原型如下:
int whoami(void);
该系统调用的功能是将用户的名字(例如:Li Zhijun)打印到屏幕上。用户的名字字符串写在内核源代码中。然后在Linux 0.11下编写一个测试程序whoami,它调用whoami()获得自己的名字,并在标准输出设备(通常就是屏幕上)打印字符串“I am XXX.”。返回值是任意非负数。
第二步在Linux 0.11上再添加一个系统调用iam(),其接口是:
int iam(const char * name);
完成的功能是将用户程序中传入的字符串参数name的内容拷贝到核心态数据段中。要求name的长度不能超过20个字符。可以假设在核心态数据段中有一个全局变量:char myname[21],iam将用户态数据name拷贝到核心态数据myname中。返回值是拷贝的字符数。如果name的字符个数超出了myname的存储能力,则返回“-EINVAL”。
然后修改的上面的whoami(),新的原型为:
int whoami(char* name, unsigned int size);
它不再向屏幕输出任何内容,而是拷贝myname到name中,同时确保不会对name越界访存(name的大小由size说明)。返回值是拷贝的字符数。如果size小于需要的空间,则返回“-EINVAL”。
然后再实现一个测试程序iam。最终要求的结果是:
$ iam lizhijun
$ whoami
I am lizhijun