- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在 OS X(32 位)上执行系统调用,如下所示:
push 123
mov eax, 1
sub esp, 4
int 0x80
而且我不太明白 sub esp, 4
间隙。
我在某处读到,BSD 及其衍生产品总是存在这种差距,但找不到原因的解释。
我的第一个想法是堆栈对齐,但事实并非如此,因为该行随处可见,而且据我所知,OS X 需要 16 字节堆栈对齐(这里也不是这种情况) 。
您知道执行 sub esp, 4
的必要性背后隐藏着什么吗?或者可以向我指出正确描述它的资源吗?
最佳答案
(社区维基,因为我只是总结评论)
BSD 这样做是为了使系统调用的 libc 包装函数更加高效,因为它们可以只执行 int 0x80
而无需复制参数。它为 CALL 推送到包装函数的返回地址留出了空间。
在 Unix/Linux 系统中,像 read(2)
这样的系统调用实际上是围绕内核调用的库包装函数,而不是扩展为 inline-asm 的宏,这是标准。
Linux 以不同的方式解决了这个问题:通过在寄存器中传递所有系统调用参数。我猜这意味着 32 位包装器函数必须从堆栈加载所有参数,但至少它们不必由内核存储和重新读取。
x86-64 系统调用 ABI 与函数调用约定更加兼容:只需要一个 mov r10, rcx
,因为 System V 函数调用约定在寄存器中传递参数(并且系统调用寄存器被选择为尽可能匹配,除了 the SYSCALL instruction itself destroys RCX and R11, so the kernel can't see the original values 。)
请参阅x86 tag wiki 了解有关调用约定实际是什么的更多信息,以及 ABI 的链接。
关于assembly - 为什么BSD系统在执行系统调用时需要sub esp,4?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40351702/
几个线程可以在同一个套接字描述符(即accept(sock_fd))上同时操作而无需担心吗? 我最感兴趣的平台是POSIX/Linux。 最佳答案 是的,它们是“可重入的”-内核在处理套接字结构时会锁
具有 '__P' 的 socket.h BSP header 为 int bind __P((int, const struct sockaddr *, socklen_t)) 你能告诉我这里的“__
我有一个服务器: ./server portNumber 我有一个客户: ./client serverIpAddress 我在客户端只有服务器IP地址。我想连接到服务器套接字。但是每次 Server
我在网上找到的所有教程和示例总是指定一个端口号,如 7000 或 4950 等。如果这些端口在一台计算机上打开,但在另一台计算机上打开怎么办?似乎那种情况使这样做成为一个坏主意。有没有办法说“查找并使
我的代码是: int main(int argc, char *argv[]) { int sockfd, new_fd; /* listen on sock_fd, new connect
我知道 Hardened Linux from Scratch project 这是一个为您提供分步说明的项目,用于完全从源代码构建您自己的定制和强化的 Linux 系统。我想知道 BSD 中的等价物
我一直在用 C 编写一些套接字代码。我需要修改数据包 header 并控制它们的发送方式,所以我采用了原始套接字方法。但是,我写的代码无法在 BSD 系统(Mac OS X/Darwin、FreeBS
我想测试BSP API实现的正确性和完整性。 测试集必须针对ARM sam7x进行交叉编译。 最佳答案 我不知道您是否会感兴趣,但是这里有指向纽约BSD session 2008的演讲的两个链接:De
如标题所述,BSD插槽的双工是什么? -并且在同一个 socket 上。 最佳答案 如果阅读socket(2)手册页,您将看到SOCK_STREAM类型的套接字是全双工的。与Windows相同,请参见
当我尝试将数据从我的 tcp 服务器发送到我的 tcp 客户端时,我不断收到“错误的文件描述符”错误。这在套接字方面意味着什么?我在这方面已经有一段时间了,我看不出我的代码有什么问题。它与我两天前使用
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 6年前关闭。 Improve thi
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 7 年前。 Improve
我在尝试将 BSD 客户端套接字连接到服务器时遇到一些问题。套接字的创建和连接是通过JNI 实现的。实际的连接是通过java代码建立的。 JNI部分: #include #include #inc
我想使用 BSD API 创建一个伪终端。我的理解是,Unix 98 API 将自动使用 posix_openpt() 查找空闲端口,但使用 BSD API 我需要检查/查找要连接的空闲端口。这是正确
我正在尝试熟悉网络 BSD API。我了解提交给 BSD API 的多字节数据(如地址和端口)必须采用网络字节顺序,并且我们应该使用 htons() 和 htonl() 等转换函数来执行此操作。这段代
我有这个命令字符串,它在 OS X 10.6.8 (Snow Leopard) 中运行良好(它告诉我它的 grep 是 grep (GNU grep) 2.5.1)... $ grep -hi 'TE
我遇到了一个有趣的问题。我的系统是华硕笔记本电脑上的 Arch Linux(最新)。现在,真正奇怪的问题是: finger 不会随 Arch 自动安装。我试图使用 pacman 来安装它,但它不在存储
因此,我尝试使用 strcmp 将缓冲区与字符串进行比较。我希望服务器在客户端说"man" 时以特殊方式响应,否则只需回复 got it。我看不出我做错了什么,但即使我从客户端输入 man,我的输
我想参与数据包转发(不是路由)。例如,系统是主机与其网关之间的第 2 层网桥。我想检查第 7 层的字符串或任何“foo”并根据结果转发/丢弃/延迟数据包。我遇到的问题是拦截数据包。 目前我读到的内容:
我想在 BSD 网络堆栈中添加一些我自己的 printf 语句。但是在添加它们之后,我看不到机器控制台上出现的消息。我试图在 netisr ( sys/net/netisr.c ) 中添加一些。甚至找
我是一名优秀的程序员,十分优秀!