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)
用户空间驱动程序可以用各种语言编写,可以不开源,可以被杀死,不会导致系统崩溃,可以被交换出内存,可以使用浮点运算。
最新文章
- 性能测试工具 wrk 安装与使用
- oracle 函数写法 总结
- mybatis报invalue types()错误
- 使用Dom4j进行XML解析
- [No00004B]Windows 下面为Python3.5安装NoteBook
- log4net 添加自定义日志到数据库
- BZOJ 1741: [Usaco2005 nov]Asteroids 穿越小行星群
- dubbo + zookeeper 环境搭建
- 数据导入问题:[Err] [Imp] 1406 - Data too long for column 'linkman' at row 20 [Err] [Imp] INSERT INTO `excel_eprinfo`
- WebApi2官网学习记录--HTTP Message Handlers
- python列表类型中的陷阱
- 《Linux Device Drivers》 第十七章 网络驱动程序——note
- MVC自定义分页
- linux kernel 编译
- js对象大总结2016/4/19
- 吴恩达机器学习笔记57-基于内容的推荐系统(Content Based Recommendations)
- sql的日期和时间函数–date_format
- C#泛型。
- Linux 搭建Hadoop集群 ----workcount案例
- javax.servlet不存在问题的解决