更新了内存管理之内存描述(二)--内存结点pg_data_t详解...

This commit is contained in:
gatieme
2016-08-06 11:34:45 +08:00
parent 64fd26d4dc
commit 5a035b8d72
9 changed files with 1954 additions and 422 deletions
+1 -1
View File
@@ -6,7 +6,7 @@ GITHUB_COMMIT := $(COMMIT)
ifeq ($(COMMIT), )
GITHUB_COMMIT="更新了内存管理之内存描述()--页帧struct page详解..."
GITHUB_COMMIT="更新了内存管理之内存描述()--内存结点pg_data_t详解..."
endif
@@ -0,0 +1 @@
cmd_/home/gatieme/Work/GitHub/LDD-LinuxDeviceDrivers/study/kernel/02-memory/01-description/02-node/print_node.ko := ld -r -m elf_x86_64 -T ./scripts/module-common.lds --build-id -o /home/gatieme/Work/GitHub/LDD-LinuxDeviceDrivers/study/kernel/02-memory/01-description/02-node/print_node.ko /home/gatieme/Work/GitHub/LDD-LinuxDeviceDrivers/study/kernel/02-memory/01-description/02-node/print_node.o /home/gatieme/Work/GitHub/LDD-LinuxDeviceDrivers/study/kernel/02-memory/01-description/02-node/print_node.mod.o
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1 @@
kernel//home/gatieme/Work/GitHub/LDD-LinuxDeviceDrivers/study/kernel/02-memory/01-description/02-node/print_node.ko
@@ -11,6 +11,19 @@
MODULE_LICENSE("GPL");
void print_node(struct pglist_data *node)
{
printk("address = %p\n", node);
printk("node id = %d\n", node->node_id);
printk("nr_zones = %d\n", node->nr_zones);
printk("pgdat_next = %p\n", node->pgdat_next);
printk("nod present pages = %d\n", node->node_present_pages);
printk("nod spanned pages = %d\n", node->node_spanned_pages);
}
extern pg_data_t *pgdat_list[MAX_NUMNODES];
static int __init print_node_setup(void)
{
@@ -18,9 +31,10 @@ static int __init print_node_setup(void)
printk(KERN_INFO "PAGE_OFFSET = 0x%lx\n",
PAGE_OFFSET);
/*
int i;
pg_data_t *pgdat = NULL;
pg_data_t *node = NULL;
#if 0
pg_data_t **pgdata_list = pgdat_list;
void *high_memory = NULL;
@@ -28,17 +42,40 @@ static int __init print_node_setup(void)
{
printk(KERN_INFO "%p\n", (void *)pgdata_list[i]);
}
for_each_online_pgdat(pgdat)
{
high_memory = max_t(void *, high_memory, __va(pgdat_end_pfn(pgdat) << PAGE_SHIFT));
printk(KERN_INFO "%p\n", high_memory);
printk(KERN_INFO "");
}
*/
#endif
#ifndef CONFIG_NEED_MULTIPLE_NODES
struct pglist_data *pgdata = &contig_page_data;
printk("%d\n", pgdata->node_id);
#else
printk("NODES_SHIFT = %d, MAX_NUMNODES = %d\n", NODES_SHIFT, MAX_NUMNODES);
for(i = 0; i < MAX_NUMNODES; i++)
{
node = NODE_DATA(i);
if(node != NULL)
{
print_node(node);
}
else
{
break;
}
}
return 0;
#endif
}
static void __exit print_node_cleanup(void)
{
printk(KERN_INFO"Goodbye!\n");
@@ -0,0 +1,32 @@
#include <linux/module.h>
#include <linux/vermagic.h>
#include <linux/compiler.h>
MODULE_INFO(vermagic, VERMAGIC_STRING);
__visible struct module __this_module
__attribute__((section(".gnu.linkonce.this_module"))) = {
.name = KBUILD_MODNAME,
.init = init_module,
#ifdef CONFIG_MODULE_UNLOAD
.exit = cleanup_module,
#endif
.arch = MODULE_ARCH_INIT,
};
static const struct modversion_info ____versions[]
__used
__attribute__((section("__versions"))) = {
{ 0xcd71858e, __VMLINUX_SYMBOL_STR(module_layout) },
{ 0xe462e7ca, __VMLINUX_SYMBOL_STR(node_data) },
{ 0x27e1a049, __VMLINUX_SYMBOL_STR(printk) },
{ 0xbdfb6dbb, __VMLINUX_SYMBOL_STR(__fentry__) },
};
static const char __module_depends[]
__used
__attribute__((section(".modinfo"))) =
"depends=";
MODULE_INFO(srcversion, "AC263D03D5E0B3B80B01AB6");