内核符号表和系统调用

本文来自:http://blog.csdn.net/hufeifeihu/archive/2008/07/03/2607789.aspx

内核符号表和系统调用

驱动程序开发过程中涉及 kernel symbol table syscall 两个概念,不知道大家是如何理解的,在此把我对二者理解罗列如下,给大家参考:

     内核符号表 linux 内核提供给内核代码的一部分引用,所指的“内核代码”包括内核以及驱动程序等运行在内核内存空间的程序,“引用”包括对变量的引用,对函数的引用等。最常见的内核符号引用如 printk 打印输出。通常内核符号是由一部分内核代码提供给其他内核代码访问其内部数据的接口。在驱动程序中,如果该驱动程序中有被其他内核代码调用的部分,可以用 EXPORT_SYMBOL 导出到内核符号表中。

    在多层驱动模型如 USB SCSI 、文件系统中一般底层的驱动程序要导出其功能调用到内核符号表中,给上层驱动调用。

    系统调用 是由基本内核提供的功能调用接口,所指的基本内核是不包括驱动程序,不能被随意精简的核代码。系统调用的接口不仅运行于内核空间的代码可以调用,用户空间的程序同样可以使用系统调用。系统调用的最初目的就是提供给用户程序访问操作系统的接口。最常见的系统调用如 open,close,read,write 等。

    用户应用程序使用 open(“/dev/null”) 打开设备时,到底该系统调用完成了什么功能?简单的说,应用程序通知操作系统,需要打开 /dev/null 设备,成功后操作系统会返回设备句柄。至于操作系统为了完成打开设备操作具体干了写什么,可以参考内核代码中 sys_open 的实现。

    内核符号表中的东西只能被内核空间程序访问,系统调用无此限制。系统调用是最基本内核提供的代码不能随意添加或减少,而内核符号可以根据需要自行导出。

    还有一点值得注意的是,当在内核代码中如驱动程序,发生了系统调用,系统调用的代码是在该进程的用户空间运行。这样说还是有点模糊,举个例子就清楚了。

进程 test ,虚拟设备 /dev/readfile 驱动程序模块 readfile.o ,文件 name.txt 这三个对象。

Test.c 中:

    Open(“/devreadfile” 。。。 ) /* 系统调用 open ,打开设备 /dev/readfile*/

readfile.c 的驱动程序中:

    open(“name.txt” 。。。 )   /* 系统调用 open, 打开文件 name.txt */

把前一个 open 命名位 OPEN1, 后一个为 OPEN2 OPEN1 系统调用运行于 test 进程的内存区, readfile.o 的模块代码运行于内核空间,当发生系统调用 OPEN2 时, OPEN2 其实也是运行于进程 test 的内存区。 Test 内存区是用户空间,这点十分重要。不推荐在驱动代码中使用系统调用,以防止死锁。

 

系统调用不到 300 个,在 /arch/i386/kernel/entry.S 文件中定义,去掉前面的 sys_ 就是系统调用的函数名。

.data

