linux 培训6,Linux Syscalls有 6个参数(Linux Syscalls with 6 parameters)

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

...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/411840.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言搜索子字符串

c字符串功能练习&#xff1a; 获取一行字符串&#xff0c;然后&#xff0c;在这行字符串中搜索是否包含一个小字符串 #include <cstdio> …

asp.net 导出word excel 当前上下文中不存在名称“Encoding”报错问题

web页面<% Page Language"C#" EnableEventValidation"false" AutoEventWireup"true" CodeBehind"CheapMaterialManageSet.aspx.cs" Inherits"AssetsManager.DeskWeb.BaseDOC.CheapMaterialManageSet" %>using System.…

linux中fstab含义,fstab每一列的含义

&#xff1c;fstab文件总览&#xff1e;当然&#xff0c;由于每个人的分区和设备属性或者所在的系统不同&#xff0c;所以fstab文件不尽相同&#xff0c;但是基本的结构总是相似的&#xff0c;下面是/etc/fstab中内容的一些示例&#xff1a;/etc/fstab:/dev/hda2 / ext2 defaul…

命令编写注册表文件修改注册表项

命令编写注册表文件修改注册表项 1、何谓REG文件REG文件实际上是一种注册表脚本文件&#xff0c;双击REG文件即可将其中的数据导入到注册表中。利用REG文件我们可以直接对注册表进行任何修改操作&#xff0c;它对注册表的操作可以不受注册表编辑器被禁用的限制&#xff0c;因此…

linux 刻录cd,Linux 刻录CD/DVD命令 growisofs/mkisofs/cdrecord

1 . 制作ISO&#xff1a; $ mkisofs -V LabelName -J -jcharsetutf8 -r -o /home/TargetImage.iso /home/my-data-dir参数V是volumn ID,卷标&#xff1b;参数J表示产生Joliet ( name of an extension to the ISO 9660 file system) , 制作与windows兼容的盘。2. 查看设备&#…

UOJ#196. 【ZJOI2016】线段树 概率期望,动态规划

原文链接www.cnblogs.com/zhouzhendong/p/UOJ196.html 题解 先离散化&#xff0c;设离散化后的值域为 $[0,m]$ 。 首先把问题转化一下&#xff0c;变成&#xff1a;对于每一个位置 $i$ &#xff0c;求出它最终不超过 $j$ 的方案数。 考虑如何求这个东西。 对于一个固定的 $j$ &…

又论社区风气, 与程序员是干嘛地的.

为了避免误解, 重新声明一下, 本文纯粹针对"博客园风气如何如何, 博客园的话题如何如何"这些说法, 不含有任何不用基础学习或者必须学习某一方面/最好广泛学习或者必须深钻一门等倾向, 如果有的话说的有偏向性, 请当作一时表达不清. "我可以不同意你的观点, 但我…

在手机上如何用c语言编译器编程,如何用手机进行编程?

这里介绍3种可以在手机上编程的app&#xff0c;分别是c语言编译器(c语言)、AIDE集成开发环境(java)、QPython3(python)&#xff0c;都不需要root&#xff0c;可以直接编写程序并运行&#xff0c;下面我简单介绍一下这3个app的安装和简单使用&#xff0c;主要内容如下&#xff1…

SDOI2014 旅行

传送门 省选前水一发 这题一开始看标签是主席树……后来……这题和主席树有啥关系…… 可以想到对于每种宗教用树剖线段树维护即可。然后因为空间不够要动态开点。然后改宗教&#xff0c;改评级的&#xff0c;把原来的点删了再插一个新点就可以了。查询最大值&#xff0c;和就直…

API函数的调用(包含一个大小写的问题)

遇到问题&#xff1a; 今天做的一个程序要调用AnimateWindow()函数来实现窗口的动画效果&#xff0c;参考书上在类的成员函数中直接调用该函数&#xff0c;没有做任何处理。然而实验时发现编译通不过。 解决过程&#xff1a; 查看MSDN后,发现AnimateWindow()函数说明中…

第一个openGL程序

一、工具的安装 因为要写C程序&#xff0c;为了便捷&#xff0c;这里我安装的Visual Studio&#xff1b; 免费使用90天&#xff01;安装好了之后&#xff0c;我们要为我们的开发安装相应的工具集&#xff1b; 因为我是要在windows上跑的&#xff0c;所以选择如下两个包&#xf…

[转]leo谈“80后”程序员为什么找不到工作?(1)

(应it168约稿写了关于“80后”程序员求职难的文章&#xff0c;我将分三次放在博客上&#xff0c;之后会引用网上的部分批评文章。) 80后的定义应该是&#xff1a;22至27岁之间、受过高等教育、刚刚毕业走向社会或者拥有几年工作经验年轻一代。不可否认&#xff0c;80后已成为职…

c语言斜杠表示除法,[转载]C语言中反斜杠的使用

问题1&#xff1a;#define f(z)(z<2)?(((2-z)*(2-z))*((2-z)*(2-z)))*(((2-z)*(2-z))*((2-z)*(2-z)))/560:0;上面这个*什么意思问题2&#xff1a;一语句printf("a%.2fn,b%.2fn,c%.2fn,d%.2fn,e%.2fn",a,b,c,d,e);不提示错误。换成printf("a%.2fn,b%.2fn,c%.…

SJJG习题一

动态 链 表 的 建 立 1&#xff0e; 修改以下程序&#xff0c;尽可能减少临时空间的占用。即&#xff1a;先判断输入数据的合法性&#xff0c;再为其分配空间。 2&#xff0e; 修改以下程序&#xff0c;把尾插法建立链表改为头插法建立链表…