@@ -4,15 +4,16 @@ use crate::syscall::table::FormattedSyscallParam;
44use crate :: {
55 arch:: syscall:: nr:: SYS_SHMAT ,
66 arch:: MMArch ,
7- ipc:: shm:: { shm_manager_lock , ShmFlags , ShmId } ,
7+ ipc:: shm:: { ShmFlags , ShmId } ,
88 libs:: align:: page_align_up,
99 mm:: {
1010 allocator:: page_frame:: { PageFrameCount , PhysPageFrame , VirtPageFrame } ,
1111 page:: { page_manager_lock_irqsave, EntryFlags , PageFlushAll } ,
1212 syscall:: ProtFlags ,
13- ucontext:: { AddressSpace , VMA } ,
13+ ucontext:: { AddressSpace , PhysmapParams , VMA } ,
1414 VirtAddr , VmFlags ,
1515 } ,
16+ process:: ProcessManager ,
1617 syscall:: { table:: Syscall , user_access:: UserBufferReader } ,
1718} ;
1819use syscall_table_macros:: declare_syscall;
@@ -36,7 +37,8 @@ pub(super) fn do_kernel_shmat(
3637 vaddr : VirtAddr ,
3738 shmflg : ShmFlags ,
3839) -> Result < usize , SystemError > {
39- let mut shm_manager_guard = shm_manager_lock ( ) ;
40+ let ipcns = ProcessManager :: current_ipcns ( ) ;
41+ let mut shm_manager_guard = ipcns. shm . lock ( ) ;
4042 let current_address_space = AddressSpace :: current ( ) ?;
4143 let mut address_write_guard = current_address_space. write ( ) ;
4244
@@ -59,15 +61,15 @@ pub(super) fn do_kernel_shmat(
5961 let flusher: PageFlushAll < MMArch > = PageFlushAll :: new ( ) ;
6062
6163 // 将共享内存映射到对应虚拟区域
62- let vma = VMA :: physmap (
64+ let params = PhysmapParams {
6365 phys,
6466 destination,
6567 count,
6668 vm_flags,
67- page_flags,
68- & mut address_write_guard . user_mapper . utable ,
69- flusher ,
70- ) ?;
69+ flags : page_flags,
70+ shm_id : Some ( id ) ,
71+ } ;
72+ let vma = VMA :: physmap ( params , & mut address_write_guard . user_mapper . utable , flusher ) ?;
7173
7274 // 将VMA加入到当前进程的VMA列表中
7375 address_write_guard. mappings . insert_vma ( vma) ;
@@ -125,7 +127,10 @@ pub(super) fn do_kernel_shmat(
125127 }
126128
127129 // 更新vma的映射状态
128- vma. lock_irqsave ( ) . set_mapped ( true ) ;
130+ let mut vma_guard = vma. lock_irqsave ( ) ;
131+ vma_guard. set_mapped ( true ) ;
132+ vma_guard. set_shm_id ( Some ( id) ) ;
133+ drop ( vma_guard) ;
129134
130135 vaddr. data ( )
131136 }
0 commit comments