2019-2020-1 20199304《Linux内核原理与分析》第五周作业
第五周学习——运用库函数与系统调用
-
问题描述:
- 经过上一周的学习,我们进一步学习了计算机操作系统的核心工作机制,构造了一个简单的Linux系统MenuOS,分析运行了这个简单的OS并进行一定的分析,利用了GDB简单分析Start_kernel
-
本周学习:
- 本周,我们将学习使用系统的库函数
- 并在此基础上,学会使用系统调用。
一、使用库函数显示系统时间
注意使用VMware安装的虚拟机时应当设置好自己的系统时区以及自动同步时间和时区,否则将会在一头雾水下进行试验。
首先需要敲入代码
-
main.c代码:
#include<stdio.h> #include<time.h> int main() { time_t tt; struct tm *t; time(&tt); t=localtime(&tt); printf("time:%s",asctime(t)); return 0; }
-
对于这个系统调用需要明白所用结构体struct tm的具体内容:
struct tm { int tm_sec; /* 秒,范围从 0 到 59 */ int tm_min; /* 分,范围从 0 到 59 */ int tm_hour; /* 小时,范围从 0 到 23 */ int tm_mday; /* 一月中的第几天,范围从 1 到 31 */ int tm_mon; /* 月份,范围从 0 到 11 */ int tm_year; /* 自 1900 起的年数 */ int tm_wday; /* 一周中的第几天,范围从 0 到 6 */ int tm_yday; /* 一年中的第几天,范围从 0 到 365 */ int tm_isdst; /* 夏令时 */ };
-
关于asctime()函数的使用:
该函数返回一个 C 字符串,包含了可读格式的日期和时间信息 Www Mmm dd hh:mm:ss yyyy,其中,Www 表示星期几,Mmm 是以字母表示的月份,dd 表示一月中的第几天,hh:mm:ss 表示时间,yyyy 表示年份。
printf("time:%s",asctime(t));
反汇编后嵌入C函数
- 关于int $0x80的解释:
int $0x80是一条AT&T语法的中断指令,表示执行80中断,用于Linux的系统调用。
Linux系统下的汇编语言比较喜欢用AT&T的语法,如果翻译成Intel的语法那就是:int 80h
就像我们在Intel的语法下的DOS汇编中经常用int 21h调用DOS中断,同样如果,换成AT&T的语法就是int $0x80。
不过无论那一种语法,int $0x80或者int 80h都是针对Linux的,在DOS或者Windows下都是起不到相应功能的。同理 int 21h或int $0x21也是都只能在DOS或者一些Windows下起作用,无法在Linux下起作用的。
关于系统调用
linux内核中设置了一组用于实现系统功能的子程序,称为系统调用。系统调用和普通库函数调用非常相似,只是系统调用由操作系统核心提供,运行于内核态,而普通的函数调用由函数库或用户自己提供,运行于用户态。
计算机系统的各种硬件资源是有限的,在现代多任务操作系统上同时运行的多个进程都需要访问这些资源,为了更好的管理这些资源进程是不允许直接操作的,所有对这些资源的访问都必须有操作系统控制。也就是说操作系统是使用这些资源的唯一入口,而这个入口就是操作系统提供的系统调用