• 忘掉天地
  • 仿佛也想不起自己
bingliaolongBingliaolong  2023-08-06 21:27 Aet 隐藏边栏 |   抢沙发  7 
文章评分 2 次,平均分 5.0

数据部分

  1. 数据部分用于声明常量。
  2. 该数据在运行时不会改变。

代码部分

  1. 文本部分用于代码。
  2. 该部分必须以声明 global _start 开始,它告诉内核程序执行的开始位置。

注释

hello,world

  1. 前面两行定义了数据,并在其中放置了具有hello, world值的msg常量
  2. 程序从_start下面开始执行、
  3. mov获取两个操作数,并将第二个操作数放在第一个操作数中
    1. raxrdi是寄存器,是cpu内部的存储器
    2. cpu内部设计存储器而不是使用内存,是因为从内存读取数据和将数据存储到内存会减慢cpu的速度,因为这些操作涉及通过控制总线发送数据请求的过程
  4. rax,当我们调用syscall时,rax必须包含系统调用号
    1. rdi,第一个参数
    2. rsi第二个参数
    3. rdx第三个参数

系统调用表

  1. 系统调用表是操作系统内核中的一个数据结构,存储了操作系统提供的各种系统调用的入口地址
  2. 系统调用是用户程序与操作系统之间进行交互的一种机制,用户程序可以通过调用系统调用来请求操作系统提供特定的功能和服务,如文件操作、内存管理、进程管理等
  3. 在汇编语言中,系统调用表通常是一个数组或类似的数据结构,每个元素对应一个系统调用,并存储了相应的系统调用号(或索引)以及对应的入口地址(函数指针)
  4. 系统调用表的内容和结构会因不同的操作系统而异
    1. 在Linux操作系统中,系统调用表位于内核的一个特定区域,它包含了许多系统调用的入口地址。
    2. 用户程序通过调用软中断(int 0x80syscall指令)来触发系统调用,然后内核根据传入的系统调用号在系统调用表中查找相应的入口地址
  5. x86_64架构上,不同的操作系统会有不同的系统调用号和函数表
    1. Windows x86_64体系结构上,系统调用号不是直接暴露给用户程序的,而是通过一组函数来实现。这些函数被称为"Windows API"函数,用户程序通过调用这些函数来实现各种系统功能
    2. Linux x86_64体系结构上,系统调用号是用户程序直接使用的,每个系统调用号都对应于内核中的一个函数。

Windows系统调用表

  1. j00ru.vexillium.org
  2. j00ru-github

Linux系统调用表

  1. arch/x86/entry/syscalls/syscall_64.tbl
  2. arch/x86/entry/syscalls/syscall_32.tbl

Windows函数记录

Linux函数记录

sys_write

  1. 在系统调用表中排1,所以是mov rax,1
  2. 参数1:文件描述符
    1. 标准输入:0
    2. 标准输出:1
    3. 标准错误:2
  3. 参数2:指向一个字符数组,可以用来存储从参数1指向的文件中获取的内容
  4. 参数3:指定要从文件写入字符数组的字节数

退出系统调用

  1. 60

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

bingliaolong
Bingliaolong 关注:0    粉丝:0
Everything will be better.

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享