首页
社区
课程
招聘
[原创]XV6操作系统关键特性-程序的一生
发表于: 2025-9-16 14:08 396

[原创]XV6操作系统关键特性-程序的一生

2025-9-16 14:08
396

程序的一生

载入内存

程序在载入内存工作之前,静静的待在硬盘上,当用户在命令行输入demo时,便会去磁盘上查找是否有名为demo的可执行文件,如果有则载入内存并运行。
载入程序入内存的函数为exec()。

exec()函数

  • 假设demo程序是ELF格式的,则exec会先去载入demo的ELF头部,验证一些参数,如果没有问题则分配内存然后读取磁盘中的demo的数据到内存中。
  • 下面仔细谈谈内存的分配问题,在XV6中,内存从虚拟地址0开始分配,具体分配内存的函数是kalloc()函数,该函数返回一块大小为4096字节的内存空间的首地址。这个函数具体怎么实现就不去分析了,只需要知道调用这个函数可以返回可用的内存,该函数返回的是内存的物理地址。在内存分配的最后,还需要将虚拟地址和物理地址之间建立映射关系,如何建立映射关系也不去分析了,只需要知道在建立映射关系后,通过虚拟地址可以访问到物理地址处的内存。
  • 在分配完内存后接下来就是从磁盘中载入程序到内存中。
  • 接下来就是为程序运行分配4096字节大小的用户态栈,在程序运行阶段,push等栈操作指令操作的是这段内存。
  • 接下来是往这个用户态栈中压入demo的main函数运行所需要的参数,这样在main函数执行时能够得到函数参数。
  • 最后需要修改程序的内核栈,修改内核栈中的用户态栈指针指向前面分配的用户态栈,修改内核栈中的程序指针为ELF文件中的程序入口,这样中断返回时就会使用新的用户态栈,且首先会执行ELF文件的入口代码。

中断返回是什么意思?

  • 前面exec函数的最后处提到,中断返回就会使用用户态的栈且跳转到ELF入口代码处执行,这多少有点"魔法"的感觉,具体是怎么回事呢?
  • 原来exec函数是通过软中断而执行的,在用户调用exec系统调用函数,想要运行demo文件时,cpu检测到软中断,进而执行软中断处理程序。首先cpu将当前程序的用户态堆栈指针压入内核态堆栈(这个内核栈是通过TSS而自动获取的),同时压入内核栈的还有cpu标志寄存器eflags和程序指针。栈看起来是这样的。
    ---高
    ---ss
    ---esp
    ---eflags
    ---cs
    ---eip
    ---低
    内核栈中除了有这些外,在中断处理函数中还会压入一系列寄存器来保存程序运行的现场以方便后续回到此处继续运行被打断运行的程序。
  • 在压入一系列寄存器后,发现当前的中断是系统调用中断,因此开始执行syscall函数,在syscall中访问得到已经在内核栈中的eax寄存器的值,从而执行exec函数。
  • 当exec函数执行完成后,将回到中断处理函数,在该函数中将调用exec系统调用的函数的保存在内核栈中的寄存器值依次弹出,返回到新程序运行。

程序切换

  • 程序切换一般是通过定时器中断而执行的,当然还有用户主动放弃cpu的方式,不去考虑这种情况。
  • 当中断发生时,如前所述,cpu和中断处理程序会将数据压入内核栈中。
  • 当前运行的程序被定时器中断打断运行,将数据保存在内核栈中,等待下次将运行权交给被打断的程序。在定时器中断中将运行权交给别的准备好运行的程序,其实就是将内核栈的指针esp指向下一个将要运行程序的内核栈。
  • 当栈指针esp指向程序的内核栈中时,便会弹出内核栈中的数据到各个寄存器中,其中最关键的是iret指令弹出ss,esp,eflags,cs,eip。这样下一个程序就执行起来了。
  • 需要注意的是程序切换时会继续压入弹出一些寄存器。

程序退出exit函数

当程序主动调用exit函数退出时,创建该进程的父进程或者init进程会负责回收资源。

第一个用户程序是怎么运行起来的?

  • 第一个用户程序通过伪造中断现场而获得运行的机会。
  • 当在第一个用户程序内核栈中填写相应字段后,系统调用scheduler函数会选中第一个用户程序然后弹出其内核栈中的数据到各个寄存器中,这样第一个用户程序就运行起来了。
  • 当第一个用户运行起来会通过fork+exec的方式运行sh程序,当sh程序退出时会重启sh。在sh程序中通过fork+exec的方式运行其他ELF文件。

fork函数

fork函数将当前进程所具有的资源几乎原封不动复制一份,fork出的子程序和执行fork的程序几乎一模一样,fork出的程序fork函数的返回值为0,这样可以区分父子程序的不同。


传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2025-9-17 13:31 被zhzhz编辑 ,原因:
收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回