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)

时间: 2024-12-21 12:50:08

free-electrons linux内核和驱动的相关文章

linux内核中驱动开发常见的类似多态

题意:求一个无向图的,去掉两个不同的点后最多有几个连通分量. 思路:枚举每个点,假设去掉该点,然后对图求割点后连通分量数,更新最大的即可.算法相对简单,但是注意几个细节: 1:原图可能不连通. 2:有的连通分量只有一个点,当舍去该点时候,连通分量-1: 复习求割点的好题! #include<iostream> #include<cstdio> #include<vector> using namespace std; int n,m; vector<vector&

linux内核中驱动开发常见的相似多态

#include<stdio.h> #include<stdlib.h> struct test { char name[20]; void (*func)(char *); }; void tttfunc(char *name) { printf("current is %d\n",__LINE__); printf("%s\n",name); } int main() { struct test ttt= { .name = "

从Linux内核LED驱动来理解字符设备驱动开发流程

目录 博客说明 开发环境 1. Linux字符设备驱动的组成 1.1 字符设备驱动模块加载与卸载函数 1.2 字符设备驱动的file_operations 结构体中的成员函数 2. 字符设备驱动--设备号注册卸载 2.1 设备号注册 2.2 设备号注销 3. 字符设备驱动--文件操作 参考资料 示例代码 @(从Linux内核LED驱动来理解字符设备驱动开发流程) 博客说明 撰写日期 2018.12.08 完稿日期 2019.10.06 最近维护 暂无 本文作者 multimicro 联系方式 [

Linux内核USB驱动【转】

本文转载自:http://www.360doc.com/content/12/0321/14/8363527_196286673.shtml 注意,该文件是2.4的内核的驱动源文件,并不保证在2.6内核中可用.文件路径为kernel/driver/usb/usb_skelton.c 该文件是usb驱动的一个框架,很多usb的驱动都可以在这个文件的基础上进行修改得到. 下面就是该源文件,中文部分是我的注释,如有错误的地方,欢迎指出. 1 /* 2 * USB Skeleton driver - 0

linux内核,驱动,应用程三者的概念和之间的关系 - Avatarx

驱动程序属于内核的一个部分.准确的说是内核的一个组件.不包含驱动的内核也叫做内核,并且这也是我们常说的内核.内核要干的事情无非5件. 1,内存管理 2,虚拟文件系统 3,进程调度 4,网络接口 5,进程间通信 驱动更像是内核的扩展组件来帮助内核实现硬件的连接和操控.内核通过提供统一的驱动操作接口供用户层使用,驱动就是在这层统一的接口下实现硬件的操控的中间层. 首先,要理解操作系统的概念,操作系统是用户和硬件之间的一层媒介程序.不管是Linux还是Windows或者安卓.iOS,它的主要功能有两点

Linux 内核USB 驱动

通用串行总线(USB)是一个在主机和许多外设之间的连接. 最初它被创建来替代许多慢速和不同的总线- 并口, 串口, 和键盘连接--有一个单个的所有设备都可以连接的总线类型.[45] USB 已经成长超出了这些 慢速连接并且现在支持几乎每种可以连接到 PC 的设备. USB 规范的最新版本增加了高速连接, 理论上 到 480 MBps. 拓扑结构上, 一个 USB 子系统没有如同一个总线一样分布; 它更多是一个树, 有几个点对点连接. 这 些连接是 4-线 电缆(地, 电源, 和 2 个信号线)来

使用jtag+gdb调试arm上的linux内核和驱动

调试对象为公司一块使用s3c2440的板子,调试器为基于ft2232d的openjtag,pc操作系统为ubunut14.04.2 x64,jtag->gdb桥为openocd 0.9.0.1.准备内核源码拷贝出两份完全一样的内核源码,不加调试信息的一份烧写/下载到板子上,加调试信息的一份用于调试.这里用uboot+nfs的方式下载内核.~/buildspacce/linux-2.6.32.2_debug~/buildspacce/linux-2.6.32.2_releasedebug版源码做如

Linux内核初始化驱动顺序

增加自己写的驱动程序:http://blog.chinaunix.net/uid-23065002-id-115739.html http://os.51cto.com/art/201108/284086.htm 初始化驱动:http://www.cnblogs.com/cute/archive/2011/07/27/2118373.html 这篇文章稍后自己再写好了

Linux内核和驱动编译常见问题

1.获取内核源码应为 git clone depth=1  不然编译时会报错 2.有些RTL188CUS网卡与wpa_supplicant兼容有问题 更新下wpasupplicant或许能解决 这里用iwconfig临时解决下 具体操作打开/etc/network/interface 注释掉wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf 加入pre-up iwconfig wlan0 essid <ssid>