从应用到内核第0章记录

gcc 的参数

  1. -Wall 打开所有的警告。
  2. -g 只是在编译的时候,产生调试信息。
  3. -v 查看完整和详细编译的过程
  4. -E 把源文件预处理一下。
例如:
(1)把用户定义的所有的预定义#define展开。

    > 举个例子,如果用户有以下代码:
    #define Max(a, b) ((a)>(b)?(a):(b))
    ...
    int c = Max(a, b);

    经过gcc预处理后,预定义都将展开成如下样子:
    int c = ((a)>(b)?(a):(b));

(2)把所有的#include的文件内容加载进来。
    > 举个例子,如下:

    预处理后程序会用stdio.h的内容替换掉#include <stdio.h>,
    最后的程序中,就找不到<>这样的include,
    更多的是#include "/usr/include/stdio.h"之类的。
    这样就能知道
    a)stdio.h在linux下的存放路径,
    b)FILE结构体的摸样,
    c)size_t类型的定义, 
    d)其他很多你想知道的

(3)处理条件编译,将不符合条件的代码段删除。
    > 举个例子,如果用户有以下代码:
    #ifdef M
      printf("M");
    #else
      printf("NM");
    #endif

    如果没有定义M,预处理后程序将变成
    printf("M");

例如编译01_hello.c :
gcc -g -Wall -v 01_hello.c -o hello

readelf : 查看二进制ELF可执行程序的格式。

例如:readelf -a hello
部分hello 的elf格式信息
·

其中涉及的段:
 1. debug : 用于保存调试信息
 2. dynamic:用于保存动态链接信息
 3. fini: 用于保存进程退出时的执行程序。进程结束的时候,系统会自动执行这部分。
 4. init:用于保存进程启动时的执行程序。当进程启动时候,系统会自动执行者部分。
 5. redata:用于保存只读数据,例如定义的const 的全局变量,字符串变量等。
 6. symtab:用于保存符号表。

注意:
 1. 如果不使用-g编译,就不会生成相应的调试段。
 2. 可以使用strip去掉一些非必要的段,用来减小程序占用的空间,比如符号信息。

strace 跟踪系统调用程序

strace ./hello 输出信息如下:
这里写图片描述

 1. 执行命令的时候,由shell调用fork,然后在子进程真正执行这个命令。
 2. 先调用execve加载hello。
 3. ld分别检查ld.so.nohwcapld.so.preload4. 如果ld.so.nohwcap存在,则ld加载未优化的库,如果ld.so.preload存在,则ld加载其中的库。
     (可以使用这种机制替换系统调用或者C库,利用LD_PRELOAD实现)
 5. 使用mmap将ld.so.cache映射到内存。
 6. 使用ld加载C库libc.so.6
 7. 使用mmap和mprotect设置程序各个内存区域。
 8. write(1,"hello world!\n",13hello world! 
    ) = 13
    write向文件描述符1(就是标准输出)输出"hello world!\n",返回值为13,成功的字符个数。
 9. 调用exit_group退出程序,参数为0,表示退出状态。

概念介绍

 1. 系统调用时操作系统提供的服务,是应用程序与内核通信的接口。
 2. 用户空间的程序默认是通过栈来传递参数的,内核态和用户态使用的是不同的栈,系统调用的参数只能通过寄存器的方式传递。
 3. 编译器实现了圧栈,出栈,保存返回地址等操作,
 4. C库函数位于用户态
 5. linux平台下,系统调用使用寄存器eax来传递系统调用的。
 6. 可重入函数一定是线程安全的,而线程安全函数不一定是可重入函数。
 7. 使用锁,尤其是互斥锁,该函数是不可重入的。
 8. 函数使用静态变量,并且依赖于静态变量,函数也是不可重入的。
 9. 阻塞的系统调用是指,当进行系统调用时,除非出错(被信号打断也是视为出错),进程会一直陷入内核态直到调用完成。非阻塞的系统调用是指无论I/O操作成功与否,调用都会立即返回。
 10. 同步既可以是阻塞的,也可以是非阻塞的。比如系统调用的read函数
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值