嵌软秋招两万字八股文汇总(四)

嵌入式Linux环境搭建

Bootloader任务: 讲一下bootargs和bootcmd

硬件初始化: 初始化 CPU、内存、时钟、串口、网口、LCD 等硬件设备。

启动设备选择: 从 Flash (NAND, NOR, eMMC)、SD 卡、网络 (TFTP) 等启动介质中加载内核。

加载内核镜像和 Device Tree (DTB): 将 Linux 内核镜像 (vmlinuz) 和设备树文件 (.dtb) 加载到内存。 设备树描述了系统的硬件配置,内核使用它来了解设备的地址、中断等信息。

设置启动参数: 设置内核的启动参数,如根文件系统位置 (root=)。

传递控制权给内核: 将控制权传递给内核。

Linux 内核 (Kernel)任务:

内核初始化: 初始化内核数据结构、中断处理、内存管理等。

设备树解析: 解析 Device Tree 文件,获取硬件配置信息。

驱动加载: 根据 Device Tree 加载相应的设备驱动。

挂载根文件系统:

Initramfs/Initrd (可选): 如果需要,加载 initramfs 或 initrd,这是一个临时的根文件系统,用于加载驱动或执行一些初始化操作。

挂载真正的根文件系统: 挂载真正的根文件系统。 根文件系统可以位于 Flash 分区、SD 卡、NFS 共享等。

启动 init 进程: 启动 init 进程,进程ID为1。

Init 进程 (init, systemd)任务:

系统初始化: 设置主机名、网络配置、时间等。

服务启动: 启动系统服务,如网络服务、串口服务、图形界面等。

控制台启动: 在串口或 LCD 上启动控制台,允许用户登录和操作系统。

1、 你都修改过 Bootloader 的哪些部分?为什么要修改这些部分?

网络驱动\屏幕驱动,引脚、参数,make menuconfig进行图形化配置

2、 在 Bootloader 中,如何实现从不同的启动介质 (NAND Flash, SD 卡等) 启动?你是如何配置的?

修改Bootcmd内容,使用mmc切换启动介质,并读取镜像文件和设备树到指定地址

3、 Bootloader 如何传递参数给 Linux 内核?你都传递过哪些参数?这些参数有什么作用?

使用bootargs环境变量进行传参,比如根文件系统路径、设置linux终端是串口还是屏幕,console\root\rootfstype,根文件系统格式ext

4、 请详细描述一下 Linux 内核移植的步骤。例如,如何获取内核源码?如何配置内核?如何编译内核?如何安装内核?

Nxp代码仓库下载,使用menuconfig配置,make,make dtbs编译得到zimage和dtb文件,

5、 如何添加或修改内核设备树(Device Tree)以支持你的硬件平台?请解释设备树的结构以及节点和属性的含义。

6、 你是如何根据项目需求定制根文件系统的?例如,如何添加必要的工具和库?如何配置启动脚本?

7、 根文件系统的目录结构是怎样的?每个目录的作用是什么?比如 /, /bin, /etc, /lib, /usr 等

/bin : 存放基本的、所有用户都可以使用的命令(ls, cp等)。

/lib:存放系统和应用程序使用的共享库。

/dev (Device files): 包含设备文件,如字符设备和块设备。

8、 你知道 init 系统吗?在你的根文件系统中,使用的是哪种 init 系统?

9、 根文件系统类型有哪些?有什么区别,比如jffs2、yaffs2、ext4等?

ext4 存储介质SD 卡、eMMC,较高性能和可靠性;FAT32兼容性好,但可靠性较差,有文件大小限制;NFS网络文件系统,允许通过网络访问文件

10、 你了解Yocto Project吗?

11、 你了解 Secure Boot 吗?

12、 如果现在有一个新的硬件平台,需要你来搭建嵌入式 Linux 环境,你该如何着手?

 驱动开发与设备适配:

1、 在驱动开发过程中,你主要使用了哪些工具?(例如:JTAG, GDB, 串口终端)

2、 什么是设备树? 它的作用是什么?

设备树(Device Tree,简称 DT)是一个描述硬件的数据结构和语言规范。 简单来说,它是一种用于描述嵌入式系统中硬件组件的文本文件 (通常以 .dts 为后缀) ,并被编译成二进制格式的文件 (通常以 .dtb 为后缀)。

