Linux 内存绑定在局部存储器的实现
3.2.1 Linux 内存绑定在局部存储器的实现总体步骤
总体步骤:
l 采用方案三,在在原来分析的基础上,以及已知Linux系统内存的初始化的情况,对内核代码进行修改,主要包括确定新区的范围,建立新区,重新对分配内存的分配机制进行设置。
l 新区划分后,对新建的两个区进行一定程度上的延迟;
l 建立系统调用,系统调用将提供用户进行手动设置访问方式。
l 对内核进行配置,并进行相关调式。
l 用户程序进行最终的测试,并验证相关结论。
3.2.2 Linux 内核绑定在局部存储器代码实现
(一)、修改代码:
1) 在init/main.c这个文件中,在这一段代码
#ifdef CONFIG_X86_LOCAL_APIC
#include <asm/smp.h>
#endif
的下面增加这段代码:
unsigned long max_normal_low_pfn=0;
EXPORT_SYMBOL(max_normal_low_pfn);
这里使用EXPORT_SYMBOL是声明max_normal_low_pfn是全局变量,所有的文件都可以使用,它的用处是为了标记新区ZONE_NORMAL_LOW的最大可用的页框号。
2) arch/x86/kernel/setup.c这个文件:
l 在struct boot_params boot_params;
#endif之后添加,声明该变量已经在别的文件有定义了
extern unsigned long max_normal_low_pfn;
l 在setup_arch()这个函数中,在find_low_pfn_range()这个之后,增加这一句:
max_normal_low_pfn = max_low_pfn/2;
该句用于计算新区(ZONE_NORMAL_LOW)的最大可用页框号。
3) 在arch/x86/mm/init_32.c文件
l 在unsigned long max_low_pfn_mapped; unsigned long max_pfn_mapped;之后添加extern unsigned long max_normal_low_pfn;
l 在static void __init zone_sizes_init(void)这个函数中增加这句代
相关文档:
Linux内核在启动的时候,能接收某些命令行选项或启动时参数。当内核不能识别某些硬件进而不能设置硬件参数或者为了避免内核更改某些参数的值,可以通过这种方式手动将这些参数传递给内核。
如果不使用启动管理器,比如直接从BIOS或者把内核文件用“cp zImage /dev/fd0”等方法直接从设备启动,就不能给内核传递 ......
在实现驱动程序的mmap函数时,要注意映射地址的转换问题,见代码。
定义一个设备结构体:
struct leedriver
{
struct cdev cdev;
unsigned char mem[MEMSIZE];
};
这里面这个MEMSIZE,最小都要是4096,因为内存映射是以页为单位的。
在实现simple_remap_mmap函数时,代码如下
static int simple_remap_mmap(stru ......
pid_t pid=fork()
it has 3 situation for the return result pid
0 child
>0 parent process
<0 fork fail
fork create a new process and it parent live alse when the child process had been created ......
linux 默认cli (command line interface)分辨率一般都比较小,显示的字体很大,不太美观,有时还影响结果的显示(例如出现kernel panic)。所以有必要改变一下cli的分辨率。
计算机显示领域所用的分辨率的概念一般是指每英寸可显示的像素数,因为垂直分解度与水平分解度一般不同,所以分辨率一般用vertical resolution X h ......