(2023-2024-1)20232811《Linux内核原理分析与设计》第八周作业

202328 2023-11-10 10:56:16

目录

一、实验七:装载和启动可执行程序

1.使用“exec库函数”加载一个可执行文件

2. 通过gdb进行跟踪分析

 二、相关知识及问答

三、实验总结


一、实验七:装载和启动可执行程序

1.使用“exec库函数”加载一个可执行文件

在实验楼的终端中执行以下命令,发现test.c文件中新增“exec”命令:

cd LinuxKernel
rm -rf menu
git clone https://github.com/mengning/menu.git
# 克隆失败执行该命令
# git config --global http.sslVerify false
cd menu
mv test_exec.c test.c
vi test.c

 

 返回menu文件夹 ,编译运行

make roofs

 

查看exec函数实现:

可以看到,Exec函数使用了fork()和execlp()等系统调用。

  1. 函数定义了一个名为Exec的函数,它接受两个参数:argc表示命令行参数的数量,argv是一个指向参数字符串数组的指针。
  2. 函数中使用了fork()系统调用来创建一个新的进程。fork()会复制当前进程,创建一个新的子进程。在原始进程中,fork()返回子进程的进程ID(pid),而在子进程中,fork()返回0。
  3. 通过检查fork()的返回值,可以确定当前代码是在父进程还是子进程中执行。
  4. 如果fork()返回值小于0,表示创建子进程失败,程序会打印错误信息并退出。
  5. 如果fork()返回值等于0,表示当前代码在子进程中执行。子进程会输出一条信息 “This is Child Process!,然后使用execlp()系统调用执行名为”/hello"的可执行文件。
  6. 如果fork()返回值大于0,表示当前代码在父进程中执行。父进程会输出一条信息 “This is Parent Process!”,然后使用wait()系统调用等待子进程的结束。
  7. 当子进程执行完毕后,父进程会继续执行,并输出一条信息 “Child Complete!”。

总体来说,这个函数创建了一个子进程,并在子进程中执行了一个名为"/hello"的程序。父进程等待子进程执行完毕后才继续执行。

2. 通过gdb进行跟踪分析

回退到父目录,使用下面的命令启动内核并在CPU运行代码前停下以便调试:

qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S

 

打开一个新的终端窗口,依次使用下面的命令启动gdb调试:

gdb
file linux-3.18.6/vmlinux
target remote:1234

 在系统调用sys_execve的入口处设置断点:

b sys_execve

继续运行程序,在QEMU窗口中输入exec,系统就会停在上面设置的断点处: 

 继续设置以下断点,可完整跟踪进程的创建和启动代码:

b load_elf_binary
b start_thread

 

 二、相关知识及问答

三、实验总结

 exec函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容,换句话说,就是在调用进程内部执行一个可执行文件。这里的可执行文件既可以是二进制文件,也可以是任何Linux下可执行的脚本文件,如果不是可以执行的文件,那么就解释成为一个shell文件,shell执行。当Linux内核或程序使用fork函数创建子进程后,子进程往往要调用一种exec函数(exec家族的一种)以执行另一个程序;在调用一种exec函数时,该进程执行的程序完全被替换为新程序,而新程序则从其main函数处开始执行,因为调用exec函数并不创建新进程,所以前后的进程ID并未改变,或者说exec函数只是用了一个全新的程序替换了当前进程的正文、数据段和堆栈段
 

 

...全文
591 回复 打赏 收藏 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
源码下载地址: https://pan.quark.cn/s/07e7935aff27 在Android应用开发过程中,`ImageView`作为一个基础组件被广泛运用,其主要功能是展示各种图像资源,这些资源可以来源于本地存储或通过网络获取。本文将详细阐述如何动态地变更`ImageView`所显示的图片内容,并借助自定义监听机制来监控和干预图片的加载流程。此类技术在应用开发中具有很高的实用价值,特别是在处理网络用户头像、商品展示图以及实时数据更新的场景下。 我们首先需要明确`ImageView`的基本操作方式。在Android平台,我们常通过`setImageResource()`、`setImageBitmap()`以及`setImageDrawable()`等函数来设定`ImageView`的图像内容。然而,这些方法主要适用于已加载至内存中的图像文件,对于网络图片,则需要借助更为复杂的处理逻辑。 在实现动态下载并更新`ImageView`中的图像时,我们普遍采用`AsyncTask`或`Loader`来执行后台任务,以此防止主线程被阻塞。本文将重点介绍自定义监听器的构建方法。自定义监听器能够让我们依据图片加载的进程或状态来执行特定的任务,例如显示加载进度指示器或处理加载失败的情况。 自定义监听器通常定义为一个接口,其中包含了若干个回调方法,例如`onStart()`、`onProgressUpdate()`、`onSuccess()`、`onError()`等。以下是一个示例接口定义: ```java public interface ImageDownloaderListener { void onStart(); void onProgress(int ...
代码转载自:https://pan.quark.cn/s/8e8053c4e35c uni-app是由DCloud(即海豚浏览器背后的公司)设计的一款基于Vue.js技术的跨平台前端框架。其核心思想是让开发者仅需编写一次代码,就能达成多平台的兼容性,涵盖了iOS、Android、H5、小程序以及快应用等多个不同的终端设备。这种“编写一次,随处运行”的特性显著提升了开发效能,减少了维护开销,特别适用于构建规模庞大且结构复杂的应用程序。 【Vue.js基础】 uni-app的开发根基是Vue.js,这是一款具备轻量级MVVM(Model-View-ViewModel)架构的前端框架。Vue.js借助声明式的数据结合以及组件化机制,简化了前端构建过程。在uni-app环境中,Vue的模板语法、计算属性、指令、组件等要素均被保留并应用于开发跨平台应用。开发者需要充分掌握Vue的基础概念和操作方法,例如数据绑定(v-bind、v-model)、条件性渲染(v-if、v-else)、循环(v-for)、事件处理(v-on)等。 【uni-app组件系统】 uni-app配备了一套内容丰富的原生组件集合,这些组件依托于各平台的原生API,能够实现接近原生应用的交互效果。比如,按钮(button)、图像(image)、列表(list)、导航栏(navigator)、滑动视图(swiper)等。开发者可以通过设定配置属性、响应事件来调整组件的功能表现和视觉样式,达成自定义功能的目标。 【uni-app插件市场】 在具备内置组件之外,uni-app还拥有一个功能强大的插件市场,其中提供了众多第三方组件和API,覆盖了地图、支付、推送、广告等多种功能范畴。开发者可以便捷地集成这些...

39

社区成员

发帖
与我相关
我的任务
社区描述
北京电子科技学院 《Linux内核原理与分析》课程
linuxarm开发系统安全 高校 北京·丰台区
社区管理员
  • rocflytosky
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