Function report |
Source Code:mm\nommu.c |
Create Date:2022-07-28 14:37:31 |
Last Modify:2020-03-17 21:26:27 | Copyright©Brick |
home page | Tree |
Annotation kernel can get tool activity | Download SCCT | Chinese |
Name:handle mapping creation for uClinux
Proto:unsigned long do_mmap(struct file *file, unsigned long addr, unsigned long len, unsigned long prot, unsigned long flags, vm_flags_t vm_flags, unsigned long pgoff, unsigned long *populate, struct list_head *uf)
Type:unsigned long
Parameter:
Type | Parameter | Name |
---|---|---|
struct file * | file | |
unsigned long | addr | |
unsigned long | len | |
unsigned long | prot | |
unsigned long | flags | |
vm_flags_t | vm_flags | |
unsigned long | pgoff | |
unsigned long * | populate | |
struct list_head * | uf |
1115 | populate = 0 |
1119 | ret = determine whether a mapping should be permitted and, if so, what sort of* mapping we're capable of supporting |
1125 | addr = 0 |
1130 | vm_flags |= we've determined that we can make the mapping, now translate what we* now know into VMA flags |
1134 | If Not region Then Go to error_getting_region |
1137 | vma = vm_area_alloc(mm) |
1138 | If Not vma Then Go to error_getting_vma |
1142 | VMA vm_flags = vm_flags |
1145 | Flags, see mm.h. = vm_flags |
1148 | If file Then |
1149 | he backing file or NULL = get_file(file) |
1153 | lock for writing |
1163 | If vm_flags & VM_MAYSHARE Then |
1167 | pglen = len + PAGE_SIZE - 1 >> PAGE_SHIFT determines the page size |
1173 | If Not (VMA vm_flags & VM_MAYSHARE) Then Continue |
1177 | If file_inode(he backing file or NULL ) != file_inode(file) Then Continue |
1181 | If he offset in vm_file corresponding to vm_start >= pgend Then Continue |
1185 | rpglen = rpglen + PAGE_SIZE - 1 >> PAGE_SHIFT determines the page size |
1192 | If ( he offset in vm_file corresponding to vm_start != pgoff || rpglen != pglen ) && Not ( pgoff >= he offset in vm_file corresponding to vm_start && pgend <= rpgend ) Then |
1195 | If Not (capabilities & Can be mapped directly (MAP_SHARED)) Then Go to sharing_violation |
1197 | Continue |
1203 | start = start address of region |
1204 | start += pgoff - he offset in vm_file corresponding to vm_start << PAGE_SHIFT determines the page size |
1208 | If VMA vm_flags & VM_MAPPED_COPY Then Flags, see mm.h. |= VM_MAPPED_COPY |
1210 | Else |
1211 | ret = set up a shared mapping on a file (the driver or filesystem provides and* pins the storage) |
1212 | If ret < 0 Then |
1213 | vm_region = NULL |
1214 | Our start address within vm_mm. = 0 |
1217 | pregion = NULL |
1218 | Go to error_just_free |
1221 | fput(he backing file or NULL ) |
1225 | Go to share |
1232 | If capabilities & Can be mapped directly (MAP_SHARED) Then |
1235 | If IS_ERR_VALUE(addr) Then |
1237 | If ret != -ENOSYS Then Go to error_just_free |
1244 | If Not (capabilities & Copy can be mapped (MAP_PRIVATE)) Then Go to error_just_free |
1248 | Else |
1260 | If file && Flags, see mm.h. & VM_SHARED Then ret = set up a shared mapping on a file (the driver or filesystem provides and* pins the storage) |
1264 | If ret < 0 Then Go to error_just_free |
1278 | total_vm += len >> PAGE_SHIFT determines the page size |
1280 | share : |
1285 | If Flags, see mm.h. & VM_EXEC && Not rue if the icache has been flushed for* this region Then |
1290 | lease a write lock |
1292 | Return result |
1294 | error_just_free : |
1295 | lease a write lock |
1296 | error : |
1297 | If he backing file or NULL Then fput(he backing file or NULL ) |
1300 | If File we map to (can be NULL). Then fput(File we map to (can be NULL). ) |
1302 | vm_area_free(vma) |
1303 | Return ret |
1305 | sharing_violation : |
1306 | lease a write lock |
1307 | pr_warn("Attempt to share mismatched mappings\n") |
1309 | Go to error |
1311 | error_getting_vma : |
1316 | Return -ENOMEM |
1318 | error_getting_region : |
1322 | Return -ENOMEM |
Source code conversion tool public plug-in interface | X |
---|---|
Support c/c++/esqlc/java Oracle/Informix/Mysql Plug-in can realize: logical Report Code generation and batch code conversion |