内核介绍


文章目录

  • 内核介绍
  • 裸机与操作系统
  • 驱动的分类
  • 内核源码目录
  • 内核源码编译

我的开发环境:
内核版本4.1.15
开发板正点原子阿尔法IMX6ULL开发板
source insight写代码,搭建samba服务器与Ubuntu虚拟机共享代码所在目录,Ubuntu与开发板使用nfs共享代码目录。

裸机与操作系统

无操作系统时的驱动(裸机)
有的时候并不一定需要操作系统,比如用亠些行简单的通断控制,从编程角度来说,直接控制寄存器就可以了,也就是直接和硬件打交道。

有操作系统时的驱动(Linux系统)
从编程角度看:有了操作系统以后,编写驱动就变的比较复杂,要基于Linux种驱动框架进行编程。但是当驱动都按照系统给出的框架进行编程以后,就可以提供一个统一的接口给应用程序调用。

驱动的分类

驱动针对的对象是存储器和外设(包括CPU内部集成的存储器和外设),而不是针对CPU内核。Linux将存储器和外设分为3个基础大类。

  • ·字符设备。
  • ·块设备。
  • ·网络设备。
    字符设备指那些必须以串行顺序依次进行访问的设备,如触摸屏、磁带驱动器、鼠标等。

块设备可以按任意顺序进行访问,以块为单位进行操作,如硬盘、eMMC等。

字符设备和块设备的驱动设计有出很大的差异,但是对于用户而言,它们都要使用文件系统的操作接口open()、close()、read()、write()等进行访问。

在Linux系统中,网络设备面向数据包的接收和发送而设计,它并不倾向于对应于文件系统的节点。
内核与网络设备的通信与内核和字符设备、网络设备的通信方式完全不同,前者主要还是使用套接字接口。

除网络设备外,字符设备与块设备都被映射到Linux文件系统的文件和目录,通过文件系统的系统调用接口open()、write()、read()、close()等即可访问字符设备和块设备。所有字符设备和块设备都统一呈现给用户。Linux的块设备有两种访问方法:一种是类似dd命令对应的原始块设备,如“/dev/sdb1”等;另外一种方法是在块设备上建立FAT、EXT4、BTRFS等文件系统,然后以文件路径如“/home/barry/hello.txt”的形式进行访问。在Linux中,针对NOR、NAND等提供了独立的内存技术设备(Memory Technology Device,MTD)子系统,其上运行YAFFS2、JFFS2、UBIFS等具备擦除和负载均衡能力的文件系统。针对磁盘或者Flash设备的FAT、EXT4、YAFFS2、JFFS2、UBIFS等文件系统定义了文件和目录在存储介质上的组织。而Linux的虚拟文件系统则统一对它们进行了抽象。

应用程序可以使用Linux的系统调用接口编程, 但也可使用C库函数, 出于代码可移植性的目的, 后者更值得推荐。 C库函数本身也通过系统调用接口而实现, 如C库函数fopen() 、 fwrite() 、 fread() 、fclose() 分别会调用操作系统的API open() 、 write() 、 read() 、 close() 。

内核源码目录

Linux内核源代码包含如下目录。(cursor)

  • arch:包含和硬件体系结构相关的代码,每种平台占一个相应的目录,如i386、arm、arm64、powerpc、mips等。Linux内核目前已经支持30种左右的体系结构。在arch目录下,存放的是各个平台以及各个平台的芯片对Linux内核进程调度、内存管理、中断等的支持,以及每个具体的SoC和电路板的板级支持代码。
  • block:块设备驱动程序I/O调度。
  • crypto:常用加密和散列算法(如AES、SHA等),还有一些压缩和CRC校验算法。
  • documentation:内核各部分的通用解释和注释。
  • drivers:设备驱动程序,每个不同的驱动占用一个子目录,如char、block、net、mtd、i2c等。
  • fs:所支持的各种文件系统,如EXT、FAT、NTFS、JFFS2等。
  • include:头文件,与系统相关的头文件放置在include/linux子目录下。
  • init:内核初始化代码。著名的start_kernel()就位于init/main.c文件中。
  • ipc:进程间通信的代码。
  • kernel:内核最核心的部分,包括进程调度、定时器等,而和平台相关的一部分代码放在arch//kernel目录下。
  • lib:库文件代码。
  • mm:内存管理代码,和平台相关的一部分代码放在arch//mm目录下。
  • net:网络相关代码,实现各种常见的网络协议。
  • scripts:用于配置内核的脚本文件。
  • security:主要是一个SELinux的模块。
  • sound:ALSA、OSS音频设备的驱动核心代码和常用设备驱动。
  • usr:实现用于打包和压缩的cpio等。
  • tools 存放Linux用到工具文件夹。
  • virt内核虚拟机相关代码
    内核一般要做到drivers与arch的软件架构分离,驱动中不包含板级信息,让驱动跨平台。同时内核的
    通用部分(如kernel、fs、ipc、net等)则与具体的硬件(arch和drivers)剥离。

内核源码编译

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_v7_defconfigmake ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j16

