Chapter2-部分二刷-个人理解System call
目录
二刷部分Chapter2 $\Longrightarrow$ 如何理解System call
问题:构造最小的”Hello world”程序
基本程序和静态编译
|
|
|
|
编译出来很大(Ubuntu上约900KB)
- 如果只编译,不链接,看一下obj文件的反汇编
|
|
- 就和普通的函数差不多,只有参数压栈,call和参数出栈的过程
- 普通函数
fun.c
- 普通函数
|
|
|
|
-
可以看到不链接的话和普通的函数调用过程差不多
-
链接失败!
|
|
- 本来以为找的
main,但是它实际上在找_start这个东西?
那我们就把main改成_start
|
|
ld仍然不予通过-> 找不到printf?- 那把printf也给去了
|
|
- 编译与链接全部成功!
|
|
-
程序很小,只有99个字节
-
但是运行 $\Longrightarrow$ 段错误!
-
但是里面加入while(1)这种死循环就没事了
- 对于没有while(1)的a.out,使用gdb狠狠的拷打调试
这个时候我们看到rsp的地址是合法的,里面的值是1,当执行ret后,rsp将栈顶的值1赋给了pc,gdb显示pc访问了非法位置
- CPU只会执行指令,该怎么停下来?(mov,add这些指令停不下来)
- 需要什么指令让它停下来? $\Longrightarrow$
System call也就是管态
最小的Hello world程序
|
|
- 它在干什么
- 给许多寄存器赋值,然后call了syscall
- ld链接,编译成功,运行成功!
|
|
man syscall查看syscall的文档我们会发现,syscall会告诉我们在各种架构的计算机中该如何通过寄存器为syscall传入参数,man syscalls会告诉我们Linux操作系统的接口
- 所以程序的执行模式
感谢
感谢jyy互助群里zweix大佬提供的 jyyslide-md
使用过程中发现因为Windows很烂的编码问题始终会出现gbk解码错误的error,和zweix大佬差不多沟通了大半个下午,由于懒得给vscode配环境直接改成手动print看数据🤣,感觉就是命令行传参编码的问题,最后终于找到了解决方法😆,只能说Windows这个编码设置也是没谁了。