单片机
应用程序可以直接通过寄存器地址访问内容和进行一些硬件操作
Linux
linux必须通过驱动程序实现对硬件的操控,linux应用层无法实现对寄存器的存取。Linux分为用户态和内核态,当处于用户态时,哪怕是知道硬件寄存器的地址,也不能直接访问(权限不够,mmu对其管理)。
linux可以使用mmap内存映射直接访问硬件,但是实际也是驱动程序协助
linux从用户态进入内核态的几种方式
-
系统调用:这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作。比如前例中fork()实际上就是执行了一个创建新进程的系统调用。
-
异常:当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。
-
外围设备的中断:当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。
linux调用open函数对硬件的底层实现
swi:software interrupt