Linux内核学习笔记 -50 工程实践-编写块设备驱动的基础2

 在用户空间里面,比如说有一个数据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_user拷贝就可以了。

接下来,把buffer_head和page cache都要设置成dirty,即这个page cache它是脏的页面,而且要把这个文件所对应的inode也要添加到系统里面的一个脏的队列里面。这一步完成后,从用户空间的角度看,这个write函数已经返回了,但是我们要注意

你可能感兴趣的:(Linux内核)