Prev: [RFC v2 PATCH 4/6] Btrfs: Add debugfs interface for hot data stats
Next: [RFC v2 PATCH 0/6] Btrfs: Add hot data relocation functionality
From: matthieu castet on 12 Aug 2010 18:30 Hi, because nobody seems to work on "NX protection for kernel data" patches [1], I decided to rework them a bit : - remove unneeded alignment in vmlinux.lds - call mark_nxdata_nx in mark_rodata_ro instead of free_initmem - fix a bug in my machine where memory was x and rw after kernel data - static_protections for bios rom is only enabled when CONFIG_PCI_BIOS (no x64) - bios rom is set to x only when probing pcibios (this won't be done is mmconfig is supported). A second patch is more radical : it make the ROM bios memory (0xe0000-0x100000) ro and x, but only for system supporting NX (to avoid breaking very old machine). I don't know if it is safe. I am waiting for your comment before reposting all the patches (module and improper large page preservation) I only test it on a 32bit NX cpu. Matthieu [1] Note: this patch depends on "Correct improper large page preservation" patch This patch expands functionality of CONFIG_DEBUG_RODATA to set main (static) kernel data area as NX. The following steps are taken to achieve this: 1. Linker script is adjusted so .text always starts and ends on a page bound 2. Linker script is adjusted so .rodata and .data always start and end on a page boundary 3. void mark_nxdata_nx(void) added to arch/x86/mm/init.c with actual functionality: NX is set for all pages from _etext through _end. 4. mark_nxdata_nx() called from free_initmem() (after init has been released 5. free_init_pages() sets released memory NX in arch/x86/mm/init.c The results of patch application may be observed in the diff of kernel page table dumps: --- data_nx_pt_before.txt 2009-10-13 07:48:59.000000000 -0400 +++ data_nx_pt_after.txt 2009-10-13 07:26:46.000000000 -0400 @@ -2,8 +2,9 @@ 0x00000000-0xc0000000 3G pmd ---[ Kernel Mapping ]--- 0xc0000000-0xc0100000 1M RW GLB x pte -0xc0100000-0xc048d000 3636K ro GLB x pte -0xc048d000-0xc0600000 1484K RW GLB x pte +0xc0100000-0xc0381000 2564K ro GLB x pte +0xc0381000-0xc048d000 1072K ro GLB NX pte +0xc048d000-0xc0600000 1484K RW GLB NX pte 0xc0600000-0xf7800000 882M RW PSE GLB NX pmd 0xf7800000-0xf79fe000 2040K RW GLB NX pte 0xf79fe000-0xf7a00000 8K pte The patch have been developed for Linux 2.6.34-rc2 x86 by Siarhei Liakh <sliakh.lkml(a)gmail.com> and Xuxian Jiang <jiang(a)cs.ncsu.edu>. V1: initial patch for 2.6.30 V2: patch for 2.6.31-rc7 V3: moved all code into arch/x86, adjusted credits V4: fixed ifdef, removed credits from CREDITS V5: fixed an address calculation bug in mark_nxdata_nx() V6: added acked-by and PT dump diff to commit log V7: minor adjustments for -tip Signed-off-by: Siarhei Liakh <sliakh.lkml(a)gmail.com> Signed-off-by: Xuxian Jiang <jiang(a)cs.ncsu.edu> Acked-by: Arjan van de Ven <arjan(a)linux.intel.com> Reviewed-by: James Morris <jmorris(a)namei.org> |