第一部分:实验

首先还是网易云课堂的学习,这次的课程是可执行程序的装载。

预处理、编译和链接:

可执行程序是怎么来的

以c语言代码为例的话,经过预处理,编译成汇编代码,再汇编成目标码再链接可执行文件。



过程如图所示,.c用gcc编译成汇编代码.asm,然后再汇编成目标码.o再ld链接成可执行文件。

以helloworld为例,处理过程如下所示

vi hello.c
gcc -E -o hello.cpp hello.c -m32 //对.c文件预处理,hello.cpp是预处理的中间文件,预处理负责把include的文件包含进来及宏替换等工作
vi hello.cpp
gcc -x cpp-output -S -o hello.s hello.cpp -m32 //编译成汇编代码.s
vi hello.s
gcc -x assembler -c hello.s -o hello.o -m32 //汇编成目标代码.o是二进制的文件
vi hello.o
gcc -o hello hello.o -m32 //链接成可执行文件
vi hello
gcc -o hello.static hello.o -m32 -static //hello就是可执行文件,也是二进制的,hello.o和hello都是ELF格式的文件,这样编译出来的可执行文件使用的 //是共享库,加上-static就是静态编译,就是把所有的程序依赖的东西都放到程序内部
使用gdb跟踪sys_execve内核函数的处理过程:

首先是搭载环境,在实验楼中做实验,用test_exec.c覆盖test.c的内容,但是无法克隆,所以只能将test.c的内容修改成test_exec.c的内容,修改部分代码如下

#include <time.h>
#include <unistd.h> int Time(int argc, char *argv[])
{
time_t tt;
struct tm *t;
tt = time(NULL);
t = localtime(&tt);
printf("time:%d:%d:%d:%d:%d:%d\n",t->tm_year+1900, t->tm_mon, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);
return 0;
} int TimeAsm(int argc, char *argv[])
{
time_t tt;
struct tm *t;
asm volatile(
"mov $0,%%ebx\n\t"
"mov $0xd,%%eax\n\t"
"int $0x80\n\t"
"mov %%eax,%0\n\t"
: "=m" (tt)
);
t = localtime(&tt);
printf("time:%d:%d:%d:%d:%d:%d\n",t->tm_year+1900, t->tm_mon, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);
return 0;
} int Fork(int argc, char *argv[])
{
int pid;
/* fork another process */
pid = fork();
if (pid < 0)
{
/* error occurred */
fprintf(stderr,"Fork Failed!");
exit(-1);
}
else if (pid == 0)
{
/* child process */
printf("This is Child Process!\n");
}
else
{
/* parent process */
printf("This is Parent Process!\n");
/* parent will wait for the child to complete*/
wait(NULL);
printf("Child Complete!\n");
}
} int Exec(int argc, char *argv[])
{
int pid;
/* fork another process */
pid = fork();
if (pid < 0)
{
/* error occurred */
fprintf(stderr,"Fork Failed!");
exit(-1);
}
else if (pid == 0)
{
/* child process */
printf("This is Child Process!\n");
execlp("/hello","hello",NULL);
}
else
{
/* parent process */
printf("This is Parent Process!\n");
/* parent will wait for the child to complete*/
wait(NULL);
printf("Child Complete!\n");
}
} MenuConfig("time","Show System Time",Time);
MenuConfig("time-asm","Show System Time(asm)",TimeAsm);
MenuConfig("fork","Fork a new process",Fork);
MenuConfig("exec","Execute a program",Exec);

对于Exec()函数跟fork()的代码是类似的,只是在子进程里面增加了execlp(),启动的是hello,就是写的hello world。

接着是创建hello.c文件,如下图所示

menu中的Makefile也有修改的内容,如下图所示



用静态编译的方式编译了hello.c,然后在生成根文件系统时把init和hello都放到rootfs.img里面了,这样在执行exec时就可以自动加载hello这个可执行文件。

程序的执行结果如下



我们可以看到exec命令,执行exec发现比fork命令多了的hello world,实际上这个hello world是执行新加载的程序输出的。

接下来就是使用gdb跟踪。使用-S和-s,命令如下

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

接下来就是使用gdb设置断点跟踪,设置的断点如下图所示



连续输入三个c启动MenuOS,如下图所示



在MenuOS中输入exec命令就会停在断点sys_execve处,如下图所示





输入c继续执行,停在了第二个断点处,list查看函数,如下图所示



输入c继续执行,来到stard_thread,如下图所示



使用po new_ip查看new_ip的指向,



其实new_ip是返回到用户态的第一条指令的地址。



我们可以看到new_ip的地址就是入口地址。

输入s进入到内部



我们可以看到在修改内核堆栈的位置,把regs_ip修改成hello的起点,这样再返回用户态时就有了新的执行环境。

第二部分:教材

虚拟文件系统中(VFS)有四个主要的对象类型
  • 超级块对象:代表一个具体的已安装文件系统;
  • 索引节点对象:代表一个具体文件;
  • 目录项对象:代表一个目录项,是路径的一个组成部分;
  • 文件对象:代表由进程打开的文件

扇区是设备的最小寻址单元,块是文件的最小寻址单元。

