模块
1.驱动和ARM裸机的区别
共同点:操作硬件
不同点:
1.驱动的可移植性强
2.驱动可以模块化
3.arm裸机运行不需要内核 ;驱动运行需要借助内核。
4.驱动的开发效率高。但代码执行效率不如ARM裸机。
5.操作硬件的方式和裸机是不一样的:裸机直接操作硬件;驱动是由应用程序操作驱动,再由驱动操作硬件。(因为ARM可以直接操作物理地址:寄存器;但是驱动不能直接操作寄存器,驱动操作的是物理地址通过MMU映射成的虚拟地址.
6.驱动运行在的内核空间(3G-4G).
7.驱动有固定的入口和出口;(ARM裸机入口、出口都是main函数,所有操作都是在main函数中完成操作硬件)
8.应用程序访问内核,内核通过MMU将物理地址映射成虚拟地址,再由驱动操作硬件。
2.嵌入式系统组成
应用层:
[0-3G:用户空间] app glibc库
--------系统调用(swi)----------------
内核层:[3-4G:内核空间]
5大功能:
内存管理(管理内存的申请,释放,映射mmap等)
文件管理(通过文件系统(日志文件系统:ext2/ext3/ext4)、jiffs yaffs等来组织管理文件)
进程管理(进程的创建,销毁,进程调度等)
网络管理(通过网络协议栈数据的封装和拆分的过程 )
设备管理(设备驱动管理)
字符设备驱动:
按照字节来访问,并且顺序访问的驱动
块设备驱动:
按照块来访问(扇区512字节),可以顺序访问,可以无序访问
网卡设备驱动:
通过网卡驱动网卡硬件进行数据收发
网卡在linux/dev设备目录中没有对应的设备文件,没有设备节点。
因此网卡不能用open,read等操作,只能通过socket机制通讯。
----------------------------------------------------------------
硬件层: 字符设备驱动:led key mouse lcd camera touch screen
块设备驱动:u盘 emmc flash
网卡驱动:猫 路由器 dm9000
3.物理内存、虚拟内存、内核空间、用户空间
(1)每一个进程运行时,内核都会为其开辟单独(0G-3G)的虚拟用户空间,但是共享访问同一内核空间。
每个进程对应的虚拟地址可以相同,但是mmap时,每一块虚拟地址对应的物理地址及所占物理内存空间是不同的。
eg:一个进程open一个文件时,fd从3开始;开启另一个进程open文件时,fd也是从3开始。由此可见每个进程所占的虚拟内存是相互独立的。
(2)为什么共享内存的效率高?
一、内核模块
内核模块三要素
入口
出口
许可证
(一)入口
static int __init demo_init(void)
{
return 0;
}
module_init(demo_init);
//module_init()是调用函数指针指向函数demo_init,这样内核就会找到驱动的入口地址
(1)static的作用:限制函数作用域,只作用于本文件中。
因为所有模块的入口和出口都是这样的格式模板,如果不写stctic则会与其他的驱动模块入口出口产生冲突。
(2)demo_init:入口的函数地址