linux kernel 杂谈
首先介绍一下背景吧,工作三个星期了.复习了一波u-boot,跟了一下事件上报,搞了下平台设备,扣了一个内存检查代码.
想想生活是不是有点无聊.对啊,真的很无聊!!!!
无聊也没有办法啊,所以找点方法去跟上生活的节奏.
第一天,就稍微讲一下linux kernel 是干吗的吧.
前面介绍的u-boot做的不好我知道,但是慢慢来吧
kernel 是干嘛的,有很多人有这个疑问,在很久以前我也有这个疑问,我在很长一段时间都认为kernel 就是一堆驱动的集合,这个说是正确也是正确,但是不全面.
在现在我认为,kernel 就是做了一个硬件管理为上层提供一个稳定的安全的便捷的操作接口的功能.
引用http://www.cnblogs.com/licheng/archive/2008/07/05/1236744.html
linux kernle 主要由系统调用接口(SCI) , 进程管理(PM) , 内存管理(MM),虚拟文件系统(VFS) , 网络协议栈(NET),CPU体系结构和设备驱动(DD) 等7个组件构成.
今天我所要讲的是linux -3.0.35 的大概情况,
拿到内核 , 首先第一件要做的事就是读README , 看到那里 , 我们知道了第一个目录:Documentation.
如果你以前不懂内核或者是以前了解过别的内核, 如果你在linux - 3.0.35这个内核版本的开发过程中遇到什么问题 , 都可以到这里面去寻找答案.
在 Documentation / DocBook 子目录中, 包含了一些开发指南在里面 , 你可以通过在次目录下make pdfdocs 制作PDF开发帮助文档
CONFIGURING the kernel :
一般情况下就是make menuconfig , 进入对话框菜单栏进去配置 , 配置你所需要的环境变量及一些必要的模块
还有常用的时针对开发板的配置(用于嵌入式系统)
make ARCH=arm smdk2410_defconfig
配置完毕之后就可以编译了
make -j100
编译完了会在相应的目录生成zImage 映像文件
比如说arm 架构的就是arch/arm/boot/zImage 文件.
在顶层文件夹中 , 有一些相关的目录需要我们了解一下:
arch : 与平台架构相关的目录
drivers : 设备驱动程序相关目录
fs : 各种支持的文件系统 , 如ext , fat 等
include : 头文件相关的目录 , 其中 , 和系统相关的头文件在 include/linux 中 , 如果你想学内核 , 入门级别便是把这个头文件搞熟练
init : 内核初始化代码 (注意不是系统引导代码)
ipc : 进程间通信代码
kernel : 内核的最核心部分 , 包括进程调度 , 定时器 , 和平台相关的一部分代码在 arch/*/kernel 当中
lib : 库文件代码
mm : 内存管理相关代码
net : 网络相关代码 , 实现了各种常见的网络协议
scripts : 编译内核所用的脚本
security : 主要是一个SElinux 的模块
sound : 常用的音频设备的驱动程序等
usr : 早期用户空间代码
基本上常见的几个目录结构都在上面 , 不过千万不要小看上面的那些目录 , 可能你当初跟u-boot 已经时非常吃力 , 可能kernel 你会更吃力
我记得以前有个人给我做了一个简单的比方吧 , 就是好比u-boot 是一个福田区 , 那么kernel 可能就是一个广东省 .
学习内核的这条路非常的长远 , 希望大家持之以恒 , 这句话同样也是对自己说的.
下面给大家讲几个基本的概念吧.
第一个就是设备驱动:
设备驱动就是为用户访问特定的硬件设备提供一套标准的内部编程接口
上层如果想访问底层硬件的话是一个这样的流程
应用程序 ----> 系统调用 -----> 驱动接口 ----> 驱动 -----> 硬件操作
上面的只是一个最简单的模型 , linux 内核里面为了方便上层用户调用系统接口 以及 为了方便底层驱动开发设计了很多模块模型
驱动的作用在于提供机制, 而不是提供策略 , 也就是说 , 驱动程序处理的是怎么使硬件使能的问题 , 怎么操作硬件那是上层用户的事情.
linux 设备可分为三大块:
字符设备:
char 设备是能够按字节流访问的设备 , 例如串口设备(dev / ttyUSB0) , 字符设备可以通过文件系统节点访问
块设备:
block 设备是按块 读取数据的设备 , 比如磁盘 , 在块设备上能容纳文件系统 , char 设备和block 设备的接口完全不同
网络设备:
网络接口通常是个硬件设备,如网卡。网络接口由内核中的网络子系统驱动,负责发送和接收数据包。
网络接口驱动程序不需要对数据包的内容进行解析,它只负责收发数据包。
由于不是面向数据流,因此很难映射到文件系统中的节点,用户程序是通过分配一个名字,
如eth0访问网络接口的。