linux0.11数据结构

函数都是对数据的操作,搞清了数据,才能搞清函数.
最后一篇linux0.11博文,已经搞定它了,从此不写了.
以此简单记录一下内存分配上的数据结构.

甲: 高速缓冲区,

1.概念:
是一个动态结构数组,数组大小nr_buffers
它使用了end(bss 的结尾)到buffer_memory_end 区间内存.
它的头部是start_buffer = &end
它有一个指针free_list 指向空闲节点
它即是数组,又是
链表

2.使用:
struct buffer_head * getblk(int dev,int block) 获取设备数据
有从free_list 开始查找最佳buffer_head 的过程.

static struct buffer_head * find_buffer(int dev, int block)
查找buffer_head, 使用了哈希表
struct buffer_head * hash_table[NR_HASH];
for (tmp = hash(dev,block) ; tmp != NULL ; tmp = tmp->b_next)
这里的b_next, 实际是哈兮表的next项

乙: 高端内存区,

1.概念:

#define LOW_MEM 0x100000
#define PAGING_MEMORY (1510241024)
#define PAGING_PAGES (PAGING_MEMORY>>12)
#define MAP_NR(addr) (((addr)-LOW_MEM)>>12)
#define USED 100

static unsigned char mem_map [ PAGING_PAGES ] = {0,};
用固定数组mem_map来映射管理15M内存,1个byte 对应一页内存

映射关系MAP_NR(addr) 为(addr-LOW_MEM)>>12
由于LOW_MEM 到start_mem 已经被高速缓冲占用,所以那部分已经被USED,其余为free.
i = MAP_NR(start_mem);

2.使用:

unsigned long get_free_page(void);
void free_page(unsigned long addr);
page 地址,即是逻辑地址,也等于物理地址

另外,在memory.c中还有一些对目录表,页表的操作,使得能够访问到物理地址.

丙: 任务(task)

任务由一个数组管理
struct task_struct * task[NR_TASKS] = {&(init_task.task), };
每一个任务要在gdt表中有个tss描述符和ldt描述符,用来任务切换时保存寄存器内容
和任务运行时获取代码段,数据段基地址
任务的查询从&LAST_TASK 到 &FIRST_TAST

丁: 内核内存管理函数kmalloc

这个函数在linux0.11中叫malloc, 并没有使用它,但它确实是没有问题的,可以调试理解.
使用了存储桶概念,最大申请一页内存(4K),
桶目录,保存桶大小和桶描述符头指针.顺着这个桶描述符指针,可以是否有空内存块

第一次malloc时,会申请一个桶描述符页,令free_bucket_desc指向第一个空的描述符地址。
并建立链表, 桶描述符页不会再归还给系统了.

桶描述符概念
保存了桶大小,页地址,freeptr 所指地址, next指针,refcnt
桶大小: 就是大小了,刚申请一页内存时,回根据该大小构建free块链表.
页地址: free 的时候有用,传来的地址&fffff000 就得到了页地址, 释放就是是否这一页上的地址
freeptr: 该页上第一个空闲的地址,与next指针构成空闲块链表
refcnt: 本页被引用的次数,当为0时,可以释放该页.

申请过存储内存的桶描述符要挂到桶目录的桶描述符指针上。

桶描述符将一页内存进行划分,返回空闲的地址.
百闻不如一见,百读不如一调试.
read and debug the folking code! you will get it!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值