BSP工程师的内核必修课:1.1. 初识Linux内核

欢迎关注个人公众号: Core&Chip  持续更新,免费观看。

自我介绍:

曾就职于AMD,现就职于某大厂芯片部门资深BSP工程师。

崇尚实用主义,主张从用中学。

系列介绍:

BSP工程师的内核基本功,旨在为驱动及BSP工程师讲解

工作中会用到的内核知识及其底层原理。

1. Linux内核简介

我不喜欢像很多Linux书籍一样从"盘古开天"开始讲起,我们简单的介绍一下Linux内核,其中很多方面在这里不做过多的讨论,让大家快速了解即可,否则既控制不住篇幅,也无法深入讲解。

Linux内核顾名思义,它是Linux系统的核心,扮演者“大管家”的角色

  • 对硬件资源例如CPU、内存、硬盘进行统一管理

  • 实现硬件资源与应用程序之间的抽象、中介与管理,让软件开发者无需关心硬件细节

  • 将复杂的功能划分为若干相对独立又紧密写作的子系统。

Linux内核有以下特点:

  1. 开源自由 Linux 内核以 GPL(GNU通用公共许可证)协议开源发布,任何人都可以自由地使用、修改和分发源代码。

  2. 高度可移植 Linux内核支持多种硬件平台,包括x86ARMMIPSPowerPC等,具备良好的跨平台能力。

  3. 模块化设计 内核功能采用模块化结构,用户可根据需要动态加载或卸载内核模块,提升灵活性和扩展性。

  4. 健壮与稳定 经过长期广泛的开发和应用,Linux内核拥有极高的稳定性,能够长时间高效运行于各种场合。

  5. 优秀的安全性 Linux内核具备多种安全机制,如权限管理、沙箱机制、SELinux等,有效保护系统安全。

  6. 实时性支持 在工业和自动驾驶等许多场景,对于实时性有强制需求,Linux内核在6.x版本支持了PREEMPT_RT配置,通过调整抢占、锁、中断处理等机制,让Linux内核有了接近硬实时的响应能力。

2. Linux内核版本介绍

Linux内核官网:The Linux Kernel Archives

当 `aarm-linux-gnueabihf-ld` 提示对 `lcd_drawpoint` 存在未定义引用时,通常是由于链接器在链接过程中找不到该函数的定义。以下是一些可能的解决方法: ### 检查函数定义是否存在 要确保 `lcd_drawpoint` 函数在代码中已经被定义。检查项目中所有的源文件,查看是否有 `lcd_drawpoint` 函数的实现。例如,在某个 `.c` 文件中应该有类似如下的定义: ```c void lcd_drawpoint(int x, int y) { // 函数的具体实现 } ``` ### 检查源文件是否被编译和链接 要保证包含 `lcd_drawpoint` 函数定义的源文件已经被正确编译成目标文件,并且在链接时被包含进去。 如果使用 Makefile 进行编译和链接,确保该源文件被添加到了编译和链接规则中。例如: ```makefile CC = aarm-linux-gnueabihf-gcc CFLAGS = -Wall -g SRCS = main.c bsp_lcdapi.c lcd_driver.c # 确保包含定义 lcd_drawpoint 的文件 OBJS = $(SRCS:.c=.o) TARGET = my_program $(TARGET): $(OBJS) $(CC) $(CFLAGS) -o $@ $^ %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ clean: rm -f $(OBJS) $(TARGET) ``` ### 检查头文件包含情况 要确保在调用 `lcd_drawpoint` 函数的源文件中正确包含了声明该函数的头文件。例如,在 `bsp_lcdapi.c` 文件中应该有类似如下的包含语句: ```c #include "lcd_driver.h" // 假设 lcd_drawpoint 在 lcd_driver.h 中声明 ``` 并且在 `lcd_driver.h` 头文件中应该有函数的声明: ```c #ifndef LCD_DRIVER_H #define LCD_DRIVER_H void lcd_drawpoint(int x, int y); #endif ``` ### 检查库文件 如果 `lcd_drawpoint` 函数定义在一个库文件中,要确保该库文件被正确链接。可以在链接命令中添加 `-l` 和 `-L` 选项来指定库文件。例如: ```sh aarm-linux-gnueabihf-ld -o my_program obj/bsp_lcdapi.o obj/main.o -L/path/to/library -llcd_driver ``` 其中,`-L` 指定库文件所在的目录,`-l` 指定库的名称(去掉前缀 `lib` 和后缀 `.a` 或 `.so`)。 ### 检查编译和链接顺序 有时候,编译和链接的顺序也会影响链接结果。确保所有依赖的目标文件和库文件按照正确的顺序传递给链接器。 ### 检查拼写错误 要仔细检查函数名的拼写是否正确,包括大小写。在 C 语言中,函数名是区分大小写的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值