有关问题简单,回者有分——向/dev/mtdblock写入时遇到的有关问题
问题简单,回者有分——向/dev/mtdblock写入时遇到的问题本帖最后由 dongyang626 于 2012-11-14 09:33:40 编
问题简单,回者有分——向/dev/mtdblock写入时遇到的问题
本帖最后由 dongyang626 于 2012-11-14 09:33:40 编辑 各位好:
我现在kernel中升级系统(nor flash),目前做法是:使用dd命令,将镜像擦写至/dev/mtdblock*的
对应位置。(mtdblock2为rootfs扇区)
我发现向mtdblock写入数据,和实际FLASH被更新擦写是分开进行的。
一般在dd写入mtdblock几秒后,[mtdblockd]进程开始占用CPU,CPU一度到100%,此结束后,应该是
FLASH擦写完毕。
另,感觉[mtdblockd]进程的开始,是在我的程序执行完毕后才开始的(程序中用system()调用的dd),
如果我在程序中进行 sleep, 则在sleep时,[mtdblockd]也不会占用CPU
我现需要在dd后 读取/dev/mtdblock2中的内容,但[mtdblockd]在我的程序执行完毕后,才自己跑出
来占用CPU。 这样我在程序中无法读取更新过的mtdblock2的内容,无法验证其更新的正确性。
一直没看过MTD的实现原理,临时看有点无从下手, 请问如何能解决我目前遇到的问题?
[最优解释]
能否用同步读写操作试试。dd怎么实现的不了解。
[其他解释]
其实这是一个进程同步的问题。
system()调用系统命令,是在子进程中执行的。你当前的需求是要子进程执行完,主进程才能读数据。
你可以这样:
主进程fork出一个子进程,然后让子进程system(),主进程用wait等待这个子进程,就可以了。
[其他解释]
真的没人懂么,反正我是真的不懂,不懂的也敢来答呵,懂的赶紧都出来吧,不潜水了
回者有分,是不是真的,像我这样混的,也能有分?
[其他解释]
你试试在进程开始和main开始、结束处打印信息试试。
你只是觉得,验证过了吗。程序才不会那么做呢。它凭什么能那么做。
[其他解释]路过,接分,,,
[其他解释]我是来学习的。。。
[其他解释]不懂 帮顶啦
[其他解释]不懂,帮忙顶贴希望有会者给予解答
[其他解释]帮忙顶贴肯定有分啦.. 不过真心求正解啊...
我发现我发帖总是没人回...莫非是我没表达清楚意思?
[其他解释]4楼是否说的是 sync?
我用 system("sync"); 可以实现对pdflush的调用么?
[其他解释]其实这应该是一个“缓存和写磁盘”之间的问题(经分析、猜测也许大概应该是这样滴)
我这会在整理,弄完会把我的想法发上来。
对于system(),我这边的资料是这样介绍的:
(不能复制,纯手打...)system会调用fork()产生子进程,由子进程来调用/bin/sh -c string来执行参数string字符串所代表的命令,此命令执行完后悔随即返回原调用的进程。
在调用system期间,GIGCHLD信号会被搁置,SIGINT,SIGQUIT信号则会被忽略。 ( 略去返回值部分讲解..)
根据这段意思,result=system(dd if=... of=/dev/mtdblock2); 是返回了的,而且检测result也是执行正确的。
根据top观察cpu占用,也是这个样子滴! [mtdblockd]进程是在我的程序基本执行完了,才开始跑的!
所以貌似6楼错了, 真心没这么简单啊~~~~
[其他解释]该回复于2012-11-19 16:57:18被管理员删除
[其他解释]验证过了,是我说的样子的。
不光加了打印,而且使用top观察了。
异步现象主要是因为系统缓存的存在。 具体看下面链接
[其他解释]结贴较晚, 实在不好意思!
关于问题的可能原因, 请参看以下两个链接。
http://blog.csdn.net/kofshower/article/details/7357968
http://os.chinaunix.net/a2009/0331/993/000000993381.shtml