EDA365电子论坛网
标题:
嵌入式Linux驱动开发4412-实验01内核开发基础
[打印本页]
作者:
孤久厌闹
时间:
2020-12-1 11:16
标题:
嵌入式Linux驱动开发4412-实验01内核开发基础
实验 01 内核开发基础-基于迅为4412开发板
# f: C( R( h% \* G
1.1 本章导读
4 K% s5 f% b x
本实验将带您学习一遍
Linux
的框架和源码目录结构。
; u# Y( x, ]5 ^6 f2 d" n
从任何地方拿到的 Linux 源码,都有几百 M 大小,包含上万个文件。
. B, N, b4 v% ^. F0 }' y# O* B6 j
这么多的文件!那么问题来了,应该从什么地方入手呢?
# i$ U# n3 M+ q( w
哪些内容应该“深入研究”?
3 `1 K5 S$ D T) h6 P8 S% {
哪些内容应该“惊鸿一瞥”?
0 m, y8 o8 T* s0 G
哪些内容应该“束之高阁”?
5 [0 I% X2 | q
本期实验“内核开发基础”,带大家快速梳理一遍,把和学习无关的内容剔除掉。
6 a$ |$ z6 i2 F- t
1.1.1 工具
" `: m* X5 L. I6 o& g
1.1.1.1 硬件工具
. y! W a# ?1 W
PC 机一台
4 n9 P; L. j, j* P' V
1.1.1.2 软件工具
! `. J S5 s5 U/ x( R0 ~% J$ ~
软件 Source Insight
0 q, L) i, g6 {, J* ?
Linux 源码“iTop4412_Kernel_3.0_xxx”(在光盘目录“/
Android
源码”文件夹下,xxx表示日期)
/ @% H, m% X7 V. H% Q+ U
1.1.2 预备课程
6 `* n+ k# M, c+ r7 W: j6 q
视频教程“01-烧写、编译以及基础知识视频”→“实验 12-使用 Source Insight 加载和阅读内核源码”
. d8 o$ z& f! k; I) P# @: |
使用手册“3.5 Source Insight 的安装和使用”
5 j* i% \9 [' j( d o- D' z9 {1 `
1.1.3 视频资源
( `- q1 O/ R5 H+ r/ E. Q( X
本节配套视频为“视频 01_内核开发基础”
6 `$ ]8 @' }+ f- u6 p' |+ e
1.2 学习目标
0 t. b/ \* h2 T
本章需要学习以下内容:
* _; T3 g$ v, ]& Z" N( T" Q o
理解 Linux 体系结构
" B ]/ Y8 Q( x2 {
了解 Linux 内核结构
" ^! Q9 h" \1 q* h k1 c) a! ^
了解 Linux 内核源码目录结构
5 V' I" j+ K9 x$ M/ n3 o, J$ E" U
了解学习 Linux 的大方向→驱动
( P1 E1 U2 p0 L* S; `' U
1.3 Linux 体系结构
. `. {8 ~( t) D6 e
如下图所示,Linux 体系结构,从大的方面可以分为用户空间(User Space)和内核空间(Kernel Space)。
- E; c- h6 q8 u5 H- [
( M* _3 |( ^% ?: g7 I$ d; N8 I
用户空间中包含了 C 库,用户的应用程序。在某些体系结构图中还包含了 shell,当然shell 脚本也是 Linux 体系中不可缺少的一部分。
% A# O$ d3 n9 R* Y0 g
内核空间包括硬件平台、平台依赖代码、内核、系统调用接口。
+ a6 L: }# Z$ ?8 i1 ]/ x/ S
在任何一个现代操作系统中,都是分层的。为什么需要分层呢?
$ F/ k9 M. a: g: o- b: {9 N7 t# q
从程序员的角度分析,将 linux 底层和和应用分开,将 linux 底层和应用分开,做应用的做应用,做底层的做底层,各干各的。经济学的基本原理是,分工产生效率。
5 o" q! d9 x" }' {1 R) L! z; u. d
从安全性的角度分析,是为了保护内核。现代 CPU 通常都实现了不同的工作模式。
% P v/ Q; P1 O& O& R+ {+ z
以
ARM
为例:ARM 实现了 7 种工作模式,不同模式下 CPU 可以执行的指令或者访问的寄存器不同: (1)用户模式 usr (2)系统模式 sys(3)管理模式 svc(4)快速中断 fiq(5)外部中断irq(6)数据访问终止 abt(7)未定义指令异常。如果任何一个上层应用都可以调用都可以调用寄存器,那样肯定是无法稳定执行的。而且因为出现了这个问题,出现了一个新的学科“现代操作系统”,如果大家感兴趣可以看一下“现代操作系统”相关文章或者书籍。
; T- R# h3 z3 `, B" X8 {4 `0 b+ [' n
以 X86 为例:X86 实现了 4 个不同级别的权限,Ring0—Ring3 ;Ring0 下可以执行特权指令,可以访问 IO 设备;Ring3 则有很多的限制
3 {8 l6 V7 L! k
如果分析一下 Android 的,这方面做的更加“丧心病狂”,Android 所有的 APK 应用程序,都是在 Java 虚拟机上面运行,应用程序更加远离底层。
) t; W0 ~5 l$ v2 u8 P4 j7 \
另外,用户空间和内核空间是程序执行的两种不同状态,可以通过“系统调用”和“硬件中断”来完成用户空间到内核空间的转移。
# t }, b7 a( Z2 Z, k( C
1.4 Linux 内核结构
8 `! x2 O" q# ?' s( y5 ?7 g5 n
这一节,分析一下内核结构。
' P0 c& A: B* v9 _1 M; r
如下图所示,是 Linux 内核结构图。
- K; g* v- ]) u6 l# Y
8 j6 Y) |7 A9 {2 X" ?
SCI 层(System Call Interface),这一层是给应用用户空间提供一套标准的系统调用函数来访问 Linux。前面分析 Linux 体系结构的时候,介绍过任何一类现代操作系统都不会允许上层应用直接访问底层,在 Linux 中,内核提供了一套标准接口,上层应用就可以通过这一套标准接口来访问底层。
! \5 b" Z D* s7 U; R* r2 i# F
PM(Procees Management),这一部分包括具体创建创建进程(fork、exec),停止进程(kill、exit),并控制他们之间的通信(signal 等)。还包括进程调度,控制活动进程如何共享 CPU。这一部分是 Linux 已经做好的,在写驱动的时候,只需要调用对应的函数即可实现这些功能,例如创建进程、进程通信等等。
* z# E1 Y+ g4 t/ t
MM(Memory Management),内存管理的主要作用是控制多个进程安全的共享内存区域。
; d1 t& f! y: R; P. e% R3 @1 H
VFS(Virtual File Systems),虚拟文件系统,隐藏各种文件系统的具体细节,为文件操作提供统一的接口。在 Linux 中“一切皆文件”,这些文件就是通过 VFS 来实现的。Linux 提供了一个大的通用模型,使这个模型包含了所有文件系统功能的集合。如下图所示,是一个虚拟文件系统的结构图。
0 y- @# R" a% M+ t; ]( x
$ \# p% S( [) O+ g1 V
Device Drivers 设备驱动,这一部分就是需要学习和掌握的。Linux 内核中有大量的代码在设备驱动程序部分,用于控制特定的硬件设备。
M& S5 ^! ^! v* |( ~+ E( z
Linux 驱动一般分为网络设备、块设备、字符设备、杂项设备,需要编写的只有字符设备,杂项设备是不容易归类的一种驱动,杂项设备和字符设备有很多重合的地方。
. }* Q( T# r( `; U0 a
网络协议栈,Linux 内核中提供了丰富的网络协议实现。
1 |7 @( Y0 y& U% v* ~' c. n J
1.5 Linux 内核源码目录结构
5 A; F d* M# j: J
Linux 内核源码采用树形结构。功能相关的文件放到不同的子目录下面,使程序更具有可读行。
& s1 g; o+ h& }" e& z
使用 Source Insight 打开源码,如下图所示,可以看到源码是树形结构。
% a- @/ t* R3 T2 u
( n/ Y9 t1 V( v# r% h( o% z( A5 v
下面来介绍每一个目录的作用。
" ?+ T# O4 K7 ^' @) S4 h
arch 目录是平台目录。处理器原厂提供一套 Linux 内核的源码,那么在这个目录下都有一套针对具体处理器 CPU 的子目录。每个 CPU 的子目录,又进一步分解为 boot,mm,kernel 等子目录,分别控制系统引导,内存管理,系统调用,动态调频,主频率设置部分等。
7 K$ ^3 ?; A4 o0 q( {; U
在 arch 目录中有关键的平台文件。任何一款支持 Linux 的处理器,都有一部分内核代码是针对特定的处理器来提供的,具体的实现就是通过平台文件。
+ @* ?- w" b% H# X4 n8 g3 k& q
迅为 iTOP-4412 的平台文件,是 arch→arm→mach-exynos→mach-itop4412.c。
( ~( f) k# Z0 x4 Z; a" v
arch→arm→boot 目录,默认编译生成的内核镜像是在这个目录下。
8 q4 ] ~' x7 v; v
在 arch→arm→kernel 目录中,有针对具体 CPU 处理器的代码,有相关内核特性实现方式,如信号处理等。这一部分当然是芯片厂商做好了,4412 的这部分就是三星已经做好的部分。
2 P' u% k8 ~/ S8 [5 ]* w: u" g
在 arch→arm→lib 目录中,有一些和硬件相关库函数,后面学习驱动的时候会使用到。
$ k3 P" F/ T$ \7 A3 Q
在 arch→arm→tools 目录中,包含了生成镜像的工具。
+ \' d! C' J! m# h. s+ g
% g+ ^' N+ _4 G3 a! @! _; I- v
如下图所示。
$ S, _5 W! y! ?' |0 n# ]. i
在 binary 目录中,有一些无源码的驱动以二进制放到该文件夹,例如一些测试版本或者不愿意公布源码,都可以将二进制文件放到这个目录中。
0 D' n: v; E5 P/ L$ O; ?; { }
在 drivers 目录中,就是需要重点学习的部分,后面的实验都是围绕这一步进行的。
4 r) c% a7 S/ @9 j- u, T7 d
在 include 目录中,通用的 Linux 头文件都在该文件下。
& W2 R: @' y9 K& q! _: X
& Z1 _/ J C/ R. _" F
如下图所示,部分目录如下。下面的这些目录,几乎不需要去动其中任何一个文件。
- g( A* J* p! I- l$ J$ L* c" `9 h; ^
7 K; m: X n, c; c
如下图所示,有内核编程的范例,实现安全性的代码,声卡设备驱动等
! e$ r, C6 {) E- G( Q1 M; |4 d
还有内核裁减配置工具目录 tools,这一部分实现的功能是将.c 编译成目标文件,连接合并成可运行的内核镜像文件等。提供给大家的内核源码一百多 M,最后编译成的 zImage 只有不到 5M,这都是依靠这个工具来实现的,后面会有针对性的实验来教大家如何使用编译工具。
% |6 P2 o& M$ o2 j
更多视频内容:哔哩哔哩搜索北京迅为
# w9 v3 f" b( U
! P3 k+ \7 o2 P$ G9 m5 y8 i
' ?! m/ {4 a6 ?. L _+ P- d w5 k
欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/)
Powered by Discuz! X3.2