在用户空间里面,比如说有一个数据buffer,这个数据buffer怎么通过write这个函数写入到eMMC的存储空间?
比如在用户空间使用open函数来打开data目录下的test这个文件,调用write函数,将这个data的buffer写入到这个文件里面,我们的问题是,这个write函数它经历过linux内核里面什么样的内核模块以及经历些什么样的数据结构,它才能把这个data的数据写入到eMMC里面的Sector里面?
首先,我们调用write这个函数,往这个句柄里面写数据的时候,那么在内核空间里面它首先会通过打开的句柄fd,在内核里面找到file的这样一个数据结构,在file数据结构里面它找到它的page cache,如果没有找到page cache,他就会新创建一个page cache,你要把这些page cache加到内核管理page cache这种基数树里面
它会根据buffer的大小,去分配buffer_head,通常是4个buffer_head,指向一个page
通过文件系统的get_block这个api为page cache去查找在磁盘中对应的这个block的号。通常文件系统会管理这个数据它要存放在磁盘哪个block的号里面,接下来将数据copy到page cache中,这里直接调用copy_from_us