zoukankan      html  css  js  c++  java
  • free-electrons linux内核和驱动

    操作系统的三个作用:1、管理硬件资源;2、提供独立于架构和硬件的可移植的软件接口3、处理不同应用对相同硬件资源的同时访问

    系统调用接口是稳定的,系统调用由c函数库封装,用户程序基本不需要直接调用系统函数。

    linux系统通过虚拟文件系统向用户空间提供系统和内核信息,虚拟文件系统允许应用程序访问实际存储空间不存在的文件和目录,虚拟文件系统由内核动态创建。

    最重要的两个虚拟文件系统是/proc 和/sysfs这两个文件系统

    proc挂载在/proc目录下,提供操作系统的一些信息如进程信息和内存参数管理等

    sysfs挂载在/sys目录下,是一系列设备和总线的信息。

    Linux内核主要由进程调度(SCHED)、内存管理(MM)、虚拟文件系统(VFS)、网络接口(NET)和进程间通信(IPC)等5个子系统组成。

    内核编译使用了GCC的一些扩展。所以标准ansi C编译器是不能编译内核的,内核开发不能使用C库,而是使用自包含的函数集。

    不要在内核开发中使用浮点数,因为内核可能运行在不支持浮点数的架构上。

    不要被与浮点数相关的内核配置选项所迷惑,

    在用户空间的进程内进行浮点操作的时候,内核会完成从整数操作到浮点数操作的模式转换。在执行浮点指令时到底会做些什么,因体系结构不同,内核的选择也不同,但是,内核通常捕获陷阱并着手于整数到浮点方式的转变。

    与用户空间进程不同,内核并不能完美地支持浮点操作,因为它本身不能陷入。 在内核中使用浮点数时,除了要人工保存和恢复浮点寄存器,还有其他一些琐碎的事情要做。如果要直截了当地回答,那就是:别这么做了,除了一些极少的情况,不要在内核中使用浮点操作。

    不同于用户空间API,内核内部的API是会变化的,为这个内核版本编写的驱动可能不能在另一个版本运行。

    内和开发没有内存保护机制,并且它的栈空间大小是固定的,内核控件内存是不能交换的。

    发布一个包含商业性驱动的二进制内核是非法的,而商业驱动模块则要看情况了,比如说Nvidia图形驱动,它在驱动和内核之间有个中间层。不清楚到底合不合法。

    某些情况下,驱动可以在用户空间实现,使用的条件是:

    1、内核提供直接访问硬件的机制

    2、There is no need to leverage an existing kernel subsystem such as the networking stack or lesystems.

    3、内核不需要处理并发访问硬件,只会有一个应用程序实例会访问该硬件

    可能的用户空间设备驱动

    USB with libusb, http://www.libusb.org/
    SPI with spidev, Documentation/spi/spidev
    I2C with i2cdev, Documentation/i2c/dev-interface
    Memory-mapped devices with UIO, including interrupt handling, Documentation/DocBook/uio-howto/

    某些设备驱动一部分在用户空间实现,一部分在内核空间实现(printers, scanners, 2D/3D graphics acceleration) 

    用户空间驱动程序可以用各种语言编写,可以不开源,可以被杀死,不会导致系统崩溃,可以被交换出内存,可以使用浮点运算。

  • 相关阅读:
    春招已近,这份GitHub万星的ML算法面试大全请收下
    [资源推荐] 必须收藏的两个查找论文和代码实现的网站!
    windows下安装pycocotools,亲测有效!
    GAN原理
    2018-07-02
    虚函数和纯虚函数
    友元
    string字符串
    实参和形参
    C/C++学习笔记汇总
  • 原文地址:https://www.cnblogs.com/cenglinjinran/p/4925809.html
Copyright © 2011-2022 走看看