ChinaUnix.net
相关文章推荐:

ARM LINUX进程页表

arm中一级页表有4096个目录项,用虚拟地址的高12位,再结合协处理器CP15的寄存器C2的高18位为基地址来索引一个目录项,一个目录项对应1M虚拟空间。 然而在看linux2.6.30内核源代码时发现一个奇怪的问题,为什么PGDIR_SHIFT定义为21,而不是20. 有如下定义:[code]#define PGDIR_SHIFT 21 #define PGDIR_SIZE (1UL << PGDIR_SHIFT) /* to find an entry in a page-table-directory */ #define pgd_index(addr) ((addr) >> PGDI...

by bin_linux96 - Linux环境编程 - 2011-12-17 09:32:27 阅读(1756) 回复(0)

相关讨论

本帖最后由 linuxfellow 于 2012-02-17 10:36 编辑 arm pte table前2K是linux 页表, 高2k是h/w页表, 这两个页表究竟是啥? 如何理解? /* * Allocate one PTE table. * * +--------------+ 0 * | linux pt 0 | * +--------------+ * | linux pt 1 | * +--------------+ 2048 * | h/w pt 0 | * +--------------+ * | h/w pt 1 | * +--------------+ */ From d30e45eeabefadc6039d7f876a59e5f5f6cb11c6 Mon Sep 17 ...

by linuxfellow - 内核源码 - 2012-02-17 13:41:08 阅读(2549) 回复(3)

switch_mm中是进行页表的切换,即将下一个的pgd的开始物理地址放入CP15中的C2寄存器。进程的pgd的虚拟地址存放在task_struct结构中的pgd指针中,通过__virt_to_phys宏可以转变成成物理地址。 static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, struct task_struct *tsk, unsigned int cpu) { if (prev != next) cpu_switch_mm(next->pgd, tsk); } #define cpu_switc...

by crashsky - Linux文档专区 - 2006-06-30 10:10:26 阅读(1008) 回复(0)

schedule()函数分析: /* * 'schedule()' is the scheduler function. It's a very simple and nice * scheduler: it's not perfect, but certainly works for most things. * * The goto is "interesting". * * NOTE!! Task 0 is the 'idle' task, which gets called when no other * tasks can run. It can not be killed, and it cannot sleep. The 'state' * information in task[0] is never used. */ asmlinkage v...

by crashsky - Linux文档专区 - 2006-06-30 10:10:02 阅读(719) 回复(0)

小弟最近研究了一段时间的arm linux,想把进程管理方面的感受跟大家交流下,不对的地方多多指点 ---------------------------------------------- Process Creation and Termination Process Scheduling and Dispatching Process Switching Porcess Synchronization and support for interprocess communication Management of process control block --------from 进程调度 Linu...

by crashsky - Linux文档专区 - 2006-06-30 10:09:34 阅读(1136) 回复(0)

本帖最后由 求linux注释 于 2014-08-23 16:38 编辑 arm处理器的一级页表有4096个描述符。开启MMU后,虚拟地址的高12位作为索引值(虚拟地址>>20)加上存放在CP15的C2里的页表地址可得到一级页表项的地址。 而linuxarm处理器的获取页表项却是这么定义的,如下:[code]#define PMD_SHIFT 21 #define PGDIR_SHIFT 21 #define pgd_index(addr) ((addr) >> PGDIR_SHIFT) /* 虚拟地址 >> 21 取出虚拟地址对...

by 求linux注释 - 内核源码 - 2015-10-28 16:42:02 阅读(2380) 回复(5)

本帖最后由 求linux注释 于 2014-08-23 16:25 编辑 arm处理器的一级页表有4096个描述符。开启MMU后,虚拟地址的高12位作为索引值(虚拟地址>>20可得到)加上存放在CP15的C2里的页表地址可得到一级页表项的地址。 而linuxarm处理器的获取页表项却是这么定义的,如下:[code]#define PMD_SHIFT 21 #define PGDIR_SHIFT 21 #define pgd_index(addr) ((addr) >> PGDIR_SHIFT) /* 虚拟地址 >> 21 取出虚拟...

by 求linux注释 - 嵌入式开发 - 2014-08-24 13:32:09 阅读(1205) 回复(4)

s3c2410手册和很多书籍上都说:“小页(4K)描述符的bit[1:0]应该为10(二进制)”。 可是我在读代码的时候发现:小页(4K)描述符的bit[1:0]并不为10(二进制)。 证据如下: 我们知道:在arm-linux下会把高端中断向量表0xffff0000,映射到物理地址0x30001000处。映射的长度为1页(4K)。 代码这样实现的: 通过一个二级页表映射的,第一级我就不说了。第二级页表中存放的是一个小页描述符0x300010df,这样就把虚拟地址0xffff0000处的一页...

by 巨人史玉柱 - 嵌入式开发 - 2009-09-22 12:22:20 阅读(1102) 回复(0)

s3c2410手册和很多书籍上都说:“小页(4K)描述符的bit[1:0]应该为10(二进制)”。 可是我在读代码的时候发现:小页(4K)描述符的bit[1:0]并不为10(二进制)。 证据如下: 我们知道:在arm-linux下会把高端中断向量表0xffff0000,映射到物理地址0x30001000处。映射的长度为1页(4K)。 代码这样实现的: 通过一个二级页表映射的,第一级我就不说了。第二级页表中存放的是一个小页描述符0x300010df,这样就把虚拟地址0xffff0000处的一页...

by 巨人史玉柱 - 内核源码 - 2009-09-22 12:20:48 阅读(1263) 回复(0)

这是本人在上海漕河泾软件园的学习记录,欢迎大家交流。这是他们的网址,有兴趣的坛友可以去看看。www.caohejing-training.com arm linux进程创建源代码分析 w创建进程需要使用系统调用,一共有三个,分别是:sys_fork,sys_vfork,sys_clonew所有的这三个系统调用都要使用do_fork函数,它是创建进程的主体,我们将在下面重点介绍 w原型分别如下: /* Fork a new task - this creates a new program thread. * This is call...

by caohejing - 嵌入式开发 - 2008-05-07 09:51:18 阅读(2246) 回复(4)

本帖最后由 arm-linux-gcc 于 2013-04-18 23:04 编辑 内核中并没有使用armv7的TTBR1,只用了TTBR0,感觉这东西可以把表示内核映射的页表和表示用户空间映射的页表分离开,但是linux中并未用这东西 于是就没有使用分离页表,那么0-4G的页表在物理上必须要连续,那么就必须使得每个进程页表都要同时包含用户空间和内核空间两部分了(物理上相邻) 当切换进程时,直接把CP15协处理器中的TTBR0指向新进程页表物理基地址,就可以...

by arm-linux-gcc - 内核源码 - 2013-09-18 17:57:01 阅读(4895) 回复(14)