嵌入式每日八股1.28
用户空间与内核通信方式有哪些?
用户态->内核态
系统调用
open(),read(),write(), ioctl(),
内核态->用户态
API
get_user(x,ptr)/put_user(x,ptr):在内核中被调用,获取用户空间指定地址的数值并保存到内核变量x中。用于访问少量的数据。
Copy_from_user() / copy_to_user():主要应用于设备驱动读写函数中。适用于传输较大的数据。
信号 从内核空间向进程发送信号。用户程序出现重大错误,内核发送信号杀死相应进程。如SIGSEGV、SIGILL、SIGPIPE等。
文件 应该说这是一种比较笨拙的做法,不过确实可以这样用。当处于内核空间的时候,直接操作文件, 将想要传递的信息写入文件,然后用户空间可以读取这个文件便可以得到想要的数据了。下面是一个简单的测试程序,在内核态中,程序会向“/home/melody/str_from_kernel”文件中写入一条字符串,然后我们在用户态读取这个文件,就可以得到内核态传输过来的数据了。
内核态<->用户态
mmap共享内存 可以将内核空间的地址映射到用户空间。一方面可以在driver中修改Struct file_operations结构中的mmap函数指针来重新实现一个文件对应的映射操作。另一方面,也可以直接打开/dev/mem文件,把物理内存中的某一页映射到进程空间中的地址上。 其实,除了重写Struct file_operations中mmap函数,我们还可以重写其他的方法如ioctl等,来达到驱动内核空间和用户空间通信的方式。
虚拟文件系统
-
sysfs文件系统+kobject 每个在内核中注册的kobject都对应着sysfs系统中的一个目录。可以通过读取根目录下的sys目录中的文件来获得相应的信息。
-
proc文件系统。 和sysfs文件系统类似,也可以作为内核空间和用户空间交互的手段。/proc 文件系统是一种虚拟文件系统。与普通文件不同,这里的虚拟文件的内容都是动态创建的。使用/proc文件系统的方式很简单。调用create_proc_entry,返回一个 proc_dir_entry指针,然后去填充这个指针指向的结构就好了。
-
debugfs文件系统
netlink netlink socket,用于用户态和内核态的通信。相比于其他的方式,netlink有几个好处:1.使用自定义一种协议完成数据交换,不需要添加一个文件等。2.可以支持多点传送。3.支持内核先发起会话。4.异步通信,支持缓存机制。
【嵌入式八股】精华版(免费216问精华八股) https://www.nowcoder.com/creation/manager/columnDetail/0rOeJm
【嵌入式八股】一、语言篇https://www.nowcoder.com/creation/manager/columnDetail/mwQPeM
【嵌入式八股】二、计算机基础篇https://www.nowcoder.com/creation/manager/columnDetail/Mg5Lym
【嵌入式八股】三、硬件篇https://www.nowcoder.com/creation/manager/columnDetail/MRVDlM
【嵌入式八股】四、嵌入式Linux篇https://www.nowcoder.com/creation/manager/columnDetail/MQ2bb0