新进程的加载与创建

news2024/9/24 15:27:37

1、实现fork系统调用

fork创建子进程。通过fork的返回值来判断是父进程还是子进程。

当fork()返回值会返回进程的id,当进程发现pid==0,就知道了自己是fork出来的子进程;而如果pid > 0,则知道了自己是父进程。

fork系统调用实现:

  1. 在系统调用表sys_table中添加系统调用接口
  2. 分配子进程运行所需的任务控制块task_t
  3. 初始化task_t:关键之处在于要让该结构体中的内容,除tss->eax以外,其它内核寄存器的值要与父进程中的相同,这样才能完整的复制父进程调用fork前的状态
  4. 需要单独为子进程分配相应的内容空间:即内核页表及相应的物理页。这样就可以使子进程拥有独立的运行内存空间。

2、实现exec系统调用

前面的fork只能实现从一个现有的进程克隆出一个子进程。因此下面实现加载全新应用程序的功能:exec()即创建一个独立编译的应用程序

1)建立独立的 不和操作系统代码文件一起编译的文件,比如建立main.c文件,添加main函数

int main (int argc, char **argv) {
    for (;;) {
        msleep(1000);
    }
}

2)添加main函数启动之前的C运行环境的代码,放在crt0.s和cstart.c中

_start:
# 设置各数据段的选择子,由于应用任务都是用tss恢复的,所以
# 实际不必设置,但为安全起见,还是设置一下
mov %ss, %ax
mov %ax, %ds
mov %ax, %es
mov %ax, %fs
mov %ax, %gs

# 进入主函数执行,注意此时栈没有变,参数仍然在其中
# 所以调用cstart时,仍然可以看到参数
jmp cstart
void cstart (int argc, char ** argv) {
    main(argc, argv);
}

3)告诉编译器应当将程序编译为在那个地方开始运行:通过链接脚本实现(使用0x81000000 )

4)修改工程cmakelist.txt文件,添加针对该应用程序的编译选项

project(shell LANGUAGES C)  

# 使用自定义的链接器
# 加入相应的库
set(LIBS_FLAGS "-L ${CMAKE_BINARY_DIR}/source/applib/ -lapp")
set(CMAKE_EXE_LINKER_FLAGS "-m elf_i386 -T ${PROJECT_SOURCE_DIR}/link.lds ${LIBS_FLAGS}")
set(CMAKE_C_LINK_EXECUTABLE "${LINKER_TOOL} <OBJECTS> ${CMAKE_EXE_LINKER_FLAGS} -o ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.elf")

include_directories(
${PROJECT_SOURCE_DIR}/../applib/
)

# 将所有的汇编、C文件加入工程
# 注意保证start.asm在最前头
file(GLOB C_LIST "*.c" "*.h" "*.S")
add_executable(${PROJECT_NAME} ${C_LIST})

