20169210《Linux内核原理与分析》第九周作业
第一部分:实验
首先还是网易云课堂的学习,这次的课程是可执行程序的装载。
预处理、编译和链接:
可执行程序是怎么来的
以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内核原理与分析》第九周作业的更多相关文章
- 2019-2020-1 20199303<Linux内核原理与分析>第二周作业
2019-2020-1 20199303第二周作业 1.汇编与寄存器的学习 寄存器是中央处理器内的组成部份.寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令.数据和位址.在中央处理器的控制部件中 ...
- 20169219 linux内核原理与分析第二周作业
"linux内核分析"的第一讲主要讲了计算机的体系结构,和各寄存器之间对数据的处理过程. 通用寄存器 AX:累加器 BX:基地址寄存器 CX:计数寄存器 DX:数据寄存器 BP:堆 ...
- 2019-2020-1 20199314 <Linux内核原理与分析>第二周作业
1.基础学习内容 1.1 冯诺依曼体系结构 计算机由控制器.运算器.存储器.输入设备.输出设备五部分组成. 1.1.1 冯诺依曼计算机特点 (1)采用存储程序方式,指令和数据不加区别混合存储在同一个存 ...
- Linux内核原理与分析-第一周作业
本科期间,学校开设过linux相关的课程,当时的学习方式主要以课堂听授为主.虽然老师也提供了相关的学习教材跟参考材料,但是整体学下来感觉收获并不是太大,现在回想起来,主要还是由于自己课下没有及时动手实 ...
- 2019-2020-1 20199314 <Linux内核原理与分析>第一周作业
前言 本周对实验楼的Linux基础入门进行了学习,目前学习到实验九完成到挑战二. 学习和实验内容 快速学习了Linux系统的发展历程及其简介,学习了下的变量.用户权限管理.文件打包及压缩.常用命令的和 ...
- Linux内核原理与分析-第二周作业
写之前回看了一遍秒速五厘米:如果
- 2020-2021-1 20209307 《Linux内核原理与分析》第九周作业
这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)> 这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第九周作业> 这个作业的目标 & ...
- 2018-2019-1 20189221《Linux内核原理与分析》第一周作业
Linux内核原理与分析 - 第一周作业 实验1 Linux系统简介 Linux历史 1991 年 10 月,Linus Torvalds想在自己的电脑上运行UNIX,可是 UNIX 的商业版本非常昂 ...
- 2018-2019-1 20189221 《Linux内核原理与分析》第九周作业
2018-2019-1 20189221 <Linux内核原理与分析>第九周作业 实验八 理理解进程调度时机跟踪分析进程调度与进程切换的过程 进程调度 进度调度时机: 1.中断处理过程(包 ...
- 2019-2020-1 20199329《Linux内核原理与分析》第九周作业
<Linux内核原理与分析>第九周作业 一.本周内容概述: 阐释linux操作系统的整体构架 理解linux系统的一般执行过程和进程调度的时机 理解linux系统的中断和进程上下文切换 二 ...
随机推荐
- 2014年度辛星html教程夏季版第四节
我们前面也涉及了HTML中的一些东西,接下来我们要涉及到图像了,如果没有图像,即使文字的样式再多,再复杂,终归还是单调的,我们就需要用图片来给我们的网页增加更多的表现形式. ************* ...
- c#中struct和class的区别 z
1.struct 是值类型,class是对象类型 2.struct 不能被继承,class可以被继承 3.struct 默认的访问权限是public,而class默认的访问权限是private. 4. ...
- ubuntu apt-get常用命令的使用
packagename指代为软件包的名称 apt-get install packagename 安装一个新软件包(参见下文的aptitude) apt-get remove ...
- POJ 2442 Sequence 优先队列
题目: http://poj.org/problem?id=2442 #include <stdio.h> #include <string.h> #include <q ...
- cisco telnet会话SESSION管理及相关Dynagen配置文件
#Lab 2-5 autostart = False [localhost] [[2621]] ram = 64 image = C:\Program Files (x86)\Dynamips\ima ...
- 使用Qt实现简单的图片预览效果 good
http://www.cnblogs.com/appsucc/archive/2012/02/28/2371506.html Qt之实现工具箱界面程序 http://www.cnblogs.com/a ...
- INFORMATION_SCHEMA.INNODB_LOCKS
INNODB_LOCKS Table: INNODB_LOCKS 表 包含信息关于每个锁 一个InnoDB 事务已经请求 但是没有获得锁, 每个lock 一个事务持有是堵塞另外一个事务 centos6 ...
- 【HDOJ】3560 Graph’s Cycle Component
并查集的路径压缩. #include <stdio.h> #include <string.h> #define MAXNUM 100005 int deg[MAXNUM], ...
- Hash Killer I II
题意大概: 1.字符串hash不取模,自动溢出 构造数据卡这种hash 2.字符串hash取模1000000007,构造数据卡这种hash 题解传送门:VFleaKing http://vfleak ...
- 避免由于Windows Update自动安装安全补丁导致VM意外重启
最近我们遇到一些客户报告他们的Windows VM被意外重启导致了其服务中断,我们查看了Event Log发现这个重启的操作时由于Windows update自动安装了安全补丁导致的重启操作.默 ...