2019-2020-1 20199313《Linux内核原理与分析》第八周作业 第八周学习——“进程的描述与进程的创建” 一、首先,阐述继续发现的问题 二、动态链接 三、exceve函数族 四、exec尝试

  • 问题描述:

    • 经过上一阶段的学习,我们逐渐了解了计算机操作系统的核心工作机制,构造了一个简单的Linux系统MenuOS,利用了GDB简单分析Start_kernel,我们还学习了使用系统的库函数,并在此基础上,学会了使用系统调用,使用gdb调试系统调用,并观察并观察fork函数是如何工作的函数是如何工作的
  • 本周学习:

    • 本周在上周学习的基础上继续使用使用gdb调试系统调用,调试断点,分析系统调用运行过程。
    • 本周将学习使用不同方式的动态链接

一、首先,阐述继续发现的问题

对于pc上的uabntu的make rootfs失败问题的研究

2019-2020-1 20199313《Linux内核原理与分析》第八周作业
第八周学习——“进程的描述与进程的创建”
一、首先,阐述继续发现的问题
二、动态链接
三、exceve函数族
四、exec尝试

问题:ubantu系统提示我们需要一个x86的cpu而目前系统检测到的cpu是32位的,故而无法运行这个bzImage内核镜像文件

分析出现问题的原因:需要让系统监测到一个64位的cpu。

  • 恰巧问题出现在:1、电脑的操作系统是64位的。2、安装的ubantu 的操作系统是64位的。3、一般cpu和主板默认是开启cpu虚拟硬件的,且VMware 关于本虚拟机的虚拟硬件是允许开启的。

  • 那么究竟是神舟电脑的主板比较特殊?还是linux内部系统设置不正确呢?我将会对这一问题进行持续探索。

二、动态链接

  • 根据定义:
    动态链接,在可执行文件装载时或运行时,由操作系统的装载程序加载库。大多数操作系统将解析外部引用(比如库)作为加载过程的一部分。在这些系统上,可执行文件包含一个叫做import directory的表,该表的每一项包含一个库的名字。根据表中记录的名字,装载程序在硬盘上搜索需要的库,然后将其加载到内存中预先不确定的位置,之后根据加载库后确定的库的地址更新可执行程序。可执行程序根据更新后的库信息调用库中的函数或引用库中的数据。这种类型的动态加载成为装载时加载 ,被包括Windows和Linux的大多数系统采用。

  • 可执行文件
    (ELF)
    可执行和可链接格式 (Executable and Linkable Format,缩写为ELF),常被称为ELF格式,在计算机科学中,是一种用于执行档、目的档、共享库和核心转储的标准文件格式。

  • 静态链接:
    根据定义:静态链接是由链接器在链接时将库的内容加入到可执行程序中的做法。链接器是一个独立程序,将一个或多个库或目标文件(先前由编译器或汇编器生成)链接到一块生成可执行程序。静态链接的最大缺点是生成的可执行文件太大,需要更多的系统资源,在装入内存时也会消耗更多的时间。

三、exceve函数族

xecve(参数1,参数2,参数3)
参数1:命令所在路径
参数2:命令的集合
参数3:传递给执行文件的环境变量集


int exec…装入和运行其它程序:
int execl( char *pathname,char *arg0,char *arg1,...,char *argn,NULL)
int execle( char *pathname,char *arg0,char *arg1,...,char *argn,NULL,char *envp[])
int execlp( char *pathname,char *arg0,char *arg1,...,NULL)
int execlpe(char *pathname,char *arg0,char *arg1,...,NULL,char *envp[])
int execv( char *pathname,char *argv[])
int execve( char *pathname,char *argv[],char *envp[])
int execvp( char *pathname,char *argv[])
int execvpe(char *pathname,char *argv[],char envp[])
exec函数族装入并运行程序pathname,并将参数
arg0(arg1,arg2,argv[],envp[])传递给子程序,出错返回-1
在exec函数族中,后缀l、v、p、e添加到exec后,
所指定的函数将具有某种操作能力
有后缀 p时,函数可以利用DOS的PATH变量查找子程序文件。
假如你希望执行命令 /bin/cat /etc/passwd /etc/group,
l时,希望接收以逗号分隔的参数列表,列表以NULL指针作为结束标志
execl( "/bin/cat","/etc/passed","/etc/group",NULL);
v时,希望接收到一个以NULL结尾的字符串数组的指针
char
argv[] = {"/bin/cat","/etc/passed","/etc/group",NULL}
execv( "/bin/cat", argv );
e时,函数传递指定参数envp,允许改变子进程的环境,无后缀e时,子进程使用当前程序的环境。
envp也是一个以NULL结尾的字符串数组指针


四、exec尝试

2019-2020-1 20199313《Linux内核原理与分析》第八周作业
第八周学习——“进程的描述与进程的创建”
一、首先,阐述继续发现的问题
二、动态链接
三、exceve函数族
四、exec尝试

2019-2020-1 20199313《Linux内核原理与分析》第八周作业
第八周学习——“进程的描述与进程的创建”
一、首先,阐述继续发现的问题
二、动态链接
三、exceve函数族
四、exec尝试

exec函数主要工作是根据指定的文件名找到可执行的文件,并用他取代调用进程的内容。换句话说,就是在调用进程内部执行一个可执行文件。这里的可执行文件既可以是二进制文件,也可以是任何Linux下可执行的脚本文件。

五、总结

这种实验最好还是应该要用自己的电脑和虚拟机来完成,故而接下来要做的是完善自身的虚拟机系统问题,让这种实验更好的形式呈现。