动手实现一个磁盘高速缓存:准备工作(一)
来源:互联网 发布:mac硬盘取消密码 编辑:程序博客网 时间:2024/05/16 08:53
要想实现一个独立于Linux内核的磁盘高速缓存,就需要确定磁盘高速缓存的数据放到什么地方,因为在Linux中申请大块内存的不确定性和不稳定性,我们使用在开机时预留大块内存的方式,独立管理这块被保留的内存存放磁盘缓存数据;
在开机时预留大块内存,需要修改Linux内核的源代码文件(init/main.c),在内存初始化之前预留出一部分内存,我使用的内核版本是3.8.13,下面是需要修改的code:
char *iet_mem_virt;unsigned int iet_mem_size=0x1000000;unsigned long iet_mem_goal=0;EXPORT_SYMBOL_GPL(iet_mem_size);EXPORT_SYMBOL_GPL(iet_mem_virt);EXPORT_SYMBOL_GPL(iet_mem_goal);asmlinkage void __init start_kernel(void){/* * These use large bootmem allocations and must precede * kmem_cache_init() */setup_log_buf(0);pidhash_init();vfs_caches_init_early();sort_main_extable();trap_init();/* rserve memory region for disk cache */iet_mem_virt= alloc_bootmem(iet_mem_size);mm_init();/* * Set up the scheduler prior starting any interrupts (such as the * timer interrupt). Full topology setup happens at smp_init() * time - but meanwhile we still have a functioning scheduler. */sched_init();}
alloc_bootmem(size)函数,在内存初始化之前,预留出size个字节的物理内存,返回虚拟内存的指针。
然后重新编译内核,内核编译步骤我在这里不再赘述,自己百度一下。在使用重启编译的内核启动之后执行下面的命令:
lab@lab-OptiPlex-7010:~$ cat /proc/kallsyms |grep iet_mem0000000000000000 r __ksymtab_iet_mem_goal0000000000000000 r __ksymtab_iet_mem_size0000000000000000 r __ksymtab_iet_mem_virt0000000000000000 r __kcrctab_iet_mem_goal0000000000000000 r __kcrctab_iet_mem_size0000000000000000 r __kcrctab_iet_mem_virt0000000000000000 r __kstrtab_iet_mem_goal0000000000000000 r __kstrtab_iet_mem_virt0000000000000000 r __kstrtab_iet_mem_size0000000000000000 D iet_mem_size0000000000000000 B iet_mem_goal0000000000000000 B iet_mem_virtlab@lab-OptiPlex-7010:~$
如果可以执行的命令和上面一致,说明我们的准备工作成功了,我们以后在内核模块的编写中可以直接使用这三个symbol了,其中最重要的是iet_mem_virt, 它指向我们预留的16MB内存,OK,下课!
0 0
- 动手实现一个磁盘高速缓存:准备工作(一)
- 动手实现一个磁盘高速缓存:准备工作(二)
- 磁盘高速缓存
- 磁盘高速缓存
- 磁盘高速缓存
- 《一个操作系统的实现》:准备工作
- linux 下清空磁盘高速缓存
- 磁盘高速缓存disk cache
- 使用TensorFlow动手实现一个Char-RNN
- 动手去实现一个页面切换TabView
- 动手实现2d游戏引擎(一)
- 一个操作系统的实现(1)-准备工作
- 进程与内存7-高速缓存2(目录项高速缓存、索引节点高速缓存和磁盘高速缓存)
- 【机器学习】动手写一个全连接神经网络(一)
- 页高速缓存(一)
- 深入理解Spring--动手实现一个简单的SpringIOC容器
- [py]web框架本质-自动动手实现一个mvc框架
- 动手实现一个简单的java web框架
- Shell 与Display的区别
- php中常用的函数
- 开源爬虫: Heritrix 1.14.4 安装/使用
- 以DLL形式加载的自动更新的显示对话框
- Android UI开发专题(五) GraphableButton类实现
- 动手实现一个磁盘高速缓存:准备工作(一)
- 体验变量的引用
- [Unity]关于调用dll中的AddComponent
- 曾做到亚马逊也做不到的一小时送达服务,Instacart据说即将融资一亿美元
- SWT样式
- Java开源 开源工作流
- Oracle数据库里面查询字符串类型的字段不为空和为空的SQL语句:
- 卷积神经网络(一):LeNet5的基本结构
- 在eclipse rcp 开发中 动态的显示视图