linux内核偏移,内核崩溃导致的Linux系统调用(怪异偏移)

我试图从内核模块调用系统调用,我有这样的代码:

set_fs( get_ds() ); // lets our module do the system-calls

// Save everything before systemcalling

asm (" push %rax ");

asm (" push %rdi ");

asm (" push %rcx ");

asm (" push %rsi ");

asm (" push %rdx ");

asm (" push %r10 ");

asm (" push %r8 ");

asm (" push %r9 ");

asm (" push %r11 ");

asm (" push %r12 ");

asm (" push %r15 ");

asm (" push %rbp ");

asm (" push %rbx ");

// Invoke the long sys_mknod(const char __user *filename, int mode, unsigned dev);

asm volatile (" movq $133, %rax "); // system call number

asm volatile (" lea path(%rip), %rdi "); // path is char path[] = ".."

asm volatile (" movq mode, %rsi "); // mode is S_IFCHR | ...

asm volatile (" movq dev, %rdx "); // dev is 70 >> 8

asm volatile (" syscall ");

// POP EVERYTHING

asm (" pop %rbx ");

asm (" pop %rbp ");

asm (" pop %r15 ");

asm (" pop %r12 ");

asm (" pop %r11 ");

asm (" pop %r9 ");

asm (" pop %r8 ");

asm (" pop %r10 ");

asm (" pop %rdx ");

asm (" pop %rsi ");

asm (" pop %rcx ");

asm (" pop %rdi ");

asm (" pop %rax ");

set_fs( savedFS ); // restore the former address-limit value此代码无法正常工作,导致系统崩溃(这是一个内核模块)。

这段代码与重定位信息的转储是:

2c: 50 push %rax

2d: 57 push %rdi

2e: 51 push %rcx

2f: 56 push %rsi

30: 52 push %rdx

31: 41 52 push %r10

33: 41 50 push %r8

35: 41 51 push %r9

37: 41 53 push %r11

39: 41 54 push %r12

3b: 41 57 push %r15

3d: 55 push %rbp

3e: 53 push %rbx

3f: 48 c7 c0 85 00 00 00 mov $0x85,%rax

46: 48 8d 3d 00 00 00 00 lea 0x0(%rip),%rdi # 4d

49: R_X86_64_PC32 path-0x4

4d: 48 83 c7 04 add $0x4,%rdi

51: 48 8b 34 25 00 00 00 mov 0x0,%rsi

58: 00

55: R_X86_64_32S mode

59: 48 8b 14 25 00 00 00 mov 0x0,%rdx

60: 00

5d: R_X86_64_32S dev

61: 0f 05 syscall

63: 5b pop %rbx

64: 5d pop %rbp

65: 41 5f pop %r15

67: 41 5c pop %r12

69: 41 5b pop %r11

6b: 41 59 pop %r9

6d: 41 58 pop %r8

6f: 41 5a pop %r10

71: 5a pop %rdx

72: 5e pop %rsi

73: 59 pop %rcx

74: 5f pop %rdi

75: 58 pop %rax我想知道为什么在那里有一个-0x4的偏移量

49:R_X86_64_PC32路径 - 0x4?

我的意思是:模式和开发应该自动解决没有问题,但路径呢?为什么-0x4抵消?

我试图“补偿”

lea 0x0(%rip),%rdi //这会以某种方式添加-0x4偏移量

添加$ 0x4,%rdi

....

但代码仍然崩溃。

我哪里错了?

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值