Linux Syscalls有> 6个参数(Linux Syscalls with > 6 parameters)

是否可以编写一个具有6个以上输入参数的(linux内核)sycall函数? 查看标题我发现定义的系统调用宏最多有6个参数。 我很想尝试定义SYSCALL7和SYSCALL8以允许7和8参数,但我不太确定它是否真的有效。

IS it possible to write a (linux kernel)sycall function that has more than 6 input parameters? Looking at the header I see that the defined syscall macros have a maximum of 6 parameters. I'm tempted to try to define SYSCALL7 and SYSCALL8 to allow for 7 and 8 parameters but I'm not quite sure if that will actually work.

原文:https://stackoverflow.com/questions/21517811

更新时间:2020-02-13 11:44

最满意答案

对于x86,以下函数(来自x86 ... syscall.h )将参数复制到:

static inline void syscall_get_arguments(struct task_struct *task,

struct pt_regs *regs,

unsigned int i, unsigned int n,

unsigned long *args)

{

BUG_ON(i + n > 6);

memcpy(args, &regs->bx + i, n * sizeof(args[0]));

}

在asm_generic / syscall.h的注释中很好地描述了这个函数。 它将参数复制到系统调用中,并且限制为6个参数。 它可以根据架构以多种方式实现。 对于x86(来自上面的代码片段),看起来这些参数都是通过寄存器传递的。

因此,如果要传递6个以上的参数,请使用结构。 如果你必须有一个SYSCALL7,那么你将不得不创建一个自定义内核,并且几乎可以修改系统调用进程的每一步。 x86_64可能更容易适应这种变化,因为它有比x86更多的寄存器。

For x86, the following function (from x86...syscall.h) copies the arguments over:

static inline void syscall_get_arguments(struct task_struct *task,

struct pt_regs *regs,

unsigned int i, unsigned int n,

unsigned long *args)

{

BUG_ON(i + n > 6);

memcpy(args, &regs->bx + i, n * sizeof(args[0]));

}

This function is described well in the comments in asm_generic/syscall.h. It copies the arguments into the syscall, and there is a limit of 6 arguments. It may be implemented in a number of ways depending on architecture. For x86 (from the snippet above) it looks like the arguments are all passed by register.

So, if you want to pass more than 6 arguments, use a struct. If you must have a SYSCALL7, then you are going to have to create a custom kernel and likely modify almost every step of the syscall process. x86_64 would likely accommodate this change easier, since it has more registers than x86.

2014-02-03

相关问答

