Linux通过0x80进行系统调用
2008-09-06 20:59
309 查看
系统调用[/b]:操作系统分为用户态和核心态,当用户调用用户态函数的时候,需要进行用户态到核心态的切换,CPU需要对现场进行保存。如果用户直接调用系统调用,就不需要进行二态切换,提高代码运行效率。并且编译链接后生成的可执行的ELF体积小,运行效率高。用户可以通过系统提供的C语言API进行系统调用,同时也可以通过0x80中断进行调用。下面介绍通过中断进行调用的方法。
参数传递[/b]:功能号和返回值通过%eax来传递,参数一般在5个以下的通过寄存器%ebx,%ecx.%edx,%esi,%edi来传递,如果参数个数大于5个,则要通过堆栈来传递,按照c语言的参数传递方式,最后一个参数最先进栈。同时,把%esp传递给%ebx。
Linux[/b]系统调用个数[/b]:319个。
例子:
.data
filename:.fill 256
filecontent:.string "Hello World!"
len:.int 12
fd:.int -1
.text
.global _start
_start:
movl $3 , %eax #系统调用read,从标准输入读入文件名
movl $0 , %ebx
movl $filename , %ecx
movl $1024 , %edx
int $0x80
movl $filename , %ebx #将文件名保存
movl %eax , %ecx
xorb %al , %al
movl $filename , %ebx
movb %al , -1(%ebx , %ecx)
movl $5 , %eax #调用系统调用open创建文件
movl $filename , %ebx
xorl %ecx , %ecx
orl $20 , %ecx
orl $100 , %ecx
orl $10 , %ecx
movl $0x0080, %edx
int $0x80
movl $fd , %ebx #将文件描述符保存
movl %eax , (%ebx)
movl $4 , %eax #调用系统调用write,向文件中写字符串
movl $fd , %ebx
movl (%ebx) , %ebx
movl $filecontent , %ecx
movl $len , %edx
movl (%edx) , %edx
int $0x80
movl $6, %eax #调用系统调用close,关闭文件
movl $fd , %ebx
movl (%ebx) , %ebx
int $0x80
movl $1 , %eax
movl $0 , %ebx
int $0x80
参数传递[/b]:功能号和返回值通过%eax来传递,参数一般在5个以下的通过寄存器%ebx,%ecx.%edx,%esi,%edi来传递,如果参数个数大于5个,则要通过堆栈来传递,按照c语言的参数传递方式,最后一个参数最先进栈。同时,把%esp传递给%ebx。
Linux[/b]系统调用个数[/b]:319个。
例子:
.data
filename:.fill 256
filecontent:.string "Hello World!"
len:.int 12
fd:.int -1
.text
.global _start
_start:
movl $3 , %eax #系统调用read,从标准输入读入文件名
movl $0 , %ebx
movl $filename , %ecx
movl $1024 , %edx
int $0x80
movl $filename , %ebx #将文件名保存
movl %eax , %ecx
xorb %al , %al
movl $filename , %ebx
movb %al , -1(%ebx , %ecx)
movl $5 , %eax #调用系统调用open创建文件
movl $filename , %ebx
xorl %ecx , %ecx
orl $20 , %ecx
orl $100 , %ecx
orl $10 , %ecx
movl $0x0080, %edx
int $0x80
movl $fd , %ebx #将文件描述符保存
movl %eax , (%ebx)
movl $4 , %eax #调用系统调用write,向文件中写字符串
movl $fd , %ebx
movl (%ebx) , %ebx
movl $filecontent , %ecx
movl $len , %edx
movl (%edx) , %edx
int $0x80
movl $6, %eax #调用系统调用close,关闭文件
movl $fd , %ebx
movl (%ebx) , %ebx
int $0x80
movl $1 , %eax
movl $0 , %ebx
int $0x80
相关文章推荐
- Linux下通过系统调用(API)和C语言库函数对文件进行访问
- linux中直接进行系统调用和通过C库调用的示例
- Linux下通过系统调用(API)和C语言库函数对文件进行访问
- Linux下通过系统调用(API)和C语言库函数对文件进行访问
- Linux下通过系统调用(API)和C语言库函数对文件进行访问
- linux下C通过系统调用进行基本IO操作
- Linux下通过系统调用(API)和C语言库函数对文件进行访问
- Linux下通过系统调用(API)和C语言库函数对文件进行访问
- 通过javascript调用Applet程序对客户端文件系统进行操作
- 增加Linux系统调用——通过增加内核模块
- pb调用saveasascii导出系统后通过ole对excel进行格式设置无效处理办法
- 通过系统调用学习linux
- Linux系统调用 int 80h int 0x80
- u盘安装Linux系统(Linux镜像通过U盘进行安装)的步骤
- Android TV 添加系统服务,通过Binder机制从APK对其进行跨进程远程调用
- 在进行嵌入式开发之前,首先要建立一个交叉编译环境,这是一套编译器、连接器和libc库等组成的开发环境。文章通过一个具体的例子说明了这些嵌入式交叉编译开发工具的制作过程。 随着消费类电子产品的大量开发和应用和Linux操作系统的不断健壮和强大,嵌入式系统越来
- Linux操作系统下,通过系统调用和库函数分别实现对文件的拷贝
- Linux下C编程-----文件操作(1) 通过系统调用简单操作标准输入、标准输出、标准错误
- 《第一篇 linux 0.12 系统调用(int 0x80)详解》
- QT在linux环境下读取和设置系统时间(通过system来直接调用Linux命令,注意权限问题)