前言

  • hello word

    • 著名演示程序,哈哈
  • 下面在 arm linux 下展示一下hello world,便开始入门 arm linux 程序篇。
  • 以下学习基于 NXP 的 IMX6 平台。

linux中hello word原理

  • 简要步骤

    1. gcc 编译,编译成功后得出可执行文件 armHelloWord该名字根据用户定义而不同

      1. 预处理
      2. 编译
      3. 汇编
      4. 链接
        • 链接分为两种

          • 动态链接
          • 静态链接
    2. 控制台运行可执行文件 ./armHelloWord
      • linux kernel

        1. Shell 会创建一个新的进程来执行该程序。

          • 使用 fork() 函数创建一个新的进程。
        2. 往新的进程中添加需要执行的程序 armHelloWord
          • 使用 exeve() 函数往新的进程里添加运行程序
        3. sys_execve() 函数为 linux 系统调用,被 exeve() 函数调用
          • 这里的系统调用可以理解为是操作系统系统开放给用户的最底层接口
        4. do_exeve() 函数是 sys_execve() 函数的核心。
        5. load_elf_binary() 函数会去文件系统中读取 armHelloWord 程序到内存,然后判断它是否是动态链接的可执行程序,如果不是,则进一步判断是否是静态链接的文件。
      • glibc 库相关
        1. ld-linux-xx.so 是 glibc 库中的动态连接器。(动态库

          • 如果 armHelloWord 程序是 动态链接 程序,该动态链接器会去加载共享库,并完成共享库和程序的链接工作, 然后准备真正开始执行hell程序。
          • 如果 armHelloWord 程序是 静态链接 程序,则无需再加载链接共享库,直接开始准备执行 armHelloWord 程序。
        2. 程序的真正入口 _start
          • 该符号在glibc中
        3. 执行用户程序前进行一些初始化 __libc_start_main()
          • 该符号也是glibc中的函数
        4. 调用用户程序中的 mian() 函数,开始执行 printf 打印函数。
        5. 程序执行完了之后,调用glibc库中的 _exit() 函数,来结束当前进程。

hello word 实战

  • helloword.c 源码很简单
/** @file         helloword.c
* @brief 简要说明
* @details 详细说明
* @author lzm
* @date 2020-11-07 11:50:53
* @version v1.0
* @copyright Copyright By lizhuming, All Rights Reserved
*
**********************************************************
* @LOG 修改日志:
**********************************************************
*/ #include <stdio.h> int main(void)
{
printf("hello word! This is a first program.\n");
return 0;
}

学习参考

  • 野火

【linux】helloword原理分析及实战的更多相关文章

  1. 2019-2020-1 20199303 《Linux内核原理分析》 第一周作业

    2019-2020-1 20199303 <Linux内核原理分析> 第一周作业 1. 环境准备 在众多的Linux发行版中,Ubuntu,小红帽还有类Unix系统的BSD系统,我选择了目 ...

  2. linux中断处理原理分析

    Tasklet作为一种新机制,显然可以承担更多的优点.正好这时候SMP越来越火了,因此又在tasklet中加入了SMP机制,保证同种中断只能在一个cpu上执行.在软中断时代,显然没有这种考虑.因此同一 ...

  3. 【Java编程实战】Metasploit_Java后门运行原理分析以及实现源码级免杀与JRE精简化

    QQ:3496925334 文章作者:MG1937 CNBLOG博客ID:ALDYS4 未经许可,禁止转载 某日午睡,迷迷糊糊梦到Metasploit里有个Java平台的远控载荷,梦醒后,打开虚拟机, ...

  4. 20169212《Linux内核原理与分析》课程总结

    20169212<Linux内核原理与分析>课程总结 每周作业链接汇总 第一周作业:完成linux基础入门实验,了解一些基础的命令操作. 第二周作业:学习MOOC课程--计算机是如何工作的 ...

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

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

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

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

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

    实验一 Linux系统简介 这一节主要学习了Linux的历史,Linux有关的重要人物以及学习Linux的方法,Linux和Windows的区别.其中学到了LInux中的应用程序大都为开源自由的软件, ...

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

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

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

    2018-2019-1 20189221 <Linux内核原理与分析>第八周作业 实验七 编译链接过程 gcc –e –o hello.cpp hello.c / gcc -x cpp-o ...

随机推荐

  1. C&C++代码单元集成测试培训

    课程简介 本课程为期3天,结合实例讲解如何使用Cantata开展C和C++代码,通过培训,可以明显提高工程师操作Cantata的效率,并加速单元测试和集成测试. [日期]2020年11月3日-5日(共 ...

  2. MeteoInfoLab脚本示例:计算涡度、散度

    用U/V分量数据计算涡度和散度,计算涡度的函数是hcurl,计算散度的函数是hdivg,参数都是U, V.脚本程序: f = addfile('D:/Temp/GrADS/model.ctl') u ...

  3. JVM系列【6】GC与调优2.md

    JVM系列笔记目录 虚拟机的基础概念 class文件结构 class文件加载过程 jvm内存模型 JVM常用指令 GC与调优 了解HotSpot常用命令行参数 JVM的命令行参数参考: https:/ ...

  4. Ubuntu服务安装

    一.ifconfig命令安装 sudo apt install net-tools 二.ssh服务安装 sudo apt-get install openssh-server netstat -ltn ...

  5. java Error opening registry key 'Software\JavaSoft\Java Runtime Environment'安装jdk1.7遇到的问题

    最近开发项目要求jdk在1.7以上,我先卸载了jdk1.6,下载1.7下来安装好,配置下环境变量,可以是在输入java -version的时候发现: java Error opening regist ...

  6. IntelliJ IDEA 15款 神级超级牛逼插件推荐(超赞,谁用谁知道)

    满满的都是干货  所有插件都是在 ctrl+alt+s 里的plugins 里进行搜索安装 1.CodeGlance 代码迷你缩放图插件 2. Codota 代码提示工具,扫描你的代码后,根据你的敲击 ...

  7. vue知识点16

    1. 数组用下标改变,或者对象增加属性,这样的改变数据   是不能触发视图更新的,要用 Vue.set(对象,属性,值) 或this.$set(对象,属性,值) 2. this.$forceUpdat ...

  8. 64位Ubuntu14.04配置adb后提示No such file or directory

    配置好SDK的环境变量后,输入adb提示 No such file or directory. 原因:由于是64位的linux系统,而Android SDK只有32位的,需要安装一些支持包才能使用 1 ...

  9. day74:drf:drf其他功能:认证/权限/限流/过滤/排序/分页/异常处理&自动生成接口文档

    目录 1.django-admin 2.认证:Authentication 3.权限:Permissions 4.限流:Throttling 5.过滤:Filtering 6.排序:OrderingF ...

  10. mysql 必会基础2 distinct

    1.插入数据方式 a> insert into student (id, name, age) values (1, 'zhangsan', 3); --字符串类型要用双引号.或单引号引起来,否 ...