Chinaunix首页 | 论坛 | 博客
  • 博客访问: 393865
  • 博文数量: 138
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1620
  • 用 户 组: 普通用户
  • 注册时间: 2013-03-10 16:55
个人简介

当你比别人优秀一点点,别人会嫉妒你。当你比别人优秀很多,别人会羡慕你。

文章分类

全部博文(138)

文章存档

2016年(2)

2015年(2)

2014年(15)

2013年(119)

我的朋友

分类: LINUX

2013-05-07 09:11:35

中断之后,进入_system_call,(定义在linux-0.11/kernel/system_call.s)



点击(此处)折叠或打开

  1. _system_call:

  2.        cmpl $nr_system_calls-1,%eax

  3.        ja bad_sys_call

  4.        push %ds

  5.        push %es

  6.        push %fs

  7.        pushl %edx

  8.        pushl %ecx # push %ebx,%ecx,%edx as parameters

  9.        pushl %ebx # to the system call

  10.        movl $0x10,%edx # set up ds,es to kernel space

  11.        mov %dx,%ds

  12.        mov %dx,%es

  13.        movl $0x17,%edx # fs points to local data space

  14.        mov %dx,%fs

  15.        call _sys_call_table(,%eax,4)

  16.        pushl %eax

  17.        movl _current,%eax

  18.        cmpl $0,state(%eax) # state

  19.        jne reschedule

  20.        cmpl $0,counter(%eax) # counter

  21.        je reschedule

_system_call 根据系统调用号,结合_sys_call_table计算所要调用的系统调用的地址,然后就call  (call _sys_call_table(,%eax,4))(sys_call_table[]定义在linux-0.11/include/linux/sys.h)


点击(此处)折叠或打开

  1. fn_ptr sys_call_table[] = { sys_setup, sys_exit, sys_fork, sys_read,

  2. sys_write, sys_open, sys_close, sys_waitpid, sys_creat, sys_link,

  3. sys_unlink, sys_execve, sys_chdir, sys_time, sys_mknod, sys_chmod,

  4. sys_chown, sys_break, sys_stat, sys_lseek, sys_getpid, sys_mount,

  5. sys_umount, sys_setuid, sys_getuid, sys_stime, sys_ptrace, sys_alarm,

  6. sys_fstat, sys_pause, sys_utime, sys_stty, sys_gtty, sys_access,

  7. sys_nice, sys_ftime, sys_sync, sys_kill, sys_rename, sys_mkdir,

  8. sys_rmdir, sys_dup, sys_pipe, sys_times, sys_prof, sys_brk, sys_setgid,

  9. sys_getgid, sys_signal, sys_geteuid, sys_getegid, sys_acct, sys_phys,

  10. sys_lock, sys_ioctl, sys_fcntl, sys_mpx, sys_setpgid, sys_ulimit,

  11. sys_uname, sys_umask, sys_chroot, sys_ustat, sys_dup2, sys_getppid,

  12. sys_getpgrp, sys_setsid, sys_sigaction, sys_sgetmask, sys_ssetmask,

  13. sys_setreuid,sys_setregid }


 call _sys_call_table(,%eax,4)  调用的说sys_call_table.,两个变量名字差一个下划线,但的的确确,前面那个call指令访问的说后面那个数组。

原因分析:


编译器在编译C语言的时候,会在每个函数的名称前面添加一个下划线,目的是防止函数名称和库函数重名。 C专家编程 5.4 章节interpositioning 讲解了原理。至于添加下划线的方法,是unix C 的规则。



所以在汇编语言调用C语言的时候,访问C语言符号的时候,要添加上下划线。 直接访问符号可以省一个符号 ,不用倒了,至于怎么倒。。。。
阅读(1459) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~