找回密码
 注册
关于网站域名变更的通知
查看: 302|回复: 0
打印 上一主题 下一主题

嵌入式Linux驱动开发4412-实验01内核开发基础

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-12-1 11:16 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
实验 01 内核开发基础-基于迅为4412开发板
+ x% A* P4 u; V* b1.1 本章导读( w: l( C9 v2 z
本实验将带您学习一遍 Linux 的框架和源码目录结构。
, F% d% [6 r" x9 y* |2 u8 D从任何地方拿到的 Linux 源码,都有几百 M 大小,包含上万个文件。
1 z& {( E& Q+ ]' F这么多的文件!那么问题来了,应该从什么地方入手呢?- [! R- R8 R. E0 n! M( v4 }" \! u
哪些内容应该“深入研究”?
- G& Z  O8 _* i9 a) q1 ?哪些内容应该“惊鸿一瞥”?/ R/ Y: M1 m. M+ }
哪些内容应该“束之高阁”?4 n" i8 [' r8 G) \* V- [2 F- N; L
本期实验“内核开发基础”,带大家快速梳理一遍,把和学习无关的内容剔除掉。
7 K" w' A( z" m1.1.1 工具
- a. M, x$ L- I$ |1.1.1.1 硬件工具8 Z7 K. k3 o; f0 \* d- I
PC 机一台
' B8 p/ p' v) e4 Z& V1.1.1.2 软件工具
" G& T  M. ?8 O' _$ n软件 Source Insight) h& D( A2 e: g; I  \3 Q6 w5 L9 A0 J3 }
Linux 源码“iTop4412_Kernel_3.0_xxx”(在光盘目录“/Android 源码”文件夹下,xxx表示日期)
6 a" u* Y$ l  s. y$ b9 B4 v1.1.2 预备课程
4 t" J$ R7 k& B* h9 u6 k视频教程“01-烧写、编译以及基础知识视频”→“实验 12-使用 Source Insight 加载和阅读内核源码”
8 E7 G+ l( X) s% j使用手册“3.5 Source Insight 的安装和使用”
3 c4 d0 U+ n; v% r. n& |  e4 |& B9 |1.1.3 视频资源
& d1 r; i: l& p2 x本节配套视频为“视频 01_内核开发基础”) v0 L7 \/ T5 d; h
1.2 学习目标
! o, ?# V7 r; J& a4 e本章需要学习以下内容:0 o( h; ~* A* h, S! U: N
理解 Linux 体系结构) p$ e) h8 ^' Y8 m& Z
了解 Linux 内核结构
# B6 k5 U" e! G4 r& n8 h& }了解 Linux 内核源码目录结构
) `6 O  P, j/ X% [% g( u了解学习 Linux 的大方向→驱动: L  B& u- z; d2 R
1.3 Linux 体系结构
5 U# V4 _" ?7 e# n2 ~' k如下图所示,Linux 体系结构,从大的方面可以分为用户空间(User Space)和内核空间(Kernel Space)。3 x$ ~$ r1 D+ N1 X, S$ f1 P
$ U8 N, f7 A4 ~( G; w( Y) C- v/ f! @
用户空间中包含了 C 库,用户的应用程序。在某些体系结构图中还包含了 shell,当然shell 脚本也是 Linux 体系中不可缺少的一部分。) }( r* i; A2 X8 j$ P
内核空间包括硬件平台、平台依赖代码、内核、系统调用接口。$ {+ A& o* U4 N( x' H7 u, k
在任何一个现代操作系统中,都是分层的。为什么需要分层呢?7 K0 F3 I8 E; W" z* Y7 ]- m. `& Q
从程序员的角度分析,将 linux 底层和和应用分开,将 linux 底层和应用分开,做应用的做应用,做底层的做底层,各干各的。经济学的基本原理是,分工产生效率。
9 w5 R- W' H8 M: l7 h# F8 M3 s* B从安全性的角度分析,是为了保护内核。现代 CPU 通常都实现了不同的工作模式。
6 r& O! m  O5 P( E, @ARM 为例:ARM 实现了 7 种工作模式,不同模式下 CPU 可以执行的指令或者访问的寄存器不同: (1)用户模式 usr (2)系统模式 sys(3)管理模式 svc(4)快速中断 fiq(5)外部中断irq(6)数据访问终止 abt(7)未定义指令异常。如果任何一个上层应用都可以调用都可以调用寄存器,那样肯定是无法稳定执行的。而且因为出现了这个问题,出现了一个新的学科“现代操作系统”,如果大家感兴趣可以看一下“现代操作系统”相关文章或者书籍。
- a3 x$ [. |8 i* B3 D以 X86 为例:X86 实现了 4 个不同级别的权限,Ring0—Ring3 ;Ring0 下可以执行特权指令,可以访问 IO 设备;Ring3 则有很多的限制
9 S- g, F$ N$ W- v5 h2 l0 f" E如果分析一下 Android 的,这方面做的更加“丧心病狂”,Android 所有的 APK 应用程序,都是在 Java 虚拟机上面运行,应用程序更加远离底层。4 l" o0 a: {& Q0 U
另外,用户空间和内核空间是程序执行的两种不同状态,可以通过“系统调用”和“硬件中断”来完成用户空间到内核空间的转移。
! @8 R  ~- W8 Y1.4 Linux 内核结构" }2 e( O6 I+ h6 m
这一节,分析一下内核结构。$ T3 \4 O2 {* Z3 [
如下图所示,是 Linux 内核结构图。
3 O' A' K6 n5 |+ J: ]
. p* F6 Q7 z: U% q3 a0 y/ ASCI 层(System Call InteRFace),这一层是给应用用户空间提供一套标准的系统调用函数来访问 Linux。前面分析 Linux 体系结构的时候,介绍过任何一类现代操作系统都不会允许上层应用直接访问底层,在 Linux 中,内核提供了一套标准接口,上层应用就可以通过这一套标准接口来访问底层。
) N! i# F" t6 x/ ~' OPM(Procees Management),这一部分包括具体创建创建进程(fork、exec),停止进程(kill、exit),并控制他们之间的通信(signal 等)。还包括进程调度,控制活动进程如何共享 CPU。这一部分是 Linux 已经做好的,在写驱动的时候,只需要调用对应的函数即可实现这些功能,例如创建进程、进程通信等等。
% z0 q# w. Q2 q# J3 |/ kMM(Memory Management),内存管理的主要作用是控制多个进程安全的共享内存区域。
8 ]3 _6 l6 `+ y5 O4 ?. QVFS(Virtual File Systems),虚拟文件系统,隐藏各种文件系统的具体细节,为文件操作提供统一的接口。在 Linux 中“一切皆文件”,这些文件就是通过 VFS 来实现的。Linux 提供了一个大的通用模型,使这个模型包含了所有文件系统功能的集合。如下图所示,是一个虚拟文件系统的结构图。
1 ^* [( G5 V, f; h
+ M7 F* u- b! L$ |$ v7 K! o4 EDevice Drivers 设备驱动,这一部分就是需要学习和掌握的。Linux 内核中有大量的代码在设备驱动程序部分,用于控制特定的硬件设备。: h( P# r5 D' Y' m, k
Linux 驱动一般分为网络设备、块设备、字符设备、杂项设备,需要编写的只有字符设备,杂项设备是不容易归类的一种驱动,杂项设备和字符设备有很多重合的地方。
$ k, N' V" e7 q2 w  y6 R) s网络协议栈,Linux 内核中提供了丰富的网络协议实现。
+ |6 e6 M8 h" Y/ V8 S$ ?1.5 Linux 内核源码目录结构
  |6 y* J/ T( e# k9 [9 \3 H+ C8 mLinux 内核源码采用树形结构。功能相关的文件放到不同的子目录下面,使程序更具有可读行。
7 f4 B6 t. b1 M; C. H# |/ s使用 Source Insight 打开源码,如下图所示,可以看到源码是树形结构。2 @7 d7 y# `* L0 g  U

% a  u+ C. s! g  h4 O下面来介绍每一个目录的作用。
' ?  S: B% Q/ W/ b" X( March 目录是平台目录。处理器原厂提供一套 Linux 内核的源码,那么在这个目录下都有一套针对具体处理器 CPU 的子目录。每个 CPU 的子目录,又进一步分解为 boot,mm,kernel 等子目录,分别控制系统引导,内存管理,系统调用,动态调频,主频率设置部分等。
8 ]9 Q5 n( e9 z6 F+ D5 U7 M! O$ H在 arch 目录中有关键的平台文件。任何一款支持 Linux 的处理器,都有一部分内核代码是针对特定的处理器来提供的,具体的实现就是通过平台文件。
, x7 o$ z9 C3 M- \; n; S迅为 iTOP-4412 的平台文件,是 arch→arm→mach-exynos→mach-itop4412.c。5 S  X7 U/ q* B( M- ]5 T
arch→arm→boot 目录,默认编译生成的内核镜像是在这个目录下。
( A) }% G4 x6 e0 j' Y在 arch→arm→kernel 目录中,有针对具体 CPU 处理器的代码,有相关内核特性实现方式,如信号处理等。这一部分当然是芯片厂商做好了,4412 的这部分就是三星已经做好的部分。
  y% _1 B5 |  E" T8 g在 arch→arm→lib 目录中,有一些和硬件相关库函数,后面学习驱动的时候会使用到。" u" D# `. N# Q9 a1 V- {
在 arch→arm→tools 目录中,包含了生成镜像的工具。
& L, b- ?0 v0 J, v, S1 s. M
9 \$ c& r1 L, _3 j, o如下图所示。
0 X  J+ A0 L: _3 ~# R' L4 }在 binary 目录中,有一些无源码的驱动以二进制放到该文件夹,例如一些测试版本或者不愿意公布源码,都可以将二进制文件放到这个目录中。
& k6 V$ f0 }2 J) T4 V/ d在 drivers 目录中,就是需要重点学习的部分,后面的实验都是围绕这一步进行的。
4 K# h6 k$ h  K( J在 include 目录中,通用的 Linux 头文件都在该文件下。$ e, b- u4 {% Q+ H' g

" I# g* I6 _7 U, Z1 L如下图所示,部分目录如下。下面的这些目录,几乎不需要去动其中任何一个文件。) q& z0 M& [4 y6 F. V3 T* @2 X

$ i# o( D8 i# |7 g, v3 j如下图所示,有内核编程的范例,实现安全性的代码,声卡设备驱动等( k! \# u/ F9 s- e
还有内核裁减配置工具目录 tools,这一部分实现的功能是将.c 编译成目标文件,连接合并成可运行的内核镜像文件等。提供给大家的内核源码一百多 M,最后编译成的 zImage 只有不到 5M,这都是依靠这个工具来实现的,后面会有针对性的实验来教大家如何使用编译工具。. ?4 ?& n' ~. o5 s) \, h1 v
更多视频内容:哔哩哔哩搜索北京迅为
6 |# P7 A; E! q/ T
8 k0 n0 S" w+ R: w* G/ v" I, v" }2 Q5 K
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-25 00:40 , Processed in 0.171875 second(s), 25 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表