SYSCALL_DEFINE2(gethostname, char __user *, name, int, len)
{
int i;
struct new_utsname *u;
char tmp[__NEW_UTS_LEN + 1];
if (len < 0)
return -EINVAL;
down_read(&uts_sem);
u = utsname();
i = 1 + strlen(u->nodename);
if (i > len)
i = len;
memcpy(tmp, u->nodename, i);
up_read(&uts_sem);
if (copy_to_user(name, tmp, i))
return -EFAULT;
return 0;
}
SYSCALL_DEFINE2(gethostname, char __user *, name, int, len)
格式:SYSCALL_DEFINE
2:2个参数
gethostname: 系统调用的名字
char __user *, name, int, len : 类型+参数名
1.在内核中添加对应系统调用的调用号
2.在kernel/sys.c 中实现具体的功能
3.声明系统调用 Syscalls.h
asmlinkage long sys_sched_getattr(pid_t pid,
struct sched_attr __user *attr,
unsigned int size,
unsigned int flags);
asmlinkage 表示系统调用,不是寄存器传递的,是通过堆栈传递过来的。
不要忘记里重新编译内核 make uImage
4.应用层调用 syscall(123, str);