您的位置:首页 > 运维架构 > Linux

Linux内核分析课程--使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

2017-03-19 16:20 387 查看
齐昱博 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

一、课上知识点

1、CPU执行级别对应着用户态和内核态

2、在高执行级别下,代码可执行特权指令,任意的物理地址,这种CPU执行级别对应内核态

3、CPU执行为什么要分级?要使系统安全稳定运行

4、Linux只用了0级-内核态和3级-用户态

5、如何区分当前的执行级别?(1)cs寄存器最低两位表明当前代码的特权级(2)CPU每条指令的读取都通过cs:eip寄存器(3)能访问的地址空间(逻辑地址)不同,0xc0000000以上的地址空间只能在内核态下访问,0x00000000-0xbfffffff可在两种状态下访问

6、中断处理是从用户态进入内核态的主要方式

7、中断之后发生的第一件事就是保护现场,要保存用户态的栈顶地址,用户态的状态字,用户态的cs:eip

8、操作系统为用户态进程与硬件设备进行交互提供了一组接口--系统调用

9、系统调用的优点:(1)把用户从底层硬件编程中解放(2)提高系统安全性(3)用户程序具有可移植性

10、API(应用编程接口)和系统调用是有区别的

11、系统调用三层皮:API xyz,中断向量system_call,中断服务程序sys_xyz

12、系统调用号将xyz和sys_xyz关联起来,系统调用号用eax寄存器存储

13、在系统调用中,除了系统调用号存储在eax寄存器中外,寄存器传参是有限制的,参数的个数不超6个(ebx,ecx,edx,esi,edi,ebp),若超过6个则将其中一个作为指针,指向某块内存,在这块内存中存储参数

14、system_call是linux所有系统调用的入口

二、本次实验

本次实验的实验环境在老师提供的实验楼中进行,本次实验需要用到之前课上讲到过的知识(在C代码中嵌入汇编代码),具体的系统调用号参见:http://codelab.shiyanlou.com/xref/linux-3.18.6/arch/x86/syscalls/syscall_32.tbl

本次实验使用系统调用号为2的fork函数,fork函数的作用为通过系统调用创建一个与原来进程几乎完全相同的进程。

fork函数的源代码fork.c:


执行结果:


嵌入汇编代码fork_asm.c:


执行结果:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