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文件,最后链接压缩为内核镜像,它存放在内存。

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

(0)

相关推荐

  • Linux内核驱动fsync机制实现图解

    在Linux内核中的IO模型基本分为4类: 1、同步阻塞I/O 2、同步非阻塞I/O 3、异步阻塞I/O 4、异步非阻塞I/O 同步:应用显式地通过函数访问数据,在此函数返回时就会得到结果(成功或失败 ...

  • 手动编译安装Linux网卡驱动

    以D-Link530的网卡进行模块的编译. 由于Linux的默认内核已经建立很多网卡驱动程序模块,所以在编译网卡模块之前就要确认网卡芯片是否被支持,如果被支持,就不需要编译模块. D-Link530的 ...

  • Linux系统驱动开发调试技术指南

    一、使用printk 这是驱动开发中最朴实无华,同时也是最常用和有效的手段。scull驱动的main.c第338行如下,就是使用printk进行调试的例子,这样的例子相信大家在阅读驱动源码时随处可见。 ...

  • AMD上线Linux专版驱动17.10:支持Ubuntu16.04.2/修复BUG

    AMD近日发布了AMDGPU-PRO 17.10驱动,服务Linux平台. 距离上一版AMDGPU-PRO 16.60近两个月,AMD在添加了对HD 7xxx/8xxx 的支持后,于17.10中修复了 ...

  • Linux内核与根文件系统的关系详解

    Linux内核与根文件系统的关系 开篇题外话:对于Linux初学者来说,这是一个很纠结的问题,但这也是一个很关键的问题! 一语破天机: “尽管内核是 Linux 的核心,但文件却是用户与操作系统交互所 ...

  • LINUX和WINDOWS的内核区别

    原文链接:        https://www.cnblogs.com/xiaolincoding/p/14419269.html作者:小林codingWindows 和 Linux 可以说是我们比 ...

  • Linux内核的ioctl函数学习

    Linux内核的概念 Linux是最受欢迎的自由电脑操作系统内核。它是一个用C语言写成,符合POSIX标准的类Unix操作系统。Linux最早是由芬兰黑客 Linus Torvalds为尝试在英特尔x ...

  • Win10一周年更新内核模式驱动强制执行新政策 必须获得微软数字签名

    微软曾在2015年7月底发布首个Win10正式版时推出了一项政策,要求内核模式驱动都必须获得微软的数字签名.然而由于种种因素所限,微软并没有强制执行该政策. 如今Windows10一周年更新正式版发布 ...

  • linux-2.6内核升级详细文档

    序 做一件事情,首先要知道自己在干什么,而不是盲目得升级内核,现在升级内核有点泛滥,sigh 首先让我们先了解一下2.6内核的新特性 一、01.模块子系统(Module Subsystem)、统一设备 ...