就拿嵌入式 Linux 硬件平台下(常见的有可以跑linux的arm开发板)的软件开发来说,我们大可将编程分为三种,分别为裸机编程、 Linux 驱动编程以及 Linux 应用编程。
- 什么是裸机开发
首先对于裸机编程这个概念来说很好理解,一般把没有操作系统支持的编程环境称为裸机编程环境,譬如单片机上的编程开发,编写直接在硬件上运行的程序,没有操作系统支持;这种开发方式有点类似于stm32(如果没有跑rtos的话),不过很少用高性能的arm板不跑操作系统来搞裸机开发 - 什么是linux驱动开发
狭义上 Linux 驱动编程指的是基于linux内核驱动框架开发驱动程序, 驱动开发工程师通过调用 Linux 内核提供的接口完成设备驱动的注册, 驱动程序负责底层硬件操作相关逻辑。
一般soc厂商会根据kernel官网链接: kernel官网的某个内核版本进行一些修改,并向外提供他修改后的内核。如果某块pcb设计需要基于该块soc并在这个pcb上加上各种DRAM Flash led 外接屏 等等时,需要在该soc厂商修改后的linux内核上面再修改,增加自己的功能。如果我们是基于这块pcb来开发学习啥的,那么该pcb的厂商也会提供他修改后的内核。
总之驱动开发就是 基于linux内核 设计相关软件 要硬件运行起来 - 什么是linux应用编程
Linux 应用编程(系统编程)则指的是基于 Linux 操作系统的应用编程,在应用程序中通过调用系统调用 API 完成应用程序的功能和逻辑, 应用程序运行于操作系统之上。通常在操作系统下有两种不同的状态:内核态和用户态,应用程序运行在用户态、而内核则运行在内核态。
应用编程一般基于c语言库,调用相关的库函数即可。在 Linux 系 统 下 , 使 用 的 C 语 言 库 为 GNU C 语 言 函 数 库 ( 也 叫 作 glibc ,链接: glibc )作为 Linux 下的标准 C 语言函数库。
其中库函数其实是**由系统调用封装而来(**因此当然也不能完全这么说, 原因在于有些库函数并不调用任何系统调用)的,**因此具有良好的可移植性。而对于 C 语言库函数来说,由于很多操作系统都实现了 C 语言库, C 语言库在不同的操作系统之间其接口定义几乎是一样的,所以库函数在不同操作系统之间相比于系统调用具有更好的
可移植性。