视频学习

可执行文件是怎么得来的?

.c汇编成汇编代码.asm,然后再汇编成目标码.o。然后在连接成可执行文件,然后加载到内存可执行了。

对hello.c文件预处理(cpp),预处理负责把include的文件包含进来及宏替换等工作。

把hello.cpp编译成汇编代码hello.s

再把编译代码hello.s编译成目标代码hello.o(二进制的文件),然后把hello.o链接成可执行文件hello。

hello是使用共享库的,再静态编译,把所有完全依赖的都放在hello.static的内部。

目标文件的格式ELF

一个可重定位(relocateble)文件保存着代码和适当的数据,用来和其他的object文件一起来创建一个可执行文件或者是一个共享文件。

一个可执行(executable)文件保存着一个用来执行的程序;该文件指出了exec(BA_OS)如何来创建程序进程映像。

一个共享object文件保存着代码和合适的数据,用来被下面的两个链接器链接。第一个是连接编辑器,可以和其他的可重定位和共享object文件来创建其他的object。第二个是动态链接器,联合一个可执行文件和其他的共享object文件来创建一个进程映象。

Object文件与程序的连接(创建一个程序)和程序的执行(运行一个程序)

一个ELF头文件的开始,保存了路线图(road map),描述了该文件的组织情况程序头表(program header table)告诉系统如何来创建一个进程的内存映象。section头表(section header table)包含了描述文件sections的信息。每个section在这个表中有一个入口,每个入口给出了该section的名字,大小,等等信息。

当创建或增加一个进程映象的时候,系统在理论上将拷贝一个文件的段到一个虚拟的内存段。

静态链接的ELF可执行文件与进程的地址空间

可执行文件加载到内存中开始执行的第一行代码。

一半静态链接将所有代码放在一个代码段。

动态链接的进程有多个代码段。

装载可执行程序之前的工作

可执行程序的执行环境

命令行参数和shell环境,一般我们执行一个程序的shell环境,我们的实验直接使用execve系统调用。

$ ls -l /usr/bin 列出usr/bin下的目录信息

Shell本身不限制命令行参数的个数,命令行参数的个数受限于命令自身

——例如,int main(int argc, charargv[])

——又如,int main(int argc, char
argv[], charenvp[])

Shell会调用execue将命令行参数和环境参数传递给可执行程序的main函数

——int execve(const char
filename,charconst argv[],charconst envp[]);

——库函数exec*都是execue的封装例程

sys_execve内部会解析可执行文件格式

do_execve -> do_execve_common -> exec_binprm

search_binary_handler符合寻找文件格式对应的解析模块

对于ELF格式的可执行文件fmt->load_binary(bprm);执行的应该是load_elf_binary其内部是和ELF文件格式解析的部分需要和ELF文件格式标准结合起来阅读

装载时动态链接和运行时动态链接应用举例

动态链接分为可执行程序装载时动态链接和运行时动态链接

编译成libshlibexample.so文件

$ gcc -shared shlibexample.c -o libshlibeexample.so -m32

这就生成了一个共享库文件,共享库和动态加载共享库内部定义其实是一样的

编译main,注意这里只提供shlibexample的-L(库对应的接口头文件所在目录)和-l(库名,如libshlibexample.so去掉lib和.so的部分)并没有提供dllibexample的相关信息,只是指明了-ldl

gcc main.c -o main -L/path/to/your/dir -lshlibexample -ldl -m32

-L指明当前目录, -l指明这个库文件,-ldl动态加载器

可执行程序的装载相关关键问题分析

execve和fork都是特殊一点的系统调用,子进程是从ret_from_fork开始执行然后返回用户态

使用GDB跟踪sys_execve内核函数的处理过程

搭配环境,删除旧的menu目录,重新下载新的版本,test.c覆盖test_exec.c 操作如下:

$ cd LinuxKernel
$ rm menu -rf
$ git clone http://github.com/mengning/menu.git
$ cd menu
$ mv test_exec.c test.c

重新编译并启动程序:

$ make rootfs

使用qemu命令重新启动内核并使用-s和-S参数“冻结”系统执行,命令如下:

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

此时为了使用gdb进行调试,需要水平分割一个窗口,输入如下命令:

$ gdb
(gdb) file linux-3.18.6/vmlinux
(gdb) target remote:1234

设置断点sys_execve和load_elf_binary还有start_thread。



执行之后进入了系统调用SyS_execve

跟踪,继续执行进入load_elf_binary

继续跟踪,进入到start_thread

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



课本第13,14章知识学习

虚拟文件系统中(VFS)有四个主要的对象类型:

1.超级块对象:代表一个具体的已安装文件系统;

2.索引节点对象:代表一个具体文件;

3.目录项对象:代表一个目录项,是路径的一个组成部分;

4.文件对象:代表由进程打开的文件

四种I/O调度程序:

1.Linus电梯。能执行合并与排序预处理;

2.最终期限I/O调度程序。为解决请求饥饿问题;

3.完全公正的排队I/O调度程序。以时间片轮转调度队列;

