首页
|
新闻
|
新品
|
文库
|
方案
|
视频
|
下载
|
商城
|
开发板
|
数据中心
|
座谈新版
|
培训
|
工具
|
博客
|
论坛
|
百科
|
GEC
|
活动
|
主题月
|
电子展
注册
登录
论坛
博客
搜索
帮助
导航
默认风格
uchome
discuz6
GreenM
»
MCU 单片机技术
»
X86
» linux内核驱动-内核初涉
返回列表
回复
发帖
发新话题
发布投票
发布悬赏
发布辩论
发布活动
发布视频
发布商品
linux内核驱动-内核初涉
发短消息
加为好友
苹果也疯狂
当前离线
UID
852722
帖子
10369
精华
0
积分
5185
阅读权限
90
在线时间
277 小时
注册时间
2011-8-30
最后登录
2016-7-18
论坛元老
UID
852722
1
#
打印
字体大小:
t
T
苹果也疯狂
发表于 2015-7-27 21:55
|
显示全部帖子
linux内核驱动-内核初涉
思维导图
,
linux
,
程序
,
接口
,
开发
一、为什么要学习内核?
有些人要学习内核,而有些人则可以不学习它。你如果以后要从事系统研发或驱动开发的话,就要学习内核。
刚刚接触内核,主要学习内核的接口函数。不要深入的去读内核,因为你读也读不懂,内核代码庞大如野兽一般不可驾驭。
学习内核主要掌握层次学习法,即从头开始学习,一环紧扣一环。
内核学习的四步学习法:1、核心理论学习-概念与函数原型2、范例程序分析3、思维导图设计4、亲自编写代码
二、linux内核简介
1、linux体系结构
分为两部分:用户空间和内核空间
2、linux为什么要分为用户空间和内核空间
现代CPU通常实现了不同的工作模式,以ARM为例,实现了7中工作模式。X86实现了4中不同的级别:Ring0-Ring3. Ring0下可以执行特权指令,可以访问IO设备等,在Ring3则有很多限制。linux系统利用CPU的这一特性,使用了其中两个级别分别运行linux内核与应用程序,这样使操作系统本身得到充分的保护。例如:如果使用X86,用户代码运行在Ring3,内核代码运行在Ring0.内核空间与用户空间是程序执行的两种不同状态,通过系统调用和硬件中断能够完成从用户空间到内核空间的转移。
3.linux的内核构架
系统调用接口
SCI层为用户空间提供了一套标准的系统调用函数来访问Linux内核,搭起了用户空间到内核空间的桥梁。
进程管理(PM)是创建进程,停止进程,并控制它们之间的通信。进程管理还包括控制活动进程如何共享CPU,即进程调度。
内存管理(MM)的主要作用是控制多个进程安全地共享内存区域。
网络协议栈(Network Stack)为linux提供了丰富的网络协议实现。
虚拟文件系统(VFS)隐藏各个文件系统的具体细节,为文件操作提供统一的接口。
设备驱动(DD):linux内核中有大量代码都在设备驱动程序中,它们控制特定的硬件设备。
三、linux内核源代码结构
1、下载源代码地址
www.kernel.org
2、linux内核源代码采用树形结构进行组织,非常合理地把功能相关的文件都放在同一个子目录下,使得程序更具可读性。
arch目录:arch是architecture的缩写。内核所支持的每种CPU体系,在该目录下都有对应的子目录。每个cpu的子目录,又进一步分解为boot,mm,kernel等子目录,分别包含控制系统引导,内存管理,系统调用等。/* X86英特尔cpu与之相兼容体系结构的子目录:boot 引导程序compressed内核解压缩 tools生成压缩内核映像的程序 kernel相关内核特性实现方式,如信号处理、时钟处理 lib 硬件相关工具函数*/
documentation内核文档
drivers设备驱动文档
include内核所需要的头文件。与平台无关的头文件在include/linux子目录下,与平台有关的头文件则放在相应的子目录中。
fs目录存放各种文件系统的实现代码。每个子目录对应一种文件系统的实现,公用的源程序用于实现虚拟文件系统vfs
"|--devpts是/dev/pts虚拟文件系统
||--ext2是第二扩展文件系统
||--fat是MS的fat32文件系统
||--isofs 是IsO9660光盘cd-rom上的文件系统
net是网络协议的实现代码
||--802 802无线通讯协议核心支持代码
||--appletalk 与苹果系统连网的协议
||--ax25 AX25无线INTERNET协议
||--bridge 桥接设备
||--ipv4 IP协议族V4版32位寻址模式
||--ipv6 IP协议族V6版
四、linux内核的配置和编译
代码是如何转化为烧写或安装到硬件平台中的系统映像文件的?
1、为什么要配置内核
选出需要的,去掉不要的!1、硬件的需求2、软件的需求
下载
内核后要在linux中解压缩,不要在windows下解压缩因为windows下不区分大小写,而linux操作系统区分大小写。
进入内核的文件下:
2、内核的配置:
make config:基于文本模式的交互式配置
make menuconfig:基于文本模式的菜单型配置
<*>文件经过编译由.c文件到.o文件,最后链接压缩为内核镜像,它存放在内存。
<M>内核模块,同上经过编译后会把.o文件安装到硬盘。
< >表示不选择该功能
配置结果文件是隐藏文件,可以用ls -a 在内核文件下查看.config version
上面介绍的是一种方法,不过作为初学者我们往往是在一个已有的配置文件基础上,通过修改得到新的配置文件,linux内核提供了一系列可供参考的内核配置文件,位于Arch/cpu/configs
接下来,我们利用
虚拟机
上的linux
系统
的配置文件来创建自己的升级版内核,并在虚拟机上运行该内核。
图:
3、编译内核(编译内核、编译内核模块、制作ramdisk)
3.1、编译内核
make zImage只能编译小于512K的内核
make bzImage我们一般会使用这种方法编译内核
如需获取详细编译信息,可使用:
make zImage V=1
make bzImage V=1
编译好的内核位于arch/cpu/boot/目录下***
3.2编译内核模块
make modules 编译内核模块
make modules_install 将编译好的内核模块,从内核源代码目录复制到/lib/modules下**,为打包做好准备
经过第一步编译后,散落在各个文件下的.ko文件为内存模块。需要集中移动到/lib/modules这个就由make modules_install来完成
3.3制作init ramdisk
方法:mkinitrd initrd-$version $version
例如:mkinitrd initrd-2.6.32 2.6.32
通过uname -r 获得正在运行的内核版本
*$version可以通过查询/lib/modules下的目录得到
4、安装内核
1、cp arch/x86/boot/bzImage
/boot/vmlinuz-$version
2、cp initrd-$version /boot/
3、修改/etc/grub.conf的后四行
5、清理内核
make clean 清理编译内核生产的.o文件
make distclean 清理编译内核生产的.o文件和.config $version
记忆几个命令
rpm -qa | grep kernel 找到内核包信息
rpm -e kernel-内核包名
收藏
分享
评分
回复
引用
订阅
TOP
返回列表
无源元件
电源与功率管理
模拟电路
测试测量
电子制造
电商论坛
Pine A64
资料下载
方案分享
FAQ
行业应用
消费电子
便携式设备
医疗电子
汽车电子
工业控制
热门技术
智能可穿戴
3D打印
智能家居
综合设计
示波器技术
存储器
电子制造
计算机和外设
软件开发
分立器件
传感器技术
无源元件
资料共享
PCB综合技术
综合技术交流
EDA
MCU 单片机技术
ST MCU
Freescale MCU
NXP MCU
新唐 MCU
MIPS
X86
ARM
PowerPC
DSP技术
嵌入式技术
FPGA/CPLD可编程逻辑
模拟电路
数字电路
富士通半导体FRAM 铁电存储器“免费样片”使用心得
电源与功率管理
LED技术
测试测量
通信技术
3G
无线技术
微波在线
综合交流区
职场驿站
活动专区
在线座谈交流区
紧缺人才培训课程交流区
意见和建议