⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vsyscall.c

📁 linux 内核源代码
💻 C
字号:
/* * arch/sh/kernel/vsyscall/vsyscall.c * *  Copyright (C) 2006 Paul Mundt * * vDSO randomization * Copyright(C) 2005-2006, Red Hat, Inc., Ingo Molnar * * This file is subject to the terms and conditions of the GNU General Public * License.  See the file "COPYING" in the main directory of this archive * for more details. */#include <linux/mm.h>#include <linux/slab.h>#include <linux/kernel.h>#include <linux/init.h>#include <linux/gfp.h>#include <linux/module.h>#include <linux/elf.h>#include <linux/sched.h>#include <linux/err.h>/* * Should the kernel map a VDSO page into processes and pass its * address down to glibc upon exec()? */unsigned int __read_mostly vdso_enabled = 1;EXPORT_SYMBOL_GPL(vdso_enabled);static int __init vdso_setup(char *s){	vdso_enabled = simple_strtoul(s, NULL, 0);	return 1;}__setup("vdso=", vdso_setup);/* * These symbols are defined by vsyscall.o to mark the bounds * of the ELF DSO images included therein. */extern const char vsyscall_trapa_start, vsyscall_trapa_end;static struct page *syscall_pages[1];int __init vsyscall_init(void){	void *syscall_page = (void *)get_zeroed_page(GFP_ATOMIC);	syscall_pages[0] = virt_to_page(syscall_page);	/*	 * XXX: Map this page to a fixmap entry if we get around	 * to adding the page to ELF core dumps	 */	memcpy(syscall_page,	       &vsyscall_trapa_start,	       &vsyscall_trapa_end - &vsyscall_trapa_start);	return 0;}/* Setup a VMA at program startup for the vsyscall page */int arch_setup_additional_pages(struct linux_binprm *bprm,				int executable_stack){	struct mm_struct *mm = current->mm;	unsigned long addr;	int ret;	down_write(&mm->mmap_sem);	addr = get_unmapped_area(NULL, 0, PAGE_SIZE, 0, 0);	if (IS_ERR_VALUE(addr)) {		ret = addr;		goto up_fail;	}	ret = install_special_mapping(mm, addr, PAGE_SIZE,				      VM_READ | VM_EXEC |				      VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC |				      VM_ALWAYSDUMP,				      syscall_pages);	if (unlikely(ret))		goto up_fail;	current->mm->context.vdso = (void *)addr;up_fail:	up_write(&mm->mmap_sem);	return ret;}const char *arch_vma_name(struct vm_area_struct *vma){	if (vma->vm_mm && vma->vm_start == (long)vma->vm_mm->context.vdso)		return "[vdso]";	return NULL;}struct vm_area_struct *get_gate_vma(struct task_struct *task){	return NULL;}int in_gate_area(struct task_struct *task, unsigned long address){	return 0;}int in_gate_area_no_task(unsigned long address){	return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -