在kernel space调用系统调用的例子

来源:互联网 发布:javascript解析json 编辑:程序博客网 时间:2024/06/04 19:27
所以的系统调用都是定义在include/linux/syscalls.h 中,例如sys_open
一般来说系统调用都是需要在user space调用的,但是其实在kernel space也可以调用原本应该在user space调用的系统调用.
例如在init/do_mounts.c中就会调用sys_open
void __init change_floppy(char *fmt, ...)
{
    struct termios termios;
    char buf[80];
    char c;
    int fd;
    va_list args;
    va_start(args, fmt);
    vsprintf(buf, fmt, args);
    va_end(args);
    fd = sys_open("/dev/root", O_RDWR | O_NDELAY, 0);
    if (fd >= 0) {
        sys_ioctl(fd, FDEJECT, 0);
        sys_close(fd);
    }
    printk(KERN_NOTICE "VFS: Insert %s and press ENTER\n", buf);
    fd = sys_open("/dev/console", O_RDWR, 0);
    if (fd >= 0) {
        sys_ioctl(fd, TCGETS, (long)&termios);
        termios.c_lflag &= ~ICANON;
        sys_ioctl(fd, TCSETSF, (long)&termios);
        sys_read(fd, &c, 1);
        termios.c_lflag |= ICANON;
        sys_ioctl(fd, TCSETSF, (long)&termios);
        sys_close(fd);
    }
}
在change_floppy 中直接调用sys_open。
0 0
原创粉丝点击