执行“make distclean”,清理工程,所以 mx6ull_alientek_emmc.sh 每次都会清理一下工程。如果通过图形界面配置了 Linux,但是还没保存新的配置文件,那么就要慎重使用mx6ull_alientek_emmc.sh 编译脚本了,因为它会把你的配置信息都删除掉!
执行“make xxx_defconfig”,配置工程。
执行“make menuconfig”,打开图形配置界面,对 Linux 进行配置,如果不想每次编译都打开图形配置界面的话可以将这一行删除掉。
执行“make”,编译 Linux 源码。
可以看出,Linux 的编译过程基本和uboot 一样,都要先执行“make xxx_defconfig”来配置
一下,然后在执行“make”进行编译。如果需要使用图形界面配置的话就执行“make menuconfig”。

Linux内核源码介绍相关推荐

  1. Linux内核源码分析方法

    说明:这是一个刚接触内核三个月的同学,通过对一个内核特性的分析,总结出一套分析内核的方法. 一.内核源码之我见 Linux内核代码的庞大令不少人"望而生畏",也正因为如此,使得人们 ...

  2. linux内核开发基础(linux内核源码、树莓派源码编译、SD卡挂载)

    首先下载树莓派linux内核源码: 下载网址:https://github.com/raspberrypi/linux 在树莓派使用指令:uname -r查看当前树莓派的版本号,然后选择对应的linu ...

  3. Linux内核源码分析--内核启动之(4)Image内核启动(setup_arch函数)(Linux-3.0 ARMv7)【转】...

    原文地址:Linux内核源码分析--内核启动之(4)Image内核启动(setup_arch函数)(Linux-3.0 ARMv7) 作者:tekkamanninja 转自:http://blog.c ...

  4. 【华为云技术分享】Linux内核源码结构(1)

    在上一期中,我们介绍了Linux内核发展的历史,也介绍了与其相关的UNIX和GNU的相关知识.从这一期开始,我们将介绍Linux内核的源码结构.我们将先根据Linux源码的目录结构进行分析,到本文章发 ...

  5. linux的进程/线程/协程系列3:查看linux内核源码——vim+ctags/find+grep

    linux的进程/线程/协程系列3:查看linux内核源码--vim+ctags/find+grep 前言 摘要: 1. 下载linux内核源码 2. 打标签方法:vim+ctags 2.1 安装vi ...

  6. Linux内核源码分析—从用户空间复制数据到内核空间

    Linux内核源码分析-从用户空间复制数据到内核空间 本文主要参考<深入理解Linux内核>,结合2.6.11.1版的内核代码,分析从用户空间复制数据到内核空间函数. 1.不描述内核同步. ...

  7. 【linux内核-源码编译之centos7】

    linux内核-源码编译之centos7 一. 为什么要编译内核 二.疑难杂症 三.演示环境 四.下载源码 4.1.两者源码区别 4.2.将获取到的源码放在/usr/src/kernels/ 下 五. ...

  8. linux内核代码研读与实战,Linux内核源码研读与实战演练

    Linux内核源码研读与实战演练 网盘下载链接: http://pan.baidu.com/s/1fIYf0 密码: 341f 要是网盘失效了,请加我QQ: 3113533060 课程内容: 第1部分 ...

  9. Linux内核源码下载方式

    官网 Linux内核源码下载页面 https://www.kernel.org/pub/linux/kernel/ 页面介绍: HTTP https://www.kernel.org/pub/ GIT ...

最新文章

  1. 客户端发送消息时,源码运行的大致流程
  2. 强制解除占用端口,最快速方便的解除占用端口,端口占用解决方案大全
  3. [转]docker 部署 mysql + phpmyadmin 3种方法
  4. Visio画大括号、花括号
  5. Difference between expressions and statements?
  6. Java程序员需要掌握的计算机底层知识(二):操作系统、内核、用户态与内核态、系统调用的执行过程
  7. ASP.NET Core Razor 页面使用教程
  8. Java实现冒泡排序动画展示
  9. 剑指offer 第一章 面试的流程
  10. Redis 混合存储最佳实践指南
  11. linux减小根目录空间_Linux目录结构及文件基本操作详解
  12. SSH与EJB 比较
  13. 数据比赛大杀器----模型融合(stackingblending)(转载)
  14. html ul标签宽度,css - ul中每个li的不同宽度 - SO中文参考 - www.soinside.com
  15. 大数据 流式计算 apache storm 学习笔记 01 ---汪文君
  16. 计算机办公软件基础知识题库,办公软件基础知识试题--题库.doc
  17. Meta-learning algorithms for Few-Shot Computer Vision 论文解读(二)
  18. 对接钉钉API语音功能相关文档
  19. xmind zen 同步问题解决 坚果云
  20. 致我们终究拥抱的距离

热门文章

  1. 代码质量管理平台搭建
  2. US1MF-ASEMI贴片快恢复二极管US1MF
  3. C语言——用函数方法判断闰年
  4. python画图颜色代码rgb_如何获取matplotlib颜色方案的RGB值?
  5. 用MySQL模拟消息队列
  6. 消息队列及常见消息中间件
  7. java 将 object转成Integer
  8. RedisCluster如何高效率地批量插入数据
  9. Bluetooth 蓝牙介绍(三):低功耗蓝牙BLE空口协议Ⅰ
  10. 基于视觉导航的自主机器人简介(一)