ENTRY(sys_call_table)

       .long SYMBOL_NAME(sys_ni_syscall)       /* 0  -  old "setup()" system call*/

       .long SYMBOL_NAME(sys_exit)

       .long SYMBOL_NAME(sys_fork)

       .long SYMBOL_NAME(sys_read)

       .long SYMBOL_NAME(sys_write)

       .long SYMBOL_NAME(sys_open)              /* 5 */

       .long SYMBOL_NAME(sys_close)

       .long SYMBOL_NAME(sys_waitpid)

       .long SYMBOL_NAME(sys_creat)

       .long SYMBOL_NAME(sys_link)

       .long SYMBOL_NAME(sys_unlink)            /* 10 */

       .long SYMBOL_NAME(sys_execve)

       .long SYMBOL_NAME(sys_chdir)

       .long SYMBOL_NAME(sys_time)

       .long SYMBOL_NAME(sys_mknod)

       .long SYMBOL_NAME(sys_chmod)           /* 15 */

       .long SYMBOL_NAME(sys_lchown16)

       .long SYMBOL_NAME(sys_ni_syscall)                            /* old break syscall holder */

       .long SYMBOL_NAME(sys_stat)

       .long SYMBOL_NAME(sys_lseek)

       .long SYMBOL_NAME(sys_getpid)            /* 20 */

       .long SYMBOL_NAME(sys_mount)

       .long SYMBOL_NAME(sys_oldumount)

       .long SYMBOL_NAME(sys_setuid16)

       .long SYMBOL_NAME(sys_getuid16)

       .long SYMBOL_NAME(sys_stime)             /* 25 */

       .long SYMBOL_NAME(sys_ptrace)

       .long SYMBOL_NAME(sys_alarm)

       .long SYMBOL_NAME(sys_fstat)

       .long SYMBOL_NAME(sys_pause)

       .long SYMBOL_NAME(sys_utime)             /* 30 */

       .long SYMBOL_NAME(sys_ni_syscall)                            /* old stty syscall holder */

       .long SYMBOL_NAME(sys_ni_syscall)                            /* old gtty syscall holder */

       .long SYMBOL_NAME(sys_access)

       .long SYMBOL_NAME(sys_nice)

       .long SYMBOL_NAME(sys_ni_syscall)       /* 35 */          /* old ftime syscall holder */

       .long SYMBOL_NAME(sys_sync)

       .long SYMBOL_NAME(sys_kill)

       .long SYMBOL_NAME(sys_rename)

       .long SYMBOL_NAME(sys_mkdir)

       .long SYMBOL_NAME(sys_rmdir)             /* 40 */

       .long SYMBOL_NAME(sys_dup)

       .long SYMBOL_NAME(sys_pipe)

       .long SYMBOL_NAME(sys_times)

       .long SYMBOL_NAME(sys_ni_syscall)                            /* old prof syscall holder */

       .long SYMBOL_NAME(sys_brk)         /* 45 */

       .long SYMBOL_NAME(sys_setgid16)

       .long SYMBOL_NAME(sys_getgid16)

       .long SYMBOL_NAME(sys_signal)

       .long SYMBOL_NAME(sys_geteuid16)

       .long SYMBOL_NAME(sys_getegid16)       /* 50 */

       .long SYMBOL_NAME(sys_acct)

       .long SYMBOL_NAME(sys_umount)                               /* recycled never used phys() */

       .long SYMBOL_NAME(sys_ni_syscall)                            /* old lock syscall holder */

       .long SYMBOL_NAME(sys_ioctl)

       .long SYMBOL_NAME(sys_fcntl)              /* 55 */

       .long SYMBOL_NAME(sys_ni_syscall)                            /* old mpx syscall holder */

       .long SYMBOL_NAME(sys_setpgid)

       .long SYMBOL_NAME(sys_ni_syscall)                            /* old ulimit syscall holder */

       .long SYMBOL_NAME(sys_olduname)

       .long SYMBOL_NAME(sys_umask)            /* 60 */

       .long SYMBOL_NAME(sys_chroot)

       .long SYMBOL_NAME(sys_ustat)

       .long SYMBOL_NAME(sys_dup2)

       .long SYMBOL_NAME(sys_getppid)

       .long SYMBOL_NAME(sys_getpgrp)          /* 65 */

       .long SYMBOL_NAME(sys_setsid)

       .long SYMBOL_NAME(sys_sigaction)

       .long SYMBOL_NAME(sys_sgetmask)

       .long SYMBOL_NAME(sys_ssetmask)

       .long SYMBOL_NAME(sys_setreuid16)      /* 70 */

       .long SYMBOL_NAME(sys_setregid16)

       .long SYMBOL_NAME(sys_sigsuspend)

       .long SYMBOL_NAME(sys_sigpending)

       .long SYMBOL_NAME(sys_sethostname)

       .long SYMBOL_NAME(sys_setrlimit)   /* 75 */

       .long SYMBOL_NAME(sys_old_getrlimit)

       .long SYMBOL_NAME(sys_getrusage)

       .long SYMBOL_NAME(sys_gettimeofday)

       .long SYMBOL_NAME(sys_settimeofday)

       .long SYMBOL_NAME(sys_getgroups16)   /* 80 */

       .long SYMBOL_NAME(sys_setgroups16)

       .long SYMBOL_NAME(old_select)

       .long SYMBOL_NAME(sys_symlink)

       .long SYMBOL_NAME(sys_lstat)

       .long SYMBOL_NAME(sys_readlink)          /* 85 */

       .long SYMBOL_NAME(sys_uselib)

       .long SYMBOL_NAME(sys_swapon)

       .long SYMBOL_NAME(sys_reboot)

       .long SYMBOL_NAME(old_readdir)

       .long SYMBOL_NAME(old_mmap)             /* 90 */

       .long SYMBOL_NAME(sys_munmap)

       .long SYMBOL_NAME(sys_truncate)

       .long SYMBOL_NAME(sys_ftruncate)

       .long SYMBOL_NAME(sys_fchmod)

       .long SYMBOL_NAME(sys_fchown16)             /* 95 */

       .long SYMBOL_NAME(sys_getpriority)

       .long SYMBOL_NAME(sys_setpriority)

       .long SYMBOL_NAME(sys_ni_syscall)                            /* old profil syscall holder */

       .long SYMBOL_NAME(sys_statfs)

       .long SYMBOL_NAME(sys_fstatfs)            /* 100 */

       .long SYMBOL_NAME(sys_ioperm)

       .long SYMBOL_NAME(sys_socketcall)

       .long SYMBOL_NAME(sys_syslog)

       .long SYMBOL_NAME(sys_setitimer)

       .long SYMBOL_NAME(sys_getitimer)  /* 105 */

       .long SYMBOL_NAME(sys_newstat)

       .long SYMBOL_NAME(sys_newlstat)

       .long SYMBOL_NAME(sys_newfstat)

       .long SYMBOL_NAME(sys_uname)

       .long SYMBOL_NAME(sys_iopl)         /* 110 */

       .long SYMBOL_NAME(sys_vhangup)

       .long SYMBOL_NAME(sys_ni_syscall)       /* old "idle" system call */

       .long SYMBOL_NAME(sys_vm86old)

       .long SYMBOL_NAME(sys_wait4)

       .long SYMBOL_NAME(sys_swapoff)         /* 115 */

       .long SYMBOL_NAME(sys_sysinfo)

       .long SYMBOL_NAME(sys_ipc)

       .long SYMBOL_NAME(sys_fsync)

       .long SYMBOL_NAME(sys_sigreturn)

       .long SYMBOL_NAME(sys_clone)             /* 120 */

       .long SYMBOL_NAME(sys_setdomainname)

       .long SYMBOL_NAME(sys_newuname)

       .long SYMBOL_NAME(sys_modify_ldt)

       .long SYMBOL_NAME(sys_adjtimex)

       .long SYMBOL_NAME(sys_mprotect)        /* 125 */

       .long SYMBOL_NAME(sys_sigprocmask)

       .long SYMBOL_NAME(sys_create_module)

       .long SYMBOL_NAME(sys_init_module)

       .long SYMBOL_NAME(sys_delete_module)

       .long SYMBOL_NAME(sys_get_kernel_syms)    /* 130 */

       .long SYMBOL_NAME(sys_quotactl)

       .long SYMBOL_NAME(sys_getpgid)

       .long SYMBOL_NAME(sys_fchdir)

       .long SYMBOL_NAME(sys_bdflush)

       .long SYMBOL_NAME(sys_sysfs)             /* 135 */

       .long SYMBOL_NAME(sys_personality)

       .long SYMBOL_NAME(sys_ni_syscall)       /* for afs_syscall */

       .long SYMBOL_NAME(sys_setfsuid16)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值