添加系統調用

添加兩個系統調用
int iam(const char * name); 將name寫入內核
int whoami(char* name, unsigned int size); 從內核中讀出name

修改內核

先在include/unistd.h 中添加系統調用編號,
#define __NR_whoami 72
#define __NR_iam 73
由於這是內核態定義,爲了用戶態也能生效,需要修改用戶態的頭文件。方法是先mount hdc,在hdc下面找到/user/include/unistd.h
在該文件中添加這兩個定義。
接下來繼續回到linux 代碼。在kernel/system_call.s中修改系統調用數目
nr_system_calls = 72
修改成74
接下來修改系統調用表,在include/linux/sys.h中,仿照添加定義,並添加到數組中。
extern int sys_whoami();
extern int sys_iam();
接下來就該實現sys_iam 和sys_whoami。
在kernel中添加who.c

#include <string.h>
#include <errno.h>
#include <asm/segment.h>

char msg[24] = {0};
int sys_iam(const char *name)
{
	int i;
	char tmp[30];
	for (i = 0; i<30; ++i)
	{
		tmp[i] = get_fs_byte(name +i);
		if(tmp[i] == '\0')
		{
			break;
		}
	}
        if (i > 23)
	{
		return -EINVAL;
	}
	strcpy(msg, tmp);
	return i;
}

int sys_whoami(char *name, unsigned int size)
{
	int len = 0;
	for(;msg[len]!='\0';len++);
	if (len > size)
	{
		return -EINVAL;
	}
	int i = 0;
	for (i =0; i <= len; i++)
	{
		put_fs_byte(msg[i],name +i);
	}
	return len;
} 

修改makefile,編譯即可。

用戶態修改

編寫用戶態程序調用該系統調用

shiyanlou@ce6c6b325aeb:~/oslab/oslab/hdc$ cat iam.c
#include <errno.h>
#define __LIBRARY__
#include <unistd.h>
#include <stdio.h>

_syscall1(int, iam, const char*, name);

int main(int argc, char ** argv)
{
  iam(argv[1]);
  return 0;
}
shiyanlou@ce6c6b325aeb:~/oslab/oslab/hdc$ cat whoami.c 
#include <errno.h>
#define __LIBRARY__
#include <unistd.h>
_syscall2(int, whoami, char *,name, unsigned int, size);
int main()
{
  char am[30];
  whoami(am, 30);
  printf("%s\n",am);
  return 0;
}


寫好後,mount-hdc,然後放進去。umount hdc,在bochs中編譯運行。
接下來拷貝測試代碼。
測試程序
這兒可以驗證到我們的系統調用是沒問題的。
接下來編譯iam.c 和whoami.c, 運行另外一個shell腳本
用戶態驗證運行結果

問題

從 Linux 0.11 現在的機制看,它的系統調用最多能傳遞幾個參數?你能想出辦法來擴大這個限制嗎?
最多3個參數,使用ebx,ecx,edx寄存器。可以用寄存器傳遞參數指針,讓單個指針指向多個參數來擴大限制。
用文字簡要描述向 Linux 0.11 添加一個系統調用 foo() 的步驟。
1.定義系統調用編號。
2.添加系統調用表
3.添加實現

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章