SOC:通常内存较大,使用外部磁盘,大容量 Flash 或 EMMC,有 MMU,区分用户态和内核态,运行 Linux/Android/WinCE 等大型系统,应用程序与系统可分开编译,系统可动态安装程序,一般使用远程 GDB 和日志输出方式进行调试。开发分为 BSP、驱动、中间件、应用/UI 等。比如 Intel Atom 系列、ARM Cortex A 系列。
MCU:通常内存和 Flash 较小,无 MMU,不区分用户态和内核态,无系统或运行小型实时系统,应用程序与系统一起编译形成镜像进行烧录,通常采用 JTAG 等硬件调试器进行调试。开发不分家或分为系统、驱动、应用开发。比如 ARM Cortex M 系列、Atmel AVR 系列、TI MSP430 系列。
## 认识 Linux 系统
Linux 可运行于多种平台,比如个人电脑、Power PC 以及 ARM Cortex A 系列 SOC 上。
Linux 分为内核态和用户态,内核态为受保护的代码,用户态程序执行异常不会导致系统漰溃,是因为用户态只能执行用户权限指令,特权指令只能在内核态执行 (这是由硬件设计决定的),且由于内核态的内存受到硬件保护,因此用户程序的溢出不会导致内核崩溃。内核态和用户态分离的目的就是为了保证系统的稳定,避免丰富的应用程序导致系统死机,而这种情况在 DOS 时期是很常见的。
由于驱动程序往往需要进行特权操作,比如直接操作物理内存,硬件寄存器,使用中断资源等,因此 Linux 系统的硬件驱动程序需要在内核态执行。Linux 的核心代码很小,在源代码中占大多数的为驱动程序或驱动程序框架。