|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
实验 01 内核开发基础-基于迅为4412开发板
`9 |, [) e% R" z1.1 本章导读9 `2 |4 @) _" {
本实验将带您学习一遍 Linux 的框架和源码目录结构。
: w! Z: U: X3 V2 q1 U4 k/ F从任何地方拿到的 Linux 源码,都有几百 M 大小,包含上万个文件。; _/ G3 f$ d* {" m( G
这么多的文件!那么问题来了,应该从什么地方入手呢?" P5 H) ~5 S2 g: q. m5 G( [
哪些内容应该“深入研究”?- [* ~5 _6 O/ O! J) |7 k
哪些内容应该“惊鸿一瞥”?$ N2 q) N7 _5 e
哪些内容应该“束之高阁”?$ C2 e" \ `6 ^. f2 ^; M
本期实验“内核开发基础”,带大家快速梳理一遍,把和学习无关的内容剔除掉。: u+ q. H; z4 _: }
1.1.1 工具& u" c" ^% p5 E+ Z
1.1.1.1 硬件工具2 N& Y H& P! C( T/ M$ d
PC 机一台, P2 q3 D( ^! s3 @8 A
1.1.1.2 软件工具$ r1 X* b- K; h0 K8 S2 F/ N7 K
软件 Source Insight4 g( c" ?: { d2 J% `
Linux 源码“iTop4412_Kernel_3.0_xxx”(在光盘目录“/Android 源码”文件夹下,xxx表示日期)
8 | m/ v9 C. m3 o+ {1.1.2 预备课程" F8 T$ Y9 W6 w( Y7 s
视频教程“01-烧写、编译以及基础知识视频”→“实验 12-使用 Source Insight 加载和阅读内核源码”9 _0 P2 k! t- y6 L- B2 R7 a4 L4 h
使用手册“3.5 Source Insight 的安装和使用”
* r. P. O2 C0 I0 L/ d; i. c1.1.3 视频资源: y. G3 [) W \3 j
本节配套视频为“视频 01_内核开发基础”
, p2 j+ h, U$ Z: p0 m. I1 K/ ^, Y1.2 学习目标
4 D0 N, o+ t) u: [' b! N& U$ r; D本章需要学习以下内容:
+ c c0 @* X# X' V8 z# W4 G4 {理解 Linux 体系结构5 N8 j: _2 s: P' j* E, b9 A9 q# {8 ?
了解 Linux 内核结构
1 z# c% [8 ^6 i8 l8 `) d" f1 H了解 Linux 内核源码目录结构( M, w r; X. b' H4 j1 l* t! ~
了解学习 Linux 的大方向→驱动2 `, x9 d8 s/ i5 _. {6 v
1.3 Linux 体系结构 n1 L: e! z9 x0 [2 ~
如下图所示,Linux 体系结构,从大的方面可以分为用户空间(User Space)和内核空间(Kernel Space)。' y/ i1 t" B2 M* y5 g+ K
4 C1 z/ W P& ]: r1 K4 e7 R
用户空间中包含了 C 库,用户的应用程序。在某些体系结构图中还包含了 shell,当然shell 脚本也是 Linux 体系中不可缺少的一部分。; C% W6 D' `. S1 t/ g# T
内核空间包括硬件平台、平台依赖代码、内核、系统调用接口。- P: `6 H Q" ^3 s: L
在任何一个现代操作系统中,都是分层的。为什么需要分层呢?
# {6 }- | [" s3 f* ?1 E从程序员的角度分析,将 linux 底层和和应用分开,将 linux 底层和应用分开,做应用的做应用,做底层的做底层,各干各的。经济学的基本原理是,分工产生效率。0 l; O: @7 [' X9 x8 @
从安全性的角度分析,是为了保护内核。现代 CPU 通常都实现了不同的工作模式。
( N% K$ H Q& y5 t6 o以 ARM 为例:ARM 实现了 7 种工作模式,不同模式下 CPU 可以执行的指令或者访问的寄存器不同: (1)用户模式 usr (2)系统模式 sys(3)管理模式 svc(4)快速中断 fiq(5)外部中断irq(6)数据访问终止 abt(7)未定义指令异常。如果任何一个上层应用都可以调用都可以调用寄存器,那样肯定是无法稳定执行的。而且因为出现了这个问题,出现了一个新的学科“现代操作系统”,如果大家感兴趣可以看一下“现代操作系统”相关文章或者书籍。' M% [# n8 N4 c
以 X86 为例:X86 实现了 4 个不同级别的权限,Ring0—Ring3 ;Ring0 下可以执行特权指令,可以访问 IO 设备;Ring3 则有很多的限制
+ D! E# u6 m! _4 i9 x% S" }如果分析一下 Android 的,这方面做的更加“丧心病狂”,Android 所有的 APK 应用程序,都是在 Java 虚拟机上面运行,应用程序更加远离底层。
9 `+ g/ \) B. }另外,用户空间和内核空间是程序执行的两种不同状态,可以通过“系统调用”和“硬件中断”来完成用户空间到内核空间的转移。
2 u( W; T0 m0 g: e! D4 a1.4 Linux 内核结构
6 A- i5 r i \+ C% ~, G这一节,分析一下内核结构。2 S+ P2 r- |5 d0 s, p
如下图所示,是 Linux 内核结构图。
5 j/ r5 u. T3 ^4 `& ] 5 x/ V6 e4 w" n2 w+ O: T
SCI 层(System Call InteRFace),这一层是给应用用户空间提供一套标准的系统调用函数来访问 Linux。前面分析 Linux 体系结构的时候,介绍过任何一类现代操作系统都不会允许上层应用直接访问底层,在 Linux 中,内核提供了一套标准接口,上层应用就可以通过这一套标准接口来访问底层。$ S3 Q3 T9 u. u3 D# f$ F
PM(Procees Management),这一部分包括具体创建创建进程(fork、exec),停止进程(kill、exit),并控制他们之间的通信(signal 等)。还包括进程调度,控制活动进程如何共享 CPU。这一部分是 Linux 已经做好的,在写驱动的时候,只需要调用对应的函数即可实现这些功能,例如创建进程、进程通信等等。; G0 q" L2 p5 A6 T! G5 O/ v
MM(Memory Management),内存管理的主要作用是控制多个进程安全的共享内存区域。2 p) f: O: b# \/ ~ h& I6 e
VFS(Virtual File Systems),虚拟文件系统,隐藏各种文件系统的具体细节,为文件操作提供统一的接口。在 Linux 中“一切皆文件”,这些文件就是通过 VFS 来实现的。Linux 提供了一个大的通用模型,使这个模型包含了所有文件系统功能的集合。如下图所示,是一个虚拟文件系统的结构图。% k2 q# |; a- ^: u- W; n& r
![]()
0 p3 e1 O5 R. zDevice Drivers 设备驱动,这一部分就是需要学习和掌握的。Linux 内核中有大量的代码在设备驱动程序部分,用于控制特定的硬件设备。
# |/ o$ \2 H- T2 Y5 nLinux 驱动一般分为网络设备、块设备、字符设备、杂项设备,需要编写的只有字符设备,杂项设备是不容易归类的一种驱动,杂项设备和字符设备有很多重合的地方。
# I. `; v! m Y" ^- \! ]8 Y. w网络协议栈,Linux 内核中提供了丰富的网络协议实现。
4 M7 l: D U) t5 d/ A1.5 Linux 内核源码目录结构" V$ ^+ o+ v# K: m9 }8 E
Linux 内核源码采用树形结构。功能相关的文件放到不同的子目录下面,使程序更具有可读行。
+ u% Y; F' |' U使用 Source Insight 打开源码,如下图所示,可以看到源码是树形结构。3 U$ w" i3 O1 i3 L8 B$ q2 h |' M
5 m8 k& y' G" u& z" D
下面来介绍每一个目录的作用。' J# i: N' C- v6 e
arch 目录是平台目录。处理器原厂提供一套 Linux 内核的源码,那么在这个目录下都有一套针对具体处理器 CPU 的子目录。每个 CPU 的子目录,又进一步分解为 boot,mm,kernel 等子目录,分别控制系统引导,内存管理,系统调用,动态调频,主频率设置部分等。
7 N9 r$ \5 n0 a2 w" H* u在 arch 目录中有关键的平台文件。任何一款支持 Linux 的处理器,都有一部分内核代码是针对特定的处理器来提供的,具体的实现就是通过平台文件。. L9 d% k0 w+ c& d5 z2 S, Y+ | F
迅为 iTOP-4412 的平台文件,是 arch→arm→mach-exynos→mach-itop4412.c。
! i5 u% i! [! ~0 A9 Aarch→arm→boot 目录,默认编译生成的内核镜像是在这个目录下。/ _. q5 {3 K, b" d" D
在 arch→arm→kernel 目录中,有针对具体 CPU 处理器的代码,有相关内核特性实现方式,如信号处理等。这一部分当然是芯片厂商做好了,4412 的这部分就是三星已经做好的部分。: K& g: O( g* ]2 f) ?
在 arch→arm→lib 目录中,有一些和硬件相关库函数,后面学习驱动的时候会使用到。
1 J) |2 o i; l/ [ J在 arch→arm→tools 目录中,包含了生成镜像的工具。
+ q" L. h x+ Y: }![]()
8 b9 ]' W; R: E8 W$ h! m. P- G如下图所示。
' |* f- b7 X& c3 @! G在 binary 目录中,有一些无源码的驱动以二进制放到该文件夹,例如一些测试版本或者不愿意公布源码,都可以将二进制文件放到这个目录中。9 Y8 F6 Q# d% I7 F: d
在 drivers 目录中,就是需要重点学习的部分,后面的实验都是围绕这一步进行的。
& B+ Y* m) Q4 l# m7 B在 include 目录中,通用的 Linux 头文件都在该文件下。/ T; N/ v- ~* c T; w
1 z0 H% a& p1 b2 E
如下图所示,部分目录如下。下面的这些目录,几乎不需要去动其中任何一个文件。" X% ~& q* c5 k) _6 t5 g
![]()
- U2 l( A, a7 u/ D如下图所示,有内核编程的范例,实现安全性的代码,声卡设备驱动等
+ A9 T" q, N' k- S! d0 h; [9 K还有内核裁减配置工具目录 tools,这一部分实现的功能是将.c 编译成目标文件,连接合并成可运行的内核镜像文件等。提供给大家的内核源码一百多 M,最后编译成的 zImage 只有不到 5M,这都是依靠这个工具来实现的,后面会有针对性的实验来教大家如何使用编译工具。2 D, [9 }' H0 i4 q: B1 j' D" K5 o
更多视频内容:哔哩哔哩搜索北京迅为( x+ c: ?' R b& k+ _
![]()
9 M" {! W4 {" d( e5 |0 B" o1 Q7 L
- [0 I* X) v; [# C# J |
|