linux内核驱动-内核初涉

2016-03-31 16:03 39 1 收藏

想不想get新技能酷炫一下,今天图老师小编就跟大家分享个简单的linux内核驱动-内核初涉教程,一起来看看吧!超容易上手~

【 tulaoshi.com - 服务器 】

linux内核驱动-内核初涉

   一、为什么要学习内核?

  有些人要学习内核,而有些人则可以不学习它。你如果以后要从事系统研发或驱动开发的话,就要学习内核。

  刚刚接触内核,主要学习内核的接口函数。不要深入的去读内核,因为你读也读不懂,内核代码庞大如野兽一般不可驾驭。

  学习内核主要掌握层次学习法,即从头开始学习,一环紧扣一环。

  内核学习的四步学习法:1、核心理论学习-概念与函数原型2、范例程序分析3、思维导图设计4、亲自编写代码

  二、linux内核简介

  1、linux体系结构

  分为两部分:用户空间和内核空间

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内核的配置和编译

  代码是如何转化为烧写或安装到硬件平台中的系统映像文件的?

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/fuwuqi/)

  1、为什么要配置内核

  选出需要的,去掉不要的!1、硬件的需求2、软件的需求

  下载内核后要在linux中解压缩,不要在windows下解压缩因为windows下不区分大小写,而linux操作系统区分大小写。

  进入内核的文件下:

  2、内核的配置:

  make config:基于文本模式的交互式配置

  make menuconfig:基于文本模式的菜单型配置

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/fuwuqi/)

  *文件经过编译由.c文件到.o文件,最后链接压缩为内核镜像,它存放在内存。

  内核模块,同上经过编译后会把.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-内核包名

来源:http://www.tulaoshi.com/n/20160331/2051714.html

延伸阅读
Linux中的大部分驱动程序,是以模块的形式编写的.这些驱动程序源码可以修改到内核中,也可以把他们编译成模块形势,在需要的时候动态加载. 一个典型的驱动程序,大体上可以分为这么几个部分: 1,注册设备 在系统初启,或者模块加载时候,必须将设备登记到相应的设备数组,并返回设备的主驱动号,例如:对快设备来说调...
  第十四章 Linux核心资源 本章主要描叙寻找某个特殊核心函数时用到的Linux核心资源。 本书并不要求读者具有C编程语言的能力或者拥有Linux核心源代码来理解Linux核心工作原理。但是如果 对核心源代码进行阅读将加深对Linux操作系统的理解。本章提供了一个核心源代码的综述。 从哪里得到Linux核心源码 所有主要Linux分发版本...
驱动程序的使用可以按照两种方式编译,一种是静态编译进内核,另一种是编译成模块以供动态加载。由于uClinux不支持模块动态加载,而且嵌入式Linux不能够象桌面Linux那样灵活的使用insmod/rmmod加载卸载设备驱动程序,因而这里只介绍将设备驱动程序静态编译进uClinux内核的方法。 下面以uClinux为例,介绍在一个以模块方式出现的驱动程...
这是一篇关于内核编译的文章,作者是双眼皮的猪,觉得好,所以收藏了 菜鸟浅谈Linux内核编译过程...菜鸟编译Linux内核 双眼皮的猪 菜鸟俺,最近研究了一下Linux内核的编译,有些许心得,望同大家分享一下,故有此文…我们这里要谈的不涉及到源码,只是一些内核编译的步骤及相关知识…因为本人是菜鸟。所以,也就希望和菜鸟们分享一下… 首先,...
标签: 服务器
Linux内核的文件预读详解   Linux文件预读算法磁盘I/O性能的发展远远滞后于CPU和内存,因而成为现代计算机系统的一个主要瓶颈。预读可以有效的减少磁盘的寻道次数和应用程序的I/O等待时间,是改进磁盘读I/O性能的重要优化手段之一。本文作者是中国科学技术大学自动化系的博士生,他在1998年开始学习Linux,为了优化服务器的性能,他开...

经验教程

300

收藏

37
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部