标签:
张忻(原创作品转载请注明出处)
《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
一、知识概要
(一)用户态、内核态和中断处理过程
(二)系统调用概述
系统调用概述和系统调用的三层皮
(三)使用库函数API和C代码中嵌入汇编代码触发同一个系统调用
使用库函数API获取系统当前时间
C代码中嵌入汇编代码的方法(复习)
使用C代码中嵌入汇编代码触发系统调用获取系统当前时间
二、学习笔记
(一)用户态、内核态和中断处理过程
中断处理是是从用户态进入内核态的主要方式。
系统调用只是一种特殊的中断。
中断发生后的第一件事就是保存现场,结束前最后一件事是恢复现场。
中断处理的完整过程
(二)系统调用概述
系统调用概述和系统调用的三层皮
1.系统调用的意义
操作系统为用户态进程与硬件设备进行交互提供了一组接口——系统调用
2.API和系统调用
应用编程接口(application program interface, API) 和系统调用是不同的
Libc库定义的一些API引用了封装例程 (wrapper routine,唯一目的就是发布系统调用)
不是每个API都对应一个特定的系统调用。
返回值
3.应用程序、封装例程、系统调用处理程序及系统调用服务例程之间的关系
系统调用的三层皮:xyz、system_call和sys_xyz
(1)系统调用程序及服务例程
当用户态进程调用一个系统调用时,CPU切换到内核态并开始执行一个内核函数。
传参:
(2)参数传递
系统调用也需要输入输出参数,例如
system_call是linux中所有系统调用的入口点,每个系统调用至少有一个参数 ,即由eax传递的系统调用号
(三)使用库函数API和C代码中嵌入汇编代码触发同一个系统调用
1.使用库函数API获取系统当前时间
2.C代码中嵌入汇编代码的方法(复习)
3.使用C代码中嵌入汇编代码触发系统调用获取系统当前时间
三、作业
1.实验过程
分析汇编代码调用系统调用的工作过程,特别是参数的传递的方式等。
(1)通过库函数chomd函数改变文件的权限为只读
代码如下:
#include <sys/types.h> #include <sys/stat.h> #include <errno.h> #include <stdio.h> int main() { int rc; rc = chmod("/etc/passwd", 0444); if (rc == -1) fprintf(stderr, "chmod failed, errno = %d\n", errno); else printf("chmod success!\n"); return 0; }
在普通用户下编译运用,输出结果为:
上面系统调用返回的值为-1,说明系统调用失败,错误码为1,
即无权限进行该操作,我们以普通用户权限是无法修改 /etc/passwd 文件的属性的,结果正确。
(2)使用C代码中嵌入汇编代码触发系统调用改变文件的权限为只读
代码如下:
#include <stdio.h> #include <sys/types.h> #include <sys/syscall.h> #include <errno.h> int main() { long rc; char *file_name = "/etc/passwd"; unsigned short mode = 0444; asm( "int $0x80" : "=a" (rc) : "0" (SYS_chmod), "b" ((long)file_name), "c" ((long)mode) ); if ((unsigned long)rc >= (unsigned long)-132) { errno = -rc; rc = -1; } if (rc == -1) fprintf(stderr, "chmode failed, errno = %d\n", errno); else printf("success!\n"); return 0; }
如果 eax 寄存器存放的返回值(存放在变量 rc 中)在 -1~-132 之间,就必须要解释为出错码(在/usr/include/asm-generic/errno.h
文件中定义的最大出错码为 132),这时,将错误码写入 errno 中,置系统调用返回值为 -1;否则返回的是 eax 中的值。
结果如图:
上面程序在 32位Linux下以普通用户权限编译运行结果与前面两个相同。
2.总结
对“系统调用的工作机制”的理解。
可以通过库函数API使用系统调用或者用汇编方式触发系统调用。
参考资料:http://www.linuxidc.com/Linux/2014-12/110238.htm
LINUX内核分析第四周学习总结——扒开应用系统的三层皮(上)
标签:
原文地址:http://www.cnblogs.com/lalacindy/p/5276874.html