主要使用struct resource *request_region(unsigned long first, unsigned long n, const char *name)之类的函数保证了,内核中只有申请到该资源的驱动访问该IO。否则内核多处访问同一处IO会造成不确定性。
在I/O端口的互斥行满足之后,如果内核中多处同时调用驱动函数或者多个进程同时访问某个设备文件就相当于内核多处访问同一处IO。所以要保证调用驱动函数的串行化。例如:
分析到进程,也就差不多了。
操作系统通常讲到的同步多指共享数据的同步,其归根结底是由共享数据的多处访问造成的,临界区:就是访问和操作共享数据的代码段。注意临界区强调的是共享数据,而不是代码。
假设整个系统的同步已经满足,在添加自己的代码时,只要保证自己的数据的同步,并注意系统已有的同步性(如上面说额端口互斥性、驱动串行化,随意写驱动时就不用管上层的同步性),还要注意不要破坏系统的同步性(比如中断例程中不要占用互斥体)。