# 不带调试信息的elf生成,何种更小,写入到image目录下
add_custom_command(TARGET ${PROJECT_NAME}
POST_BUILD
COMMAND ${OBJCOPY_TOOL} -S ${PROJECT_NAME}.elf ${CMAKE_SOURCE_DIR}/../../image/${PROJECT_NAME}.elf
COMMAND ${OBJDUMP_TOOL} -x -d -S -m i386 ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.elf > ${PROJECT_NAME}_dis.txt
COMMAND ${READELF_TOOL} -a ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.elf > ${PROJECT_NAME}_elf.txt

相关知识补充

添加虚拟文件访问接口

int sys_open(const char *name, int flags, ...);
int sys_read(int file, char *ptr, int len);
int sys_write(int file, char *ptr, int len);
int sys_lseek(int file, int ptr, int dir);
int sys_close(int file);

在这些接口中,只实现对5000扇区处的shell.elf加载。首先将shell.elf加载到内存,然后将直接从内存中直接进行elf文件解析

创建完成就是增加exec()系统调用,与实现fork()系统调用过程一样,其功能就是使用sys_exec加载应用程序

3、添加sys_yield()系统调用

功能:这个系统调用来实现进程主动放弃CPU并切换到其他进程运行过程。

首先,需要为系统调用预留接口并添加相应的ID,然后在库函数中实现该系统调用的接口。接着,需要处理系统调用的映射表,调用task.c中的函数实现进程主动放弃CPU的功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2093563.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【LoRa】CAD的工作原理以及使用

目录 1 CAD介绍1.1 CAD工作原理1.2 与CAD有关的中断 2 CAD的使用2.1 CAD总耗时2.2 CAD均衡配置2.3 最优配置速查表 3 CAD的应用3.1 CAD项目使用3.2 CAD扩展应用CSMA 4 参考文献 1 CAD介绍 本章介绍一下LoRa芯片的CAD功能、原理以及如何使用。由于第一代SX127x的CAD使用与以后的…

实测数据处理(RD算法处理)——SAR成像算法系列(十)

系列文章目录 《SAR学习笔记-SAR成像算法系列&#xff08;一&#xff09;》 《距离多普勒算法&#xff08;RDA&#xff09;-SAR成像算法系列&#xff08;三&#xff09;》 文章目录 一、算法流程 1.1、回波信号生成 1.2、 距离脉冲压缩 1.3、距离徙动校正 1.4、方位脉冲压缩 …

HDMI显示器驱动设计与验证

1 HDMI简介 在此附上HDMI协议的数据手册链接&#xff0c;更有1.4的中文版&#xff1a; https://pan.baidu.com/s/1CdEQuJzYXnESNZK60k7aVQ?pwd6666https://pan.baidu.com/s/1CdEQuJzYXnESNZK60k7aVQ?pwd6666链接&#xff1a;https://pan.baidu.com/s/1CdEQuJzYXnESNZK60k7a…

Kioxia的NVMe RAID卸载有何亮点?

随着每一代固态硬盘SSD的速度不断提升&#xff0c;RAID阵列面临着一个重大的挑战&#xff1a;如何有效地维持并扩展性能。即使是通过专门的RAID卡来处理RAID操作的情况下&#xff0c;例如在RAID 5阵列中&#xff0c;简单的写请求也需要涉及两次读取和两次写入不同的SSD。如果没…

ENVI SARscape||笔记

介绍就不介绍了&#xff0c;直入主题&#xff01; 第一章 ENVI和SARscape 下载与安装&#xff1a; ENVI 5.6 软件安装包下载及安装激活教程&#xff01; (qq.com)https://mp.weixin.qq.com/s/kH0g5g9AALgDNPssfdZ8wQ 启动 ENVI 的启动模式有两种&#xff1a;ENVI和ENVIIDL&…

鸿蒙 tabs 底部中间凸出

1, 先看效果 2, 直接cv代码-- 先修改一下 资源配置 图标使用自己的 color.json配置 {"integer": [{"name": "tab_row_column_image_width","value": 24},{"name": "tab_row_column_image_height","value&qu…

Vue面试常见知识总结2——spa、vue按需加载、mvc与mvvm、vue的生命周期、Vue2与Vue3区别

SPA SPA&#xff08;Single Page Application&#xff0c;单页面应用&#xff09;是一种Web应用程序架构&#xff0c;其核心特点是在用户与应用程序交互时&#xff0c;不重新加载整个页面&#xff0c;而是通过异步加载页面的局部内容或使用JavaScript动态更新页面。以下是对SPA…

【QT】增加注释模板

为了增加项目可读性&#xff0c;增加注释模板 选择工具->外部->配置… &#xff0c;再次选择“文本编辑器”->“片段”->“添加”&#xff0c;触发命名为header_customer,点击应用&#xff0c;按照下面的模板编排,再次点击应用&#xff0c; /*******************…

【第0004页 · 递归】生成括号对

【前言】本文以及之后的一些题解都会陆续整理到目录中&#xff0c;若想了解全部题解整理&#xff0c;请看这里&#xff1a; 第0004页 生成括号对 今天这题有点难绷&#xff0c;从某种程度上来说应该是第二次写这个问题了&#xff0c;但还是卡住了&#xff0c;现在我们来看一下…

2018CCPC网络赛 C - Dream

题意 给定一个P,现在可以以任意方式重载‘’和‘*’两个符号,使得满足下列等式 其中定义如下 需要注意的是,重载过后的*需要满足以下要求: 也就是说,重载‘*’之后通过计算得到的(k1,2,3,...,p-1)的取值对于集合{1,2,3,...,p-1}是一个一一映射的关系 ​​​​最后输出2*p行,按…

如何在windows中使用hfd.sh aria2c下载huggingface文件

这里写目录标题 简介hfd.sh使用方法windows系统安装aria2c aria2c官方文档&#xff1a; https://aria2.github.io/manual/en/html/aria2c.html 简介 我们在下载huggingface上模型权重的时候&#xff0c;要么在浏览器上直接下&#xff0c;要么使用官方下载程序。浏览器上还得一…

Lagent 自定义 Agent 智能体

准备 安安装环境 mindsearch 工具 画图工具

算法设计与分析:实验五 图论——桥问题

实验内容&#xff1a; 1. 桥的定义 在图论中&#xff0c;一条边被称为“桥”代表这条边一旦被删除&#xff0c;这张图的连通块数量会增加。等价地说&#xff0c;一条边是一座桥当且仅当这条边不在任何环上。一张图可以有零或多座桥。 2. 求解问题 找出一个无向图中所有的桥…

用MATLAB 画一个64QAM的星座图

由于QAM采用幅度和相位二维调制&#xff0c;其频谱效率大大提高&#xff0c;而且不同点的欧式距离也要大于调幅AM调制方式&#xff0c;QAM也是LTE和5G NR首选的调制方式&#xff0c;本期教大家画一个64QAM的星座图。 如下&#xff1a; 首先产生一个64QAM的调制数据&#xff0…

18044 成绩等级评分

### 思路 1. 从键盘输入一个整数成绩。 2. 判断成绩是否在0到100之间&#xff1a; - 如果不在范围内&#xff0c;输出“error”。 - 如果在范围内&#xff0c;根据成绩范围输出对应的等级&#xff1a; - 90分以上为A - 80到89分为B - 70到79分为C - …

数仓架构:离线数仓、实时数仓Lambda和Kappa、湖仓一体数据湖

往期推荐 大数据HBase图文简介-CSDN博客 数仓分层ODS、DWD、DWM、DWS、DIM、DM、ADS-CSDN博客 数仓常见名词解析和名词之间的关系-CSDN博客 目录 往期推荐 1. 数仓架构 1.1 离线数仓架构 1.1.1 数据集市架构 1.1.1.2 独立数据集市 1.1.1.2 从属数据集市 1.1.2 Inmon企…

Java的线程池简述

线程池的工作原理 线程池是为了减少频繁的创建线程和销毁线程带来的性能损耗&#xff0c;线程池的工作原理如下图&#xff1a; 线程池分为核心线程池&#xff0c;线程池的最大容量&#xff0c;还有等待任务的队列&#xff0c;提交一个任务&#xff0c;如果核心线程没有满&…

基于SpringBoot+Vue+MySQL的宠物寄养服务管理系统

系统背景 互联网社会的到来&#xff0c;让各行各业通过互联网实现了浴火重生的可能&#xff0c;每个行业都发现了完全可以使用互联网技术用来提高信息在内部的传递效率&#xff0c;提高管理水准。通过本次对宠物寄养服务系统的设计和开发&#xff0c;不仅能巩固已经学到的知识&…

代码随想录 刷题记录-22 动态规划(6)习题

1.300.最长递增子序列 子序列问题是动态规划解决的经典问题&#xff0c;当前下标i的递增子序列长度&#xff0c;其实和i之前的下标j的子序列长度有关系. 动规五部曲&#xff1a; 1.dp数组及下标含义 dp[i] : 从任意位置开始&#xff0c;以nums[i]元素作为结尾的所有 递增子…

Unity编辑器开发 Immediate Mode GUI (IMGUI)

1. 简介&#xff1a; IMGUI是代码驱动gui系统&#xff0c;由 OnGUI 函数驱动&#xff1a; void OnGUI() {if (GUILayout.Button("Press Me")){ Debug.Log("Hello!");} } IMGUI常用于&#xff1a; 创建 in-game debugging displays and tools&#xff1b…