0.0单片机程序和Linux程序分层

1.MPU:Micro Processor Unit,微处理器;MCU:Micro Controller Unit ,微控制器,两者之间的区别是MPU具有MMU内存管理单元(映射和选址),而MCU具有内存控制单元(选址)。

2.两者可以将程序分为应用层和驱动层(库实现),驱动层都用来操作具体的硬件,

单片机程序中可以将应用层程序和驱动层程序分开写,但是两者之间没有严格的界限,并且可以直接操作硬件层的寄存器。Linux程序中应用层程序和驱动层程序有严格的界限,并且应用层程序不能直接操作硬件,需要通过调用驱动层。这就是内存管理单元起到的作用。应用层的函数会触发一个swi(software interrupt)异常,并且设置一个寄存器的值,调用异常处理函数,分辨寄存器的值是哪一个函数触发的,(这是由内核提供,由用户态进入内核态,有足够的权限去操作硬件)从而调用驱动函数,判断文件名,在调用对应的驱动,操作硬件。

3. Linux中驱动中的操作的地址为 虚拟地址(ioremap函数),

4. 由于用户空间和内核空间中的内存不能直接互相访问,用户想要使用内核中的数据需要使用copy_to_user();内核想要使用用户中的数据,需要使用copy_from_user()。还有mmap函数(高效)。

copy_to_user在每次拷贝时需要检测指针的合法性,也就是用户空间的指针所指向的地址的确是一段该进程本身的地址,而不是指向了不属于它的地方,而且每次都会拷贝一次数据,频繁访问内存,由于虚拟地址连续,而物理地址不一定连续,所以会造成CPU的cache的频繁失效,降低访问速度。

mmap仅在第一次使用时为进程建立页表,也就是将一段物理地址映射到一段虚拟地址上,以后操作时不再检测其地址的合法性(合法性交由CPU页保护异常来做),另一方面是内核下直接操作mmap地址,可以不用频繁拷贝,也就是说在内核下直接可用指针向该地址操作,而不再在内核中专门开一个缓冲区,然后将缓冲区中的数据拷贝一次进来,mmap一般是将一段连续的物理地址映射成一段虚拟地址,当然,也可以将每段连续,但各段不连续的物理地址映射成一段连续的虚拟地址,无论如何,其物理地址在每段之中是连续的,这样一来,就不会造成CPU的CACHE频繁失效,从而大大节约时间。

5.Linux中,多进程多任务实现需要依靠虚拟地址,多个main函数运行,程序加载在内存中某一块物理地址,之后将链接时的虚拟地址映射为物理地址,然后运行时是在虚拟地址上。

posted @ 2022-09-29 10:12  QianFa01  阅读(186)  评论(0)    收藏  举报