- 论坛徽章:
- 0
|
原帖由 ljoolj 于 2006-4-19 11:07 发表
看了看的进程代码,有了点模糊概念,跑进程初始化时候,进程相关的数据结构是把vm_object,和vnode相关资源挂接上来,进程死后是和这些资源脱钩,并不会实质销毁vm_object,和vnode,所以vm_objectg,和vnode,系统还 ...
vm_object虽然是和文件一一对应的,但它本身却是属于进程地址空间的范畴。要理解这个问题,可以举个例子。比如一把钥匙和一把锁,它们的关系是相辅相成、一一对应的。如果锁坏了,那你的钥匙留着也没用,只有丢了。如果你的钥匙丢了,那锁留着也没用,只有换了。因此,这个一一对应关系可以从两头去删除。比如vm_object就是钥匙,而文件则是锁。
进程退出代码代码中有如下调用序列,你可以去仔细研究一下。
- _____________________________________________________________________FreeBSD6.0
- 101 /*
- 102 * Exit: deallocate address space and other resources, change proc state
- 103 * to zombie, and unlink proc from allproc and parent's lists. Save exit
- 104 * status and rusage for wait(). Check for child processes and orphan them.
- 105 */
- 106 void
- 107 exit1(struct thread *td, int rv)
- 108 {
- ......
- 294 (void) vm_map_remove(&vm->vm_map, vm_map_min(&vm->vm_map),
- __________________________________________________/usr/src/sys/kern/kern_exit.c
复制代码
- _____________________________________________________________________FreeBSD6.0
- 2306 /*
- 2307 * vm_map_remove:
- 2308 *
- 2309 * Remove the given address range from the target map.
- 2310 * This is the exported form of vm_map_delete.
- 2311 */
- 2312 int
- 2313 vm_map_remove(vm_map_t map, vm_offset_t start, vm_offset_t end)
- 2314 {
- ......
- 2319 result = vm_map_delete(map, start, end);
- _______________________________________________________/usr/src/sys/vm/vm_map.c
复制代码
- _____________________________________________________________________FreeBSD6.0
- 2213 /*
- 2214 * vm_map_delete: [ internal use only ]
- 2215 *
- 2216 * Deallocates the given address range from the target
- 2217 * map.
- 2218 */
- 2219 int
- 2220 vm_map_delete(vm_map_t map, vm_offset_t start, vm_offset_t end)
- 2221 {
- ......
- 2300 vm_map_entry_delete(map, entry);
- _______________________________________________________/usr/src/sys/vm/vm_map.c
复制代码
- _____________________________________________________________________FreeBSD6.0
- 2174 /*
- 2175 * vm_map_entry_delete: [ internal use only ]
- 2176 *
- 2177 * Deallocate the given entry from the target map.
- 2178 */
- 2179 static void
- 2180 vm_map_entry_delete(vm_map_t map, vm_map_entry_t entry)
- 2181 {
- ......
- 2207 vm_object_deallocate(object);
- _______________________________________________________/usr/src/sys/vm/vm_map.c
复制代码
- _____________________________________________________________________FreeBSD6.0
- 425 /*
- 426 * vm_object_deallocate:
- 427 *
- 428 * Release a reference to the specified object,
- 429 * gained either through a vm_object_allocate
- 430 * or a vm_object_reference call. When all references
- 431 * are gone, storage associated with this object
- 432 * may be relinquished.
- 433 *
- 434 * No object may be locked.
- 435 */
- 436 void
- 437 vm_object_deallocate(vm_object_t object)
- 438 {
- ......
- 456 vm_object_vndeallocate(object);
- ____________________________________________________/usr/src/sys/vm/vm_object.c
复制代码
- _____________________________________________________________________FreeBSD6.0
- 393 /*
- 394 * Handle deallocating an object of type OBJT_VNODE.
- 395 */
- 396 void
- 397 vm_object_vndeallocate(vm_object_t object)
- 398 {
- ......
- 422 vrele(vp);
- ____________________________________________________/usr/src/sys/vm/vm_object.c
复制代码
- _____________________________________________________________________FreeBSD6.0
- 2010 /*
- 2011 * Vnode put/release.
- 2012 * If count drops to zero, call inactive routine and return to freelist.
- 2013 */
- 2014 void
- 2015 vrele(vp)
- 2016 struct vnode *vp;
- 2017 {
- ......
- ___________________________________________________/usr/src/sys/kern/vfs_subr.c
复制代码 |
|