从man sigaction ( 链接 )我引用: 原始的Linux系统调用被命名为sigaction()。 但是,随着Linux 2.2中添加实时信号,该系统调用支持的固定大小的32位sigset_t类型不再适合用途。 因此,添加了一个新的系统调用rt_sigaction(),以支持放大的sigset_t类型。 新的系统调用采用第四个参数,size_t sigsetsize,它指定了act.sa_mask和oldact.sa_mask中信号集的字节大小。 From man sigaction (

...

过去,我通过使用内核模块修补系统调用表来做了类似的事情。 每个修补功能都做了如下内容: patchFunction(/*params*/)

{

// pre checks

ret = origFunction(/*params*/);

// post checks

return ret;

}

请注意,当您在内核数据结构中开始混淆时,您的模块将变为版本相关的。 内核模块可能必须针对您正在安装的特定内核版本进行编译。 还要注意,这是许多rootkit所采用的技术,所以如果你安

...

Syscall参数首先从用户空间通过寄存器传递给system_call()函数,该函数本质上是一个常见的系统调度程序。 但是,system_call()然后以通常的方式调用实际的系统调用函数,例如sys_read(),通过堆栈传递参数。 因此,搞乱堆栈会导致崩溃。 另外,请看这个SO答案: https : //stackoverflow.com/a/10459713以及关于quora的非常详细的解释: http ://www.quora.com/Linux-Kernel/What-does-asm

...

从内核代码调用系统调用( sys_*函数)不是一个好主意。 实际上,许多系统调用可以用函数表示,可用于内核模块。 我需要使用文件描述符。 所以,我不能使用filp_函数(比如filp_open)。 使用fdget可以轻松地将文件描述符转换为文件指针。 例如,参见fs/open.h的fallocate系统调用( SYSCALL_DEFINE4(fallocate...) fs/open.h )。 至于errno ,这个变量只是用户空间。 系统调用使用-E约定返回错误,libc将此值存储到errno

...

发生这种情况是因为程序的输出不以换行符结束。 您的程序没有打印% 。 您可以通过将其输出管道输入hexdump -C或类似物来验证这一点。 您还可以使用strace来跟踪系统调用它的内容,但这并不显示输出 ,因此它不会排除内核神奇地添加% 。 (但你可以肯定内核不会这样做。唯一可能的是, write尽早返回,而没有编写完整的缓冲区。这只有大缓冲区大小,特别是在写入带有管道的管道时缓冲区大于管道缓冲区(可能是64kiB)。 这是部分行的ZSH功能: 为什么ZSH结束带有突出显示百分号的行? 。 你没

...

系统调用的文档位于手册页的第2部分和/或源代码的注释中。 手册页以: #include

#include

#include

int open(const char *pathname, int flags);

int open(const char *pathname, int flags, mode_t mode);

参数标志必须包括以下访问模式之一: O_RDONLY , O_WRONL

...

我编写了一个简单的SystemTap脚本(基于syscalls_by_pid.stp )。 它产生这样的输出: ProcessName #SysCalls

munin-graph 38609

munin-cron 8160

fping 4502

check_http_demo 2584

check_nrpe 2045

sh 18

...

对于x86,以下函数(来自x86 ... syscall.h )将参数复制到: static inline void syscall_get_arguments(struct task_struct *task,

struct pt_regs *regs,

unsigned int i, unsigned int n,

...

总的来说:不知道。 即使在i386上,如果有第6个参数,它也必须在堆栈上传递(例如对于mmap )。 特别是对于x86_64:将系统调用号放在%rax (注意:系统调用号的分配与32位完全不同), %rdi , %rsi , %rdx , %r10 , %r8和%r9最多6个参数%r9 (几乎,但不完全相同,与寄存器中参数传递的通常ABI相同 - 注意使用%r10而不是%rcx ),并使用syscall指令。 结果在%rax返回, %rcx和%r11被破坏。 x86_64 ABI信息可以在http

...

它会自动在屏幕上打印按键 这是Linux中的默认设置(独立于编程语言): 键盘输入将打印到屏幕上 sys_read将一直等到按下return(回车)键 要更改此行为,必须调用tcsetattr()函数(在C中)。 你应该先调用tcgetattr()函数来存储当前设置并在离开程序之前恢复它们。 如果要直接使用系统调用:tcsetattr和tcgetattr都使用一些sys_ioctl。 要找出使用哪个ioctl()代码,您可以编写一个执行tcsetattr和tcgetattr的C程序,并使用“str

...

linux 培训6,Linux Syscalls有 6个参数(Linux Syscalls with 6 parameters)相关推荐

  1. linux培训_达内linux培训:7招教运维释放Linux操作系统的空间

    达内linux培训介绍一些简单的方法和技巧来帮助大家清理开源GNU/Linux操作系统 Ubuntu 和Linux Mint 系统并获得更多可用空间. 随着使用时间的推移,随着各种应用程序被添加和删除 ...

  2. Linux培训教程 浅谈:PHP在linux上执行外部命令(整理)

    一.PHP中调用外部命令介绍 二.关于安全问题 三.关于超时问题 四.关于PHP运行linux环境中命令出现的问题 一.PHP中调用外部命令介绍 在PHP中调用外部命令,可以用,1>调用专门函数 ...

  3. godaddy ssl_免费在线Linux培训,GoDaddy切换到OpenStack等

    godaddy ssl 开源新闻让您阅读愉快. 2014年3月3日至7日 在本周的开源新闻摘要中,我们介绍了罗彻斯特理工学院(RIT)的开源软件新辅助知识,Raspberry Pi的新图形驱动程序等等 ...

  4. linux禁止普通用户切换,扣丁学堂Linux培训简述Linux禁止普通用户切换至root用户的实例...

    本篇文章扣丁学堂Linux培训小编给读者们分享一下Linux禁止普通用户切换至root用户的实例,对Linux开发技术感兴趣的小伙伴就随小编来了解一下吧,希望对小伙伴们有所帮助. 在上正文之前,我想先 ...

  5. linux线程多参数传递参数,Linux中多线程编程并传递多个参数

    解析Linux中多线程编程并传递多个参数 Linux中多线程编程并传递多个参数实例是本文讲解的内容,不多说,先来看内容. Linux下的多线程编程,并将多个参数传递给线程要执行的函数. 以下是实验程序 ...

  6. Linux培训教程 Git在linux下的使用

       *初始化git仓库,使用gitinit命令 *添加文件到git仓库分两步: 1.使用git add filename ;可分多次使用,添加多个文件到暂存区 2.使用git commit -m & ...

  7. linux cp复制文件夹下的软连接,Linux培训:cp命令复制文件和目录

    Linux培训:cp命令复制文件和目录 更新时间:2019年04月02日16时56分 来源:传智播客linux培训 浏览次数: cp 是用于复制的命令,其基本信息如下: 命令名称:cp: 英文原意:c ...

  8. linux系统编程 传智播客,传智播客王保明Linux培训系列教程全120集

    传智播客王保明Linux培训系列教程全120集--更多资源,课程更新在 多智时代 duozhishidai.com 多智时代资源,简介: 第一天: 01-从linux内核角度看linux系统编程 02 ...

  9. 老男孩高端linux培训2014业务服务范围

    寻求有想法.有抱负的志同道合的各路英雄豪杰! 简历直投老男孩信箱49000448@qq.com 老男孩高端linux培训2014业务服务范围 个人培训: 北京老男孩培训,全国最负责.最高端.最专业的l ...

最新文章

  1. 正点原子串口函数分析
  2. 中国第一软件开发_我第一次开发企业软件中学到的知识
  3. kafka 丢弃数据_Kafka史上最详细原理总结下
  4. Python 凭什么打败 Java、C/C++,成为机器学习的唯一语言?
  5. 自定义View(一)-ViewGroup实现优酷菜单
  6. HDU-2544-最短路(floyd)
  7. 计算机没鼠标怎么,电脑没鼠标怎么开启系统
  8. 中标麒麟操作系统安装
  9. WMS仓库管理软件操作流程是怎样
  10. MATLAB图像处理
  11. Android终于要推出Google官方的二维码扫描库了?
  12. STC8I2CGY-302(BH1750光照度强度模块)
  13. 5种常见的服务器种类是哪些
  14. 成为人生的赢家都有哪些书_那么,我们是否有代码挑战#1的赢家?
  15. 【语音隐藏】基于matlab小波变换DWT结合离散余弦变换DCT音频数字水印嵌入提取【含Matlab源码 2131期】
  16. 实验四、SPOOLing技术
  17. linux usleep占用cpu,c-Cent OS 6.3上的usleep的CPU高使用率
  18. 生产计划自动排程目标是什么?
  19. 第二十六讲 有限域基础
  20. 分享几个网址二维码生成api

热门文章

  1. 前端学习(3040):vue+element今日头条管理-上午回顾
  2. 前端学习(3034):vue+element今日头条管理-markdown补充
  3. [html] 如何禁止input输入的历史记录
  4. [css] 在sass中可以执行布尔运算吗?
  5. 前端学习(2653):对比vue2中的实现
  6. 前端学习(2258)如何做标签管理
  7. “约见”面试官系列之常见面试题之第五十八篇之join和split(建议收藏)
  8. 前端学习(1967)vue之电商管理系统电商系统之切换面板获取
  9. 前端学习(1605):组件传值
  10. 前端学习(1416):ajax的运行原理