Linux内核分析
- 基本概念
1.从技术上说linux是一个内核。
2.“内核”指的是一个提供硬件抽象层、磁盘及文件系统控制、多任务等功能的系统软件,一个内核不是一套完整的操作系统。
3.通常我们使用的linux系统是一个集linux内核、工具集、各种库、桌面管理器、应用程序等一体的一个发布包(发行版)。
- 内核版本
目前linux系统采用A. B.C.D的版本号管理方式
-A表示linux的主版本号
-B表示linux的次版本号, B为偶数表示稳定版本,奇数表示开发中的版本
-C表示linux的发行版本号
-D表示更新版本号
主版本(X.Y)
1.0 2.0 2.2 2.4 2.6 3. x
偶数版本代表稳定版本,奇数代表开发中的版本
- 内核子系统
进程管理
内存管理
文件系统
网络协议
设备管理
子系统难点:内核调度算法和中断处理,linux不是实时的操作系统(本质是时间片方式),实时操作系统Vxwork(进程优先级调度或中断)。
- 内核结构框图

linux系统分成三层:硬件层–>内核层–>应用层
- 编译内核
所有需要用到符号文件的都要先拷到linux独有文件夹编译,windows和linux共有的共享文件夹编译因为windows不支持符号文件的原因,不会有符号文件。
1 | make uImage # 编译内核 |
添加临时环境变量示例:export PATH=/home/linux/gcc-4.6.4/bin/:$PATH
编译成功内核存放目录:arch/arm/boot/uImage
设备树:3.14之前内核没有设备树,描述外部设备的,例如:连接管脚
- 内核目录
目录1:…/linux -3.14 -fs412/arch/arm/boot
uImage:正对u-boot的内核,增加了识别u-boot的头信息。
zImge:内核压缩的一种格式。
Image:未压缩的内核。
dts:设备树文件夹
目录2:…/linux -3.14 -fs412/drivers
watchdog、net、input、media等设备驱动文件夹。
目录3:…/linux -3.14 -fs412/kernel
内核调度等内核相关
目录4:…/linux -3.14 -fs412/net

网络相关的协议,例如:TCP/IP
通过将与驱动硬件相关的配置剥离出去,用一个设备树文件描述硬件信息:连接管脚等与硬件相关的,drivers里面只实现具体的驱动硬件的逻辑.。

推想drivers层功能: app层定义一个设备句柄,open一个设备得到一个设备实体(open是drivers提供给app层的api),设备句柄指向这个实体,以后操作设备就是操作这个设备句柄。

u-boot启动过程:间前面章节
内核启动流程:
a. 自解压内核decompess(arch/arm/boot/compressed/head. s)代码位置。
b. 运行内核汇编部分head. s入口stext (arch/arm/kernel/head. S),检测合法性(CPU类型, 机器类型,通过读cpu寄存器信息)。
c. 运行内核c部分start_kernel (init/main.c)
1.CPU,机器参数的安装 setup_arch。
2.中断,定时,终端,内存等最基本的初始化(之前bootloader也有一样的初始化,因为bootloader和内核不再同一个地址空间)。
3.创建核心进程kernel_init运行,启动多任务调度。
d. 挂载rootfs。
e. 运行第一个应用程序init (一般是linbxrc)。

1.点灯法
1dr r0 =0x11000c40 @GPK2 7 1ed2
Idr r1, [r0]
bic r1, rl, #0xo000
orr rl, r1, #0x100000000
str rl, [r0]
1dr ro,=0x11000c44
mov r1, #Oxff
str r1, [r0]
2.printk打印输出信息
puts (内核解压前)
printascii (console初始化前)
printk (内核解压后,信息输出显示是在console初始化之后)
通过proc在运行时查看和修改日志级别
cat/proc/sys/kernel/printk 显示 4417
echo “7417” >/proc/sys/kernel/printk后
cat /proc/sys/krnel/printk 显示7417
打印级别:


3.制造错误:


- 本文作者: 龙兄嵌入式
- 本文链接: https://hexo.880755.xyz/1970/01/01/zblog/download/65.Linux内核分析/
