一、系统调用
系统调用(system call) 其实是 Linux 内核提供给应用层的应用编程接口(API) , 是 Linux 应用层进入内核的入口。通过系统调用, Linux 应用程序可以请求内核以自己的名义执行某些事情,譬如打开磁盘中的文件、读写文件、关闭文件以及控制其它硬件外设。
二、应用编程、裸机编程、驱动编程区别
- 裸机编程:
一般把没有操作系统支持的编程环境称为裸机编程环境,譬如单片机上的编程开发,编写直接在硬件上运行的程序,没有操作系统支持。
- Linux 驱动编程:
指的是基于内核驱动框架开发驱动程序, 驱动开发工程师通过调用 Linux 内核提供的接口完成设备驱动的注册, 驱动程序负责底层硬件操作相关逻辑
- Linux 应用编程(系统编程):
指的是基于 Linux 操作系统的应用编程,在应用程序中通过调用系统调用 API 完成应用程序的功能和逻辑, 应用程序运行于操作系统之上。通常在操作系统下有两种不同的状态:内核态和用户态,应用程序运行在用户态、而内核则运行在内核态。
三、库函数
动态(.so)库文件的形式提供,存放在根文件系统/lib目录下。
库函数就是封装了系统调用和非系统调用。
库函数与系统调用的区别:
- 库函数是属于应用层,而系统调用是内核提供给应用层的编程接口,属于系统内核的一部分;
- 库函数运行在用户空间,调用系统调用会由用户空间(用户态)陷入到内核空间(内核态);
- 库函数通常是有缓存的,而系统调用是无缓存的,所以在性能、效率上,库函数通常要优于系统调用;
- 可移植性:库函数相比于系统调用具有更好的可移植性,通常对于不同的操作系统,其内核向应用层提供的系统调用往往都是不同,譬如系统调用的定义、 功能、参数列表、返回值等往往都是不一样的;而对于 C 语言库函数来说,由于很多操作系统都实现了 C 语言库, C 语言库在不同的操作系统之间其接口定义几乎是一样的,所以库函数在不同操作系统之间相比于系统调用具有更好的可移植性。
四、标准C语言函数库(GNU C、glibc)
官网:http://www.gnu.org/software/libc/
4.1 确定Linux系统的glibc版本
/lib/x86_64-linux-gnu:ls -lh libc.so.6
或者
./libc.so.6
五、main函数
//无传参
int main(void)
{
/* 代码 */
}
//有传参
int main(int argc, char **argv)
{
/* 代码 */
}
/*
argc 形参表示传入参数的个数,包括应用程序自身路径和程序名,譬如运行当前目录下的 hello 可执行
文件,并且传入参数,如下所示:
*/
./hello 112233
/*
那么此时参数个数为 2,并且这些参数都是作为字符串的形式传递给 main 函数:
argv[0]等于"./hello"
argv[1]等于"112233"
有传参时 main 函数的写法并不只有这一种,只是这种写法最常用。
*/
六、开发环境
虚拟机VMware Station
Ubuntu20.04
vscode
gcc编译器
交叉编译工具(ARM gcc)