Linux内核分析(四)
开始
用两种方式实现使用同一个系统调用:
- 库函数API
- C代码中内嵌汇编
本实验目的是为了熟悉Linux系统调用的相关知识,以及熟悉Linux和嵌入式汇编的写法。
实验内容
选择一个系统调用,列表见这里,我们选择write系统调用。
用C写一个文件test.c,代码如下:
1 |
|
这里,write函数有三个参数,第一个表示写到终端屏幕上,1可以认为是屏幕的代号,第二个参数是写的内容,第三个参数是写入字符串的长度。
运行结果如下图所示:
然后需要把这段代码转化为嵌入式汇编的格式,嵌入式汇编的格式如下:
在test_asm.c中,代码如下:
1 |
|
执行结果如下所示:
这里代码:
1 | "movl %1,%%ecxnt"//ecx存储输出位置 |
中的%1,表示传递的第一个参数,它和后面的输入:
1 | :"c"(ch)//输入 |
是相呼应的,c表示ecx,表示把字符串a存入ecx中。
而其他的代码:
1 | "movl $0x1,%%ebxnt"//ebx传递参数 |
$0x1表示把立即数1存入ebx中,也是作为参数的。按照顺序传递参数。
总结
系统调用的三个层次如下所示:
分别为:xyz函数(API)、system call(中断向量)和 sys xyz(中断服务程序)。
当用户进程需要发生系统调用时,CPU 通过软中断切换到内核态开始执行内核系统调用函数。Linux 下有三种发生系统调用的方法:
- 通过 glibc 提供的库函数
- 使用 syscall 函数直接调用
- 通过 int 0x80指令陷入
总的来说,前两种最终都会通过int 0x80指令陷入进入中断处理程序。而系统调用也需要输入输出参数,例如实际的值,用户态进程地址空间的变量的地址,甚至是包含指向用户态函数的指针的数据结构的地址等。
system_call是linux中所有系统调用的入口点,每个系统调用至少有一个参数,即由eax传递的系统调用号,其他参数依次由ebx,ecx,edx,esi,edi,ebp传入。
寄存器传递参数具有如下限制:
- 每个参数的长度不能超过寄存器的长度,即32位
- 在系统调用号(eax)之外,参数的个数不能超过6个(ebx,ecx,edx,esi,edi,ebp)
【版权声明】
本文首发于戚名钰的博客,欢迎转载,但是必须保留本文的署名戚名钰(包含链接)。如您有任何商业合作或者授权方面的协商,请给我留言:qimingyu.security@foxmail.com
欢迎关注我的微信公众号:科技锐新
本文永久链接:http://qimingyu.github.io/2016/04/08/Linux内核分析(四)/
原文:大专栏 Linux内核分析(四)
原文地址:https://www.cnblogs.com/petewell/p/11585206.html
- DedeCMS全版本通杀SQL注入漏洞利用代码及工具
- Android实现滑动刻度尺效果,选择身高体重和生日
- 浅谈开源web程序后台的安全性
- Web漏洞演练平台 – ZVulDrill
- Android内存泄漏终极解决篇(上)
- 走近科学:我是如何入侵Instagram查看你的私人片片的
- 在线手写识别的多卷积神经网络方法
- 苹果发布OS X 10.9.2更新,修复SSL漏洞
- Android内存泄漏终极解决篇(下)
- 利用Volatility查找系统中的恶意DLL
- 雪人行动:利用IE10 0day漏洞的APT攻击剑指美国军方情报
- Android开发:最详细的 Toolbar 开发实践总结
- 关于yubikey对web应用的杞人之忧
- 利用旧版Android漏洞的E-Z-2-Use攻击代码已在Metasploit发布
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法