操作系统的三个作用: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)