diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..339b4be --- /dev/null +++ b/.DS_Store Binary files differ diff --git a/buddy_test/Makefile b/buddy_test/Makefile new file mode 100644 index 0000000..13351bb --- /dev/null +++ b/buddy_test/Makefile @@ -0,0 +1,6 @@ +KDIR=/lib/modules/$(shell uname -r)/build +obj-m += buddy_test.o +all: + make -C $(KDIR) M=$(PWD) modules +clean: + make -C $(KDIR) M=$(PWD) clean diff --git a/buddy_test/buddy_test.c b/buddy_test/buddy_test.c new file mode 100644 index 0000000..3a23234 --- /dev/null +++ b/buddy_test/buddy_test.c @@ -0,0 +1,21 @@ +#include +#include +#include + +static struct page *page; +static unsigned int order = 10; + +static int __init buddy_test_init(void) { + unsigned int flags = 0; + flags |= __GFP_DMA32; + page = alloc_pages(flags, order); + return 0; +} +static void __exit buddy_test_exit(void) { + __free_pages(page, order); +} +module_init(buddy_test_init); +module_exit(buddy_test_exit); +MODULE_AUTHOR("SUEYASU Taizo"); +MODULE_DESCRIPTION("Buddy System test driver"); +MODULE_LICENSE("GPL"); diff --git a/pagetable/Makefile b/pagetable/Makefile new file mode 100644 index 0000000..c935c03 --- /dev/null +++ b/pagetable/Makefile @@ -0,0 +1,6 @@ +KDIR=/lib/modules/$(shell uname -r)/build +obj-m += pagetable.o +all: + make -C $(KDIR) M=$(PWD) modules +clean: + make -C $(KDIR) M=$(PWD) clean diff --git a/pagetable/pagetable.c b/pagetable/pagetable.c new file mode 100644 index 0000000..1d514a0 --- /dev/null +++ b/pagetable/pagetable.c @@ -0,0 +1,64 @@ +#include +#include +#include +#include +#include + +static unsigned int processid = 1; +module_param(processid, uint, 0); +static unsigned long addr = 0; +module_param(addr, ulong, 0); + +static unsigned long get_pfndata(unsigned long entry) { + entry &= 0x000FFFFFFFFFF000; + return(entry >>= 12); +} + +static int __init pagetable_init(void) { + pgd_t *pgd; + p4d_t *p4d; + pud_t *pud; + pmd_t *pmd; + pte_t *pte; + unsigned long paddr; + struct pid *pid = find_get_pid(processid); + struct task_struct *task = pid_task(pid, PIDTYPE_PID); + struct mm_struct *mm = task->mm; + if (pid == NULL) return 0; + + printk("mm->pgd = %016lx\n", (unsigned long)mm->pgd); + printk("CR3 = %010lx\n", get_pfndata(__pa(mm->pgd))); + pgd = pgd_offset(mm, addr); + if (pgd_none(*pgd) || pgd_bad(*pgd)) return 0; + printk("PGD entry = %010lx\n", get_pfndata(pgd_val(*pgd))); + + p4d = p4d_offset(pgd, addr); + if (p4d_none(*p4d) || p4d_bad(*p4d)) return 0; + printk("P4D entry = %010lx\n", get_pfndata(p4d_val(*p4d))); + + pud = pud_offset(p4d, addr); + if (pud_none(*pud) || pud_bad(*pud)) return 0; + printk("PUD entry = %010lx\n", get_pfndata(pud_val(*pud))); + + pmd = pmd_offset(pud, addr); + if (pmd_none(*pmd) || pmd_bad(*pmd)) return 0; + printk("PMD entry = %010lx\n", get_pfndata(pmd_val(*pmd))); + + pte = pte_offset_map(pmd, addr); + if (pte_none(*pte)) return 0; + paddr = pte_val(*pte); + printk("PTE entry = %010lx\n", get_pfndata(paddr)); + paddr = (paddr & 0x000FFFFFFFFFF000) | (addr & 0xFFF); + printk("Phys addr = %016lx\n", paddr); + + return 0; +} +static void __exit pagetable_exit(void) { +} +module_init(pagetable_init); +module_exit(pagetable_exit); +MODULE_AUTHOR("SUEYASU Taizo"); +MODULE_DESCRIPTION("pagetable test driver"); +MODULE_LICENSE("GPL"); +MODULE_PARM_DESC(processid, "PID (0 < processid < 2^22, default=1)"); +MODULE_PARM_DESC(addr, "Virtual address, default=0"); diff --git a/slab_test/Makefile b/slab_test/Makefile new file mode 100644 index 0000000..6a0757a --- /dev/null +++ b/slab_test/Makefile @@ -0,0 +1,6 @@ +KDIR=/lib/modules/$(shell uname -r)/build +obj-m += slab_test.o +all: + make -C $(KDIR) M=$(PWD) modules +clean: + make -C $(KDIR) M=$(PWD) clean diff --git a/slab_test/slab_test.c b/slab_test/slab_test.c new file mode 100644 index 0000000..864bb6c --- /dev/null +++ b/slab_test/slab_test.c @@ -0,0 +1,24 @@ +#include +#include +#include +#include + +static struct kmem_cache *slab_cache; +static void *data; +static size_t data_size = 456; + +static int __init slab_test_init(void) { + slab_cache = kmem_cache_create("test_slab_cache", + data_size, 0, 0, NULL); + data = kmem_cache_alloc(slab_cache, 0); + return 0; +} +static void __exit slab_test_exit(void) { + kmem_cache_free(slab_cache, data); + kmem_cache_destroy(slab_cache); +} +module_init(slab_test_init); +module_exit(slab_test_exit); +MODULE_AUTHOR("SUEYASU Taizo"); +MODULE_DESCRIPTION("Slab test driver"); +MODULE_LICENSE("GPL");