zoukankan      html  css  js  c++  java
  • 20135316王剑桥Linux内核学习记笔记第七周

    20135316王剑桥《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC 1000029000
    一、可执行程序是怎么得来的?
    编译器预处理(负责把include的文件包含进来及宏替换等工作);编译成汇编代码;编译器编译成目标代码;再链接成可执行文件;操作系统加载到内存中来执行

    hello.o和hello文件都是ELF格式的
    二、目标文件的格式(ELF可执行可链接)

    ABI(应用程序二进制接口)

    可重定位主要是.o文件
    可执行文件加载的主要工作:可执行文件的格式和进程地址空间的映射。
    三、ELF文件默认加载到0x8048000;程序的实际入口是头文件里面的那个地址位置0x8048x00(可执行文件加载到内存中执行的第一句代码);一般静态链接会将所有代码放在一个代码段,动态链接会有多个代码段。
    四、可执行程序的执行环境
    $ ls -l /usr/bin 列出/usr/bin下的目录信息
    Shell本身不限制命令行参数的个数,命令行参数的个数受限于命令自身
    例如,int main(int argc, char *argv[])
    又如, int main(int argc, char *argv[], char *envp[])
    Shell会调用execve将命令行参数和环境参数传递给可执行程序的main函数
    int execve(const char * filename,char * const argv[ ],char * const envp[ ]);
    命令行参数和环境串都放在用户态堆栈中,先函数调用参数传递,再系统调用参数传递。
    五、动态链接分为可执行程序装载是动态链接和运行时动态链接
    gcc -shared shlibexample.c -o libshlibexample.so -m32

    -L:库对应的接口头文件所在的目录
    -l:库名
    -ldl:动态加载器
    六、子进程是从ret-from-fork开始执行然后返回用户态。
    七、当系统调用进入内核中后调用sye-execve,解析可执行文件的格式。之后的调用顺序为:do-execve、do-execve-commom、exex-binprm。Search-binary-handle寻找符合文件格式对应的解析模块(根据文件头部信息)。
    八、对于ELF格式的可执行文件fmt->load-binary(bprm),执行的应该是load-elf-binary,其内部是和ELF文件格式解析的部分需要和ELF文件格式标准结合起来阅读。
    九、Elf-format和inint-elf-binfmt是观察者模式中的观察者,解析模块是被观察者
    十、Load-elf-binary->start-thread,系统调用返回用户态的起点,通过修改内核堆栈中EIP的值作为新程序的起点(int 0x80)。命令行参数和环境变量在栈顶。
    十一、如果可执行文件需要依赖其他的动态链接的话,需要将CPU控制权交给ld来加载依赖库完成动态链接。对于静态链接的文件elf-entry是新程序执行的起点



    s可以进入do-execve的内部
    Po new-ip可以查看返回到用户态的第一条指令地址

  • 相关阅读:
    vue学习笔记之v-if
    vue学习笔记之属性和方法
    vue学习笔记之v-for与-repeat
    王阳明心学
    读《铁血并购》
    心理测试:DISC性格测试(完整版)
    关于旅行
    [转载]win32 计时器使用
    [转]C#中调用资源管理器(Explorer.exe)打开指定文件夹 + 并选中指定文件 + 调用(系统默认的播放类)软件(如WMP)打开(播放歌曲等)文件
    [转]C#读写TEXT文件
  • 原文地址:https://www.cnblogs.com/20135316wjq/p/5360989.html
Copyright © 2011-2022 走看看