知道了syscall调用号之后还不算完,还要搞清楚2件事:

1 每种调用号需要传递哪些参数;

2 调用如何传递参数以及结果如何返回;

第一个问题的答案是:

在linux系统中某个程序执行时进行的系统调用可以通过strace命令来查看,solaris中对应的命令为dtrace,而mac os x中可以通过类似的dtruss命令来查看。当进程已经处于 D 状态(uninterruptible sleep)时,strace 也帮不上忙。这时候可以通过:

cat /proc/<PID>/syscall

来查看。(详细内容可以到http://www.jb51.net/article/50923.htm查看)

32位的系统调用表的参数可以到

http://syscalls.kernelgrok.com/



http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html

查找;关于32位系统中使用汇编语言调用syscall table,将在另一篇博文[linux下32位汇编的系统调用]中详述。

而在64位系统中,大神说了:可以通过grep在源代码中查找:

To find the implementation of a system call, grep the kernel tree for SYSCALL_DEFINE.\?(syscall,

For example, to find the read system call:

illusion:/usr/src/linux-source-3.19$ grep -rA3 'SYSCALL_DEFINE.\?(read,' *
fs/read_write.c:SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count)
fs/read_write.c-{
fs/read_write.c-        struct file *file;
fs/read_write.c-        ssize_t ret = -EBADF;

也可以在以下网址中查找:

http://blog.rchapman.org/post/36801038863/linux-system-call-table-for-x86-64

而第二个问题的答案为:

在64位linux中,一般来说系统调用的参数统统放在寄存器中,最多可以用到6个寄存器;如果多余6个参数的系统调用怎么传递参数?这个还不清楚,有的文档说64位系统调用的参数最多不会超过6个;还有的文档说超过6个参数的话,其余参数全部通过堆栈来传递。超过6个参数的系统调用,本猫没有实际碰到,也不知到底该怎么办!?就这个问题,有兴趣的童鞋可以和本猫单独切磋讨论。

具体调用规则如下:

1.用户模式的系统调用依次传递的寄存器为:

rdi,rsi,rdx,rcx,r8和r9;

2.内核接口的系统调用一次传递的寄存器为:

rdi,rsi,rdx,r10,r8和r9;注意这里和用户模式的系统调用只有第4个寄存器不同,其他都相同。

3.系统调用通过syscall指令进入,不像32位下的汇编使用的是int 0x80指令;

4.系统调用号放在rax寄存器里;

5.系统调用限制最多6个参数,没有参数直接通过栈传递,原话是:

System-calls are limited to six arguments, no argument is passed directly on
the stack.

6.系统调用的返回结果,也就是syscall指令的返回放在rax寄存器中;

7.只有整形值和内存型的值可以传递给内核,这个也不十分明白,原话是:

Only values of class INTEGER or class MEMORY are passed to the kernel.

有的童鞋可能要问了,要是浮点数怎么传递给接口!?有参数是浮点数的系统调用吗?这个还真不清楚,不过参数是浮点数的C标准库函数的调用那是大大的有,这个等到在另一篇博文[64汇编调用C标准库函数]中再详细给大家解答。

linux下64位汇编的系统调用(2)的更多相关文章

  1. linux下64位汇编的系统调用(3)

    背景知识基本交代清楚了,下面我们实际写一个小例子看一下.代码的功能很简单,显示一行文本,然后退出.我们使用了syscall中的write和exit调用,查一下前面的调用号和参数,我们初步总结如下: w ...

  2. linux下64位汇编的系统调用(1)

    现在基本上系统都是64位了,而64位系统下的汇编和32位有了较大的变化,无论是系统调用的接口还是C标准库的接口都和32位汇编有所不同:下面简单谈一下在64位linux下如何利用汇编直接调用系统调用. ...

  3. linux下64位汇编的系统调用(5)

    看到这里大家都基本知道了如何进行linux下的汇编系统调用:不过有些童鞋可能会问:那些C库中函数里为我们解决的额外汇编代码你是怎么知道的? 好吧,我承认:我是通过逆向知道的,这貌似有点犯规的嫌疑- 比 ...

  4. linux下64位汇编的系统调用(4)

    经过上一篇的铺垫貌似可以很轻松的用汇编写出mmap的代码来,可仔细一看,还是有不少问题需要解决: 1.系统调用mmap如果出错并不直接返回MAP_FAILED(-1),而是一个"类似&quo ...

  5. linux下64位汇编的系统调用系列

    http://blog.csdn.net/mydo/article/category/3084893

  6. Mac OS X下64位汇编与Linux下64位汇编的一些不同

    1 首先系统调用号大大的不同:mac64和linux32的系统调用号也不同(虽然局部可能有相同) 2 mac64的系统调用号在: /usr/include/sys/syscall.h 可以查到,但是调 ...

  7. linux下32位汇编调用规则

    传递给系统调用的参数必须安装参数顺序一次放到寄存器中,当系统调用完成后,返回值放在eax中: 当系统调用参数<=5个时: eax中存放系统调用的功能号,传递给系统调用的参数顺序依次放到寄存器:e ...

  8. win7win8 64位汇编开发环境合集安装与设置

    win7win8 64位汇编开发环境合集安装与设置 下载 win7 win8  64位汇编开发环境.rar 下载地址(免积分下载) http://download.csdn.net/detail/li ...

  9. Win7下64位机安装SQL2000

    win7下64位机安装SQLSERVER20001.右击计算机属性,查看操作系统 2.打开安装文件夹,按图点击 3.开始安装 4. 下一步选择 安装SQL Server2000 组件 5. 下一步 选 ...

随机推荐

  1. 指令汇B新闻客户端开发(一) 新手引导页开发

    首先做开发的时候应该有一个闪屏页面和新手引导页, 我相信闪屏页面大家应该都会了,那么先看到新手引导页了. 我们可以看到这其实是一个ViewPager,我们也可以看到这是3个引导页,那么首先来看一下布局 ...

  2. Ubuntu下配置Telnet服务器

    1. 首先介绍linux中的守护进程 在Linux系统中有一个特殊的守护进程inetd(InterNET services Daemon),它用于Internet标准服务,通常在系统启动时启动.通过命 ...

  3. 【问题汇总】ScrollView嵌套ListView的问题

    因产品的需求,需要在ScrollView中嵌套ListView来达到效果.众所周知,ScrollVIew和ListView都是可滑动的容器,嵌套使用一定会出现一些问题. [html] view pla ...

  4. SSH网上商城---使用ajax完成用户名是否存在异步校验

    小伙伴在上网的时候,需要下载或者观看某些视频资料,更或者是在逛淘宝的时候,我们都需要注册一个用户,当我们填写好各种信息,点击确定的时候,提示用户名已经存在,小编就想,为什么当我们填写完用户名的时候,她 ...

  5. spring源码系列(一)sring源码编译 spring源码下载 spring源码阅读

    想对spring框架进行深入的学习一下,看看源代码,提升和沉淀下自己,工欲善其事必先利其器,还是先搭建环境吧. 环境搭建 sping源码之前是svn管理,现在已经迁移到了github中了,新版本基于g ...

  6. Android的View类介绍-android的学习之旅(十三)

    view概述 android绝大部分UI组件都放在android.view和android.widght包中,android的虽有UI组件都继承了View类. View类还有一个非常重要的子类:Vie ...

  7. IDEA中运行DirectKafkaWordCount程序

    1,将SPARK_HOME中的DirectKafkaWordCount程序复制到idea中. 2,由于在KafkaWordCount中已引入相关jar包,此步可略过 3,配置configuration ...

  8. xml解析之使用dom4j的api对xml文件进行CRUD(二)

    在使用dom4j的api对xml文件进行CRUD(一)见博客http://blog.csdn.net/qq_32059827/article/details/51524330的基础上,再对做一次练习. ...

  9. 【一天一道LeetCode】#101. Symmetric Tree

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...

  10. HTML5 classList API接口

    原文地址:HTML5 classList API 原文日期: 2010年07月13日 翻译日期: 2013年08月23日 当我陷入JavaScrip和JavaScript类库框架之中时,我总是有种希望 ...