Buddy_Zhang1
发表于 2016-03-09 21:10
本帖最后由 Buddy_Zhang1 于 2016-03-10 15:25 编辑
Feature Update
在 64 位系统上模拟 32 位程序技巧分析:
1. 对于基于内存问题的变量,使用 unsigned int !! 而不使用 unsigned long
2. 内存对齐时,使用 unsigned int 对齐,不使用 long 或 unsigned long 对齐。
3. 位操作时候,使用 U 而不使用 UL
4. 64 位指针转换为 32 指针,使用 unsigned long 技巧。
5. void * 位 8 byte
{:yxh45:}
_nosay
发表于 2016-03-09 21:56
搞个赞,加油。
Godbach
发表于 2016-03-10 11:14
回复 1# Buddy_Zhang1
LZ 一直在更新。赞!
Buddy_Zhang1
发表于 2016-03-10 15:20
本帖最后由 Buddy_Zhang1 于 2016-03-11 14:18 编辑
Feature Update
重大更新:
1. 支持 TLB.
TLB 主要用来存储虚拟地址到物理地址转化的缓存.为了实现这种模拟,我的做法如下:
1) 使用下面结构来存储一个转换关系.
struct node {
struct rb_node node;
unsigned int phys_addr;
unsigned int virt_addr;
unsigned int mem_addr;
}__attribute((aligned(unsigned int)));
2) 使用红黑树进行管理,使用虚拟地址作为红黑树的平衡因子.
3) 引入 TLB 的目的主要是解决该模拟器模拟用户空间地址转换或 vmallc() 分配的虚拟地址,加速转换为物理地址!
4) struct node 使用 __attribute((aligned(unsigned int))) 进行对齐,这样有助于数据在 TLB 中的管理.
5) 对 TLB 的管理,后期我会查考相关 TLB 知识,应该会引入 VIPT 或 VIVT 机制.
6) 用户空间或高端内存虚拟区获取物理地址参照下面例程:
unsigned int TLB_virt_to_phys(unsigned int virt)
{
struct rb_node *node = TLB_root->rb_node;// TLB_root 为 TLB 的红黑树根节点.
while(node) {
struct node *data = container_of(node,struct node,node);
if(virt> data->virt_addr)
node = node->rb_right;
else if(virt < data->virt_addr)
node = node->rb_left;
else
return data->phys_addr;
}
return 0xFFFFFFFF;
}
Buddy_Zhang1
发表于 2016-03-11 14:12
Feature Update
支持三级页表机制:
1. PGD 页表:
位于 swapper_pg_dir 处 16K 大小,存储 0 ~ 4G 的一级页表.
操作函数为:
pgd_t *pgd;
pgd_offset()
pgd_index()
2. PMD 页表:
ARM 硬件只支持两级页表,而 Linux 模拟支持该层页表,所以 PMD 页表就是 PGD 页表.
但 PMD 页表有其特定的作用.
其定义为 typedef struct {unsigned long pmd;} pmd_t;
由于 PMD 页表的作用是指向 PTE 页表的.内核使用一个 page 来存储 PTE 页表.
对于这个 PTE page 的分布是 0 ~ 2K 存储软件 PTE,2K ~ 4K 存储硬件 PTE.
内核将 2K ~ 4K 分作了两个入口,每个入口包含 256 个PTE 页表.所以
pmd = H/W PTE0.
pmd = H/W PTE1.
3. PTE 页表:
从 buddy system 中分配一个物理页用来做 PTE page,正如上面所说,
0 ~ 1K 用来存储软件 PTE0, 1K ~ 2K 用来存储软件 PTE1,总共 512 个 PTE 入口.
相关函数为:
pte_offset_map()
pte_offset_kernel()
pte_index()
{:yxh45:}
Buddy_Zhang1
发表于 2016-03-14 12:17
技术问题:
由于系统源码的不断增大,头文件数量不断增多,这样导致一个问题:
"头文件相互嵌套问题"
有什么方法防止头文件相互嵌套问题????
Buddy_Zhang1
发表于 2016-03-15 16:36
Feature Update:
支持 ATAG 机制:
通过 uboot 传递的 ATAG 参数,内核可以设置 struct meminfo 的大小
{:yxh45:}
nswcfd
发表于 2016-03-16 12:03
基本问题吧
/* xxx.h */
#ifndef XXX_HEADER_FILE
#define XXX_HEADER_FILE
/* your header file here */
#endif
Buddy_Zhang1
发表于 2016-03-16 13:45
回复 18# nswcfd
恩恩,这也是一种解决办法,但我测试我的头文件集合的时候,有 80 多个头文件,还是无法避免头文件循环嵌套.
但经过不断调试之后,我总结出解决头文件嵌套的问题,其中我的主要原则就是不随意引用头文件.
毕竟头文件和预处理有关,我审视了相关的 C 文件之后解决了这个问题.{:qq23:}
Buddy_Zhang1
发表于 2016-03-17 20:27
Feature Update
实现 Vmalloc Allocator 分配器,实现接口如下:
1. vmalloc
2. vfree
3. vread
4. vwrite
增加 Mempool 的支持接口
实现 buddy,slab 和 vmalloc 的 Mempool 机制