四种I/O调度程序:
  • Linus电梯。能执行合并与排序预处理;
  • 最终期限I/O调度程序。为解决请求饥饿问题;
  • 完全公正的排队I/O调度程序。以时间片轮转调度队列;
  • 空操作的I/O调度程序。专为随机访问设备而设计的。

20169210《Linux内核原理与分析》第九周作业的更多相关文章

  1. 2019-2020-1 20199303<Linux内核原理与分析>第二周作业

    2019-2020-1 20199303第二周作业 1.汇编与寄存器的学习 寄存器是中央处理器内的组成部份.寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令.数据和位址.在中央处理器的控制部件中 ...

  2. 20169219 linux内核原理与分析第二周作业

    "linux内核分析"的第一讲主要讲了计算机的体系结构,和各寄存器之间对数据的处理过程. 通用寄存器 AX:累加器 BX:基地址寄存器 CX:计数寄存器 DX:数据寄存器 BP:堆 ...

  3. 2019-2020-1 20199314 <Linux内核原理与分析>第二周作业

    1.基础学习内容 1.1 冯诺依曼体系结构 计算机由控制器.运算器.存储器.输入设备.输出设备五部分组成. 1.1.1 冯诺依曼计算机特点 (1)采用存储程序方式,指令和数据不加区别混合存储在同一个存 ...

  4. Linux内核原理与分析-第一周作业

    本科期间,学校开设过linux相关的课程,当时的学习方式主要以课堂听授为主.虽然老师也提供了相关的学习教材跟参考材料,但是整体学下来感觉收获并不是太大,现在回想起来,主要还是由于自己课下没有及时动手实 ...

  5. 2019-2020-1 20199314 <Linux内核原理与分析>第一周作业

    前言 本周对实验楼的Linux基础入门进行了学习,目前学习到实验九完成到挑战二. 学习和实验内容 快速学习了Linux系统的发展历程及其简介,学习了下的变量.用户权限管理.文件打包及压缩.常用命令的和 ...

  6. Linux内核原理与分析-第二周作业

    写之前回看了一遍秒速五厘米:如果

  7. 2020-2021-1 20209307 《Linux内核原理与分析》第九周作业

    这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)> 这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第九周作业> 这个作业的目标 & ...

  8. 2018-2019-1 20189221《Linux内核原理与分析》第一周作业

    Linux内核原理与分析 - 第一周作业 实验1 Linux系统简介 Linux历史 1991 年 10 月,Linus Torvalds想在自己的电脑上运行UNIX,可是 UNIX 的商业版本非常昂 ...

  9. 2018-2019-1 20189221 《Linux内核原理与分析》第九周作业

    2018-2019-1 20189221 <Linux内核原理与分析>第九周作业 实验八 理理解进程调度时机跟踪分析进程调度与进程切换的过程 进程调度 进度调度时机: 1.中断处理过程(包 ...

  10. 2019-2020-1 20199329《Linux内核原理与分析》第九周作业

    <Linux内核原理与分析>第九周作业 一.本周内容概述: 阐释linux操作系统的整体构架 理解linux系统的一般执行过程和进程调度的时机 理解linux系统的中断和进程上下文切换 二 ...

随机推荐

  1. Hadoop MapReduce Next Generation - Setting up a Single Node Cluster

    Hadoop MapReduce Next Generation - Setting up a Single Node Cluster. Purpose This document describes ...

  2. 工作流软件如何成为未来web的支柱

    此文作者是 Kevin Lindquist,工作流平台Decisions的营销负责人,原文发表于VB上. Web 3.0 正在敲门,但是开门的人你永远都想不到:工作流软件. 传统上工作流软件是企业级的 ...

  3. POJ 3258 River Hopscotch 二分枚举

    题目:http://poj.org/problem?id=3258 又A一道,睡觉去了.. #include <stdio.h> #include <algorithm> ]; ...

  4. JavaFX 开发是遇到一些问题记录

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "PingFang SC"; color: #000000; min-he ...

  5. JavaMail 发送邮件

    JavaMail邮件发送 引用maven jar包 <dependency> <groupId>javax.mail</groupId> <artifactI ...

  6. NULL, nil, Nil详解

    原文地址:http://blog.csdn.net/wzzvictory/article/details/18413519    感谢原作者 作者:wangzz 原文地址:http://blog.cs ...

  7. .where(provider).FirstOrDefault()和.FirstOrDefault(provider)的性能比较

    最近遇到一个关于Linq的问题,.where(provider).FirstOrDefault();和.FirstOrDefault(provider);的性能比较 关于这个主要有以下三种说法,但这方 ...

  8. activemq启动不起来,报错Address already in use: JVM_Bind

    之前莫名其妙的activemq怎么都启动不起来后来多方查询是因为widows 的ICS服务. 解决方案是,我的电脑上邮件,选择服务,然后在服务中找到Internet Connection Sharin ...

  9. 搭建mongodb分片

    搭建mongodb分片 http://gong1208.iteye.com/blog/1622078 Sharding分片概念 这是一种将海量的数据水平扩展的数据库集群系统,数据分表存储在shardi ...

  10. File上传

    http://wenku.baidu.com/link?url=bsufrjDQztceWCUw2gqFeYkL1_95t9yIyV1LfHVYL9URAlpWSK_ALO1bAWSlBdnPXYXE ...