首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从装配中理解ioctl调用

从装配中理解ioctl调用
EN

Stack Overflow用户
提问于 2015-11-29 16:09:10
回答 1查看 811关注 0票数 0

下面的代码是这个链接http://dune.scs.stanford.edu/程序的一部分。我/我们不能理解它的dune.S文件,具体如下。我希望这篇文章调用DUNE_ENTER ioctl命令,定义为

#define DUNE_ENTER _IOR(DUNE_MINOR, 0x01, struct dune_config)我说得对吗?

代码语言:javascript
复制
.globl __dune_enter
__dune_enter://called in entry.c::do_dune_enter
    pushfq
    subq    $REG_END, %rsp
    SAVE_REGS 1, 0
    SAVE_REST
    movq    %rsp, DUNE_CFG_RSP(%rsi)
    movq    %rsi, %rdx
    movq    $0x8020e901, %rsi /* XXX DUNE_ENTER */ //me: how does he in advance knows the address of dune_enter
    movq    $16, %rax /* __NR_ioctl */
    syscall //me:is instruction just like sysenter or int 80 for x86_64

    cmpq    $0, %rax
    jnz __dune_ret
    movq    DUNE_CFG_RET(%rdx), %rdi
    movq    $60, %rax /* __NR_exit */
    syscall

.globl  __dune_ret
__dune_ret:
    RESTORE_REST
    RESTORE_REGS 1, 0
    addq    $REG_END, %rsp
    popfq
    retq

任何评论或帮助,即使你觉得简单,并已被理解,将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-29 16:32:50

$0x8020e901不是任何东西的地址。它是关于类型、函数、方向和参数大小的编码信息。它是由_IOR宏通过其他宏创建的:

代码语言:javascript
复制
#define _IOC_NRBITS     8
#define _IOC_TYPEBITS   8

/*
 * Let any architecture override either of the following before
 * including this file.
 */

#ifndef _IOC_SIZEBITS
# define _IOC_SIZEBITS  14
#endif

#ifndef _IOC_DIRBITS
# define _IOC_DIRBITS   2
#endif

#define _IOC_NRSHIFT    0
#define _IOC_TYPESHIFT  (_IOC_NRSHIFT+_IOC_NRBITS)
#define _IOC_SIZESHIFT  (_IOC_TYPESHIFT+_IOC_TYPEBITS)
#define _IOC_DIRSHIFT   (_IOC_SIZESHIFT+_IOC_SIZEBITS)

#ifndef _IOC_READ
# define _IOC_READ      2U
#endif

#define _IOC(dir,type,nr,size) \
        (((dir)  << _IOC_DIRSHIFT) | \
         ((type) << _IOC_TYPESHIFT) | \
         ((nr)   << _IOC_NRSHIFT) | \
         ((size) << _IOC_SIZESHIFT))

#define _IOR(type,nr,size)
  _IOC(_IOC_READ,(type),(nr),(_IOC_TYPECHECK(size)))

因此,在默认情况下,所有这些都归结为:

代码语言:javascript
复制
Bits
 0- 7  function number
 8-15  type
16-29  size
30-31  direction

逆向工程我们可以看到,DUNE_MINOR0xe9sizeof(struct dune_config)应该是0x20

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33984865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档