3、 你是如何添加LED、KEY等设备节点的? 请详细描述添加设备节点的步骤。设备树中的各个属性 (properties) 的含义是什么? 你是如何配置这些属性的?

Compatible;gpios;label;status;reg;clocks

4、 你是如何验证设备树的修改是否正确的? 你使用了哪些工具?

编译设备树并检查编译错误:

ls /dev命令检查设备节点是否被创建 ls /sys/class 编写一个简单的应用程序来控制新添加的设备。

5、 什么是字符设备驱动? 它与其他类型的驱动 (例如:块设备驱动,网络设备驱动) 有什么区别?

6、 你是如何开发字符设备驱动的? 请详细描述开发步骤。

创建设备结构体:信息包括字符设备结构体,设备号,私有数据、自旋锁等信息

填充 file_operations 结构体: 定义一组函数指针,用于实现对设备文件的操作,

编写模块加载和卸载函数:

分配设备号、初始化 cdev 结构体并添加到内核、创建设备文件 (使用 class 和 device 创建,udev会自动创建设备节点);

写makefile文件生成ko文件,modprobe加载和rmmod卸载

7、 你如何提供操作接口? (例如:open, close, read, write, ioctl)

file_operations 结构体: 是提供设备操作接口的核心。

container_of(): 用于从 inode 中获取设备结构体指针。

copy_to_user() 和 copy_from_user(): 用于在内核空间和用户空间之间拷贝数据。

ioctl() 函数: 提供额外的控制接口,用于执行设备特定的操作。

错误处理: 在每个操作函数中都要进行错误处理,例如检查参数、检查硬件状态等。

并发控制: 如果多个进程同时访问设备,需要使用锁机制来保护共享资源。

8、 你是如何修改LCD驱动程序的? 为什么要修改LCD驱动程序?

修改引脚,屏幕分辨率、接口类型、像素位数、时序参数;修改背光结点(引脚、pwm通道)

9、 你了解LCD的硬件接口吗? (例如:RGB, MIPI DSI)

Rgb,7根线

R (Red): 红色数据线,传输红色分量的数据 (通常有多根,这里算作1根代表)。

G (Green): 绿色数据线,传输绿色分量的数据 (通常有多根,这里算作1根代表)。

B (Blue): 蓝色数据线,传输蓝色分量的数据 (通常有多根,这里算作1根代表)。

HSYNC (Horizontal Sync): 水平同步信号,指示新的一行像素的开始。

VSYNC (Vertical Sync): 垂直同步信号,指示新的一帧图像的开始。

DE (Data Enable): 数据使能信号,用于指示 RGB 数据线上的数据有效。

CLK (Clock): 像素时钟信号,用于同步 RGB 数据的传输。

10、 你了解LCD的时序参数吗? (例如:水平同步信号,垂直同步信号)

11、 什么是platform驱动模型?它的作用是什么?使用platform驱动模型有什么好处?

12、 你是如何使用platform驱动模型实现驱动分层的?

13、 你对内存管理、中断处理、设备管理等内核机制有多了解?

14、 详细讲一下LCD的驱动流程。

1、 修改设备树:

LCD 所使用的 IO 配置。 24 根数据线、4 根控制线、CLK、

ENABLE、VSYNC 和 HSYNC、LCD背光PWM引脚配置。

LCD属性值,换成我们所使用的 LCD 屏幕参数。主要有像素位数、总线宽度等等。

LCD 背光节点信息修改,要根据实际所使用的背光 IO 来修改相应的backlight设备节点信息。

2、 写驱动

3、 Linux 内核将所有的 Framebuffer 抽象为一个叫做 fb_info 的结构体,fb_info 结构体包含了 Framebuffer 设备的完整属性和操作集合。常见设备文件 /dev/fb0 提供对 framebuffer 的内存映射.Platform模型去写,设备匹配后在probe里进行驱动初始化。

申请 fb_info。

初始化 fb_info 结构体中的各个成员变量。

初始化 eLCDIF 控制器。

使用 register_framebuffer 函数向 Linux 内核注册初始化好的 fb_info。

全部评论

相关推荐

重生之我在潮汐监狱当...:两个工作一天回家后,都只想躺着,什么都不想干
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务