2020-2021-1 20209311《Linux内核原理与分析》第五周作业
2020-2021-1 20209311《Linux内核原理与分析》第五周作业
一、云班课实验 内核编译与系统调用
过程跟结果就不放了,就说说实验过程中遇到的错误:
- 1.使用
sudo make oldconfig
设置配置文件时报错:
解决方法:sudo apt-get install bison
和sudo apt-get install flex
- 2.64位系统调用表与32位不同,64位的系统调用表地址是arch/x86/entry/syscalls/syscall_64.tbl
- 3.编译模块时,出现错误:"arch/x86/entry/syscall_64.o:(.rodata+0x1120):对‘sys_dby’未定义的引用"
解决方法:编写的函数名称前加上__x64_
二、实验四 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
1.实验过程
查看系统调用号:
选择20号系统调用getpid,其C语言与汇编代码实现如下:
#include<stdio.h>
#include<unistd.h>
int main()
{
int pid;
pid=getpid();
printf("the pid is %d",pid);
return 0;
}
#include<stdio.h>
#include<unistd.h>
int main()
{
int pid;
asm volatile(
"mov $0x14,%%eax\n\t"
"int $0x80\n\t"
"mov %%eax,%0\n\t"
:"=m"(pid));
printf("the pid is %d\n",pid);
return 0;
}
2.实验分析
汇编代码细化了调用过程,getpid函数没有参数,首先将对应的系统调用号传入到ax寄存器中,int指令使系统内陷,执行相应的系统调用,最后返回值存入ax寄存器中,将ax中的返回值取出放入变量pid,打印输出。
三、Linux知识学习
1.用户态、内核态和中断
内核态与用户态的区别在于权限不同,内核态权限更高,可以访问更多的地址空间。
中断处理是用户态进入内核态的主要方式,系统调用是中断的一种。中断会带来从用户态到内核态的寄存器上下文切换问题,当用户态切换到内核态时,就要把用户态的上下文保存起来,同时把内核态的寄存器的值放入到当前CPU中。中断处理的第一件事和最后一件事分别为保存现场和恢复现场。
2.系统调用
系统调用的意义是操作系统为用户态进程与硬件设备进行交互提供了一组接口。系统调用具有以下功能和特性:
- 把用户从底层的硬件编程中解放出来。操作系统为我们管理硬件,用户态进程不用直接与硬件设备打交道。
- 极大的提高了系统的安全性。如果用户态进程直接与硬件设备打交道,会产生安全隐患,可能引起系统崩溃。
- 使用户程序具有可移植性。用户系统与具体的硬件已经解耦合并用接口代替了,不会有紧密的关系,便于在不同的系统间移植。