Chinaunix首页 | 论坛 | 博客
  • 博客访问: 537145
  • 博文数量: 103
  • 博客积分: 2024
  • 博客等级: 上尉
  • 技术积分: 1294
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-08 21:17
文章分类

全部博文(103)

文章存档

2012年(2)

2011年(21)

2010年(80)

分类: LINUX

2010-05-08 10:30:17

四、从用户空间到内核空间
在内核空间,跟socket相关的调用都是在sys_socketcall()函数里面。入口函数就是asmlinkage long sys_socketcall(int call, unsigned long __user *args)。我们这部分就是分析如何从一个用户的程序,如后进入到sys_socketcall()函数。至于进入sys_socketcall()函数以后的操作,可以参考《linux内核源代码情景分析(下) 》,那里面讲的很清楚,这里就不继续叙述了。因为对汇编不太熟悉,理解可能有些偏差,但大体流程不会错。
1. 关于asmlinkage
asmlinkage定义如下:#define asmlinkage __attribute__((regparm(0))). 
gcc编译器在汇编过程中调用c语言函数时传递参数有两种方法:一种是通过堆栈,另一种是通过寄存器。缺省时采用寄存器,假如你要在你的汇编过程中调用c语言函数,并且想通过堆栈传递参数,你定义的c函数时要在函数前加上宏asmlinkage

asmlinkage相对应的是fastcall fastcall宏是在include/asm-i386/linkage.h中定义的宏,它指导GCC连接时把fastcall修饰的函数的前三个参数用寄存器传递。asmlinkagefastcall不能共存。
2. 关于cond_syscall
cond_syscall(sys_socketcall);语句的意思是:如果存在sys_socketcall(),则声明这个函数,在程序链接的时候使用这个函数;如果不存在sys_socketcall()这个函数,就使用sys_ni_syscall()函数代替。
3.从用户程序到中断
这里以i386体系,glibc2.7的源码,socket()接口为例来分析。用户程序调用socket函数,生成socket的描述符。这个函数是glibc中的库函数。定义在glibc2.7/sysdeps/unix/sysv/linux/i386/socket.s里面。
有一个weak_alias 的宏,weak_alias(name1,name2)的含义是
为标号name1定义一个弱化名name2。仅当name2没有在任何地方定义时,连接器就会用name1解析name2相关的符号。在文件中定义的标号name1也会同样处理。在socket.s里面有下面语句:

#ifndef __socket
# ifndef NO_WEAK_ALIAS
#
define __socket P(__,socket)

# else
#
define __socket socket

# endif
#endif
…….
#ifndef NO_WEAK_ALIAS
weak_alias (__socket, socket)
#endif
这样,调用socket()本质就是调用socket.S里面的__socket()函数。
Socket.s通过ENTER_KERNEL宏,发出中断信号。这个宏的定义在glibc-2.7/sysdeps/unix/sysv/linux/i386/sysdep.h里面定义。系统调用最终是要用int 0x80的,将调用号压入eax,子调用码在ebx里面,其它参数压入其他地址里面,地址的值放在ecx里面。这样,就进入内核的中断处理流程了。
4. 中断发生后内核的处理
从系统内核启动的start_kernel()开始,会调用trap_init(),这个函数就是注册各种处理中断的入口函数。看里面的set_system_gate(SYSCALL_VECTOR,&system_call) 其中的SYSCALL_VECTOR就是0x80,系统调用的中断号码。对应的处理函数就是system_call
system_call的定义是在entry.s文件里面,汇编代码ENTRY(system_call),其中的语句call *sys_call_table(,%eax,4) 就是调用sys_call_table定义的处理函数,eax是调用号,根据其中的参数值,会调用这个表的第102.long sys_socketcall函数,从而转到sys_socketcall()函数的处理。后面的就参考《linux内核情景分析(下) 》。其实,这部分系统调用的,在《linux内核情景分析(上) 》中也进行了比较详细的论述。可以参考阅读。
阅读(1823) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~