4.空操作的I/O调度程序。专为随机访问设备而设计的。

20179223《Linux内核原理与分析》第八周学习笔记的更多相关文章

  1. 20179223《Linux内核原理与分析》第九周学习笔记

    视频学习 进程调度与进程调度的时机分析 不同类型的进程有不同的调度需求 第一种分类: --I/O-bound:1.频繁的进行I/O:2.通常会花费很多时间等待I/O操作的完成 --CPU-bound: ...

  2. 20179223《Linux内核原理与分析》第二周学习笔记

    第二周实验 本周学习情况: 学习了X86 cpu的几个寄存器及X86汇编指令: movl %eax,%edx edx=eax %表示一个寄存器,把eax内容放入edx,等号相当于把eax赋值给edx, ...

  3. 20179223《Linux内核原理与分析》第一周学习笔记

    第一周实验 尝试创建两个文件,用通配符查找这两个文件:在创建文件的时候,需要同时创建多个文件的方法运行. 根据作业要求,实现一个lilux命令. 根据作业要求添加一个用户loutest,使用sudo创 ...

  4. 20179203李鹏举 《Linux内核原理与分析》第一周学习笔记

    Linux基础入门 一.Linux的基础学习 1.1 Linux的重要基础操作 Linux不同于Windows的纯粹的图形化界面,虽然也有图形桌面的操作但是更多的操作还是通过命令行来进行,当然除了命令 ...

  5. 20179223《Linux内核原理与分析》第四周学习笔记

    补交第三周作业 完成一个简单的时间片轮转多道程序内核 1.使用实验楼的虚拟机打开shell,用cd LinuxKernel/linux-3.9.4进入linux-3.9.4. 2.执行命令qemu - ...

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

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

  7. 20169212《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 这一周学习了MOOCLinux内核分析的第一讲,计算机是如何工作的?由于本科对相关知识的不熟悉,所以感觉有的知识理解起来了有一定的难度,不过多查查资 ...

  8. 20169210《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 本周作业分为两部分:第一部分为观看学习视频并完成实验楼实验一:第二部分为看<Linux内核设计与实现>1.2.18章并安装配置内核. 第 ...

  9. Linux 内核分析第八周学习笔记

    Linux 内核分析第八周学习笔记 zl + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-10 ...

  10. 2017-2018-1 20179215《Linux内核原理与分析》第二周作业

    20179215<Linux内核原理与分析>第二周作业 这一周主要了解了计算机是如何工作的,包括现在存储程序计算机的工作模型.X86汇编指令包括几种内存地址的寻址方式和push.pop.c ...

随机推荐

  1. web.config文件配置解决网站上传大文件限制

    Asp.Net网站对上传文件的大小,请求执行的时间都做了限制,上传的文件如果超过限制或者执行上传时间超出, 文件上传都将失败. 因此,需要配置web.config来增加最大文件上传的大小和执行超时时间 ...

  2. mac下搭建eclipse+git环境并导入项目

    首先官网下载eclipse,然后安装,选择eclipse for java developer. 安装git插件:eclipse-help-install new software-add name随 ...

  3. Web应用体系结构

    容器 Servlet没有main()方法,它们受控于另一个Java应用,这个Java应用称为容器(Container).我们最常见的tomcat就是这样一个容器. Web服务器应用(如Apache)得 ...

  4. 【Demo】jQuery 轮播图简单动画效果

    功能实现: (1)设定图片称号的鼠标悬停事件: (2)在事件中利用自定义动画函数调整显示图片,并修改对应标号样式: (3)为图片显示区域设定鼠标悬停事件: (4)当鼠标停在该区域时,清除图片切换动画定 ...

  5. Java获取未知类型对象的属性

    获取未知类型对象的属性通常有两种方式: 一是通过自定义注解的方式,通过获取被注解的属性从而获取属性的值,这种方式也是Spring参数注入的重要实现手段 二是通过反射获取属性的名称,通过属性名从而获取属 ...

  6. HDU 3506 (环形石子合并)区间dp+四边形优化

    Monkey Party Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Tot ...

  7. Qt:表格 tableWidget

    1.设置行数和列数 //设置行数 tableWidget->setRowCount(); //设置列数 tableWidget->setColumnCount(); 2.隐藏表头 tabl ...

  8. Java进阶1. Synchronized 关键字

    Java进阶1. Synchronized 关键字 20131025 1.关于synchronized的简介: Synchronized 关键字代表对这个方法加锁,相当于不管那一个线程,运行到这个方法 ...

  9. 【zzuli-2259】matrix

    题目描述 在麦克雷的面前有N个数,以及一个R*C的矩阵.现在他的任务是从N个数中取出 R*C 个,并填入这个矩阵中.矩阵每一行的法值为本行最大值与最小值的差,而整个矩阵的法值为每一行的法值的最大值.现 ...

  10. c#中事务及回滚

    程序一般在特殊数据的时候,会有数据上的同步,这个时候就用到了事物.闲话不多说,直接上代码. public void UpdateContactTableByDataSet(DataSet ds, st ...