操作系统内核原理

1:进程控制块
在这里插入图片描述

2:进程的内存模型
在这里插入图片描述
也就是说假设4g内存,每个进程都独占除kernel space 的所有4g内存空间
在这里插入图片描述
栈帧esp ebp
在这里插入图片描述
3:CPU的工作模型
在这里插入图片描述
在这里插入图片描述
4:虚拟内存和物理内存
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
共享内存:
在这里插入图片描述
共享内存的核心其实是put_page();找到相同的物理地址,然后再映射回去

void * sys_shmat(int shmid)
{
    int i;
    unsigned long data_base, brk;

    if(shmid < 0 || SHM_SIZE <= shmid || shm_list[shmid].page==0 || shm_list[shmid].key <= 0)
        return (void *)-EINVAL;

    data_base = get_base(current->ldt[2]);
    printk("current's data_base = 0x%08x,new page = 0x%08x\n",data_base,shm_list[shmid].page);

    brk = current->brk + data_base;
    current->brk += PAGE_SIZE;

    if(put_page(shm_list[shmid].page, brk) == 0)
        return (void *)-ENOMEM;
	//将物理地址shm_list[shimid].page映射到进程的虚拟地址brk上
    return (void *)(current->brk - PAGE_SIZE);
}

memmap

//put_page就是将物理地址映射到虚拟地址的
//page是物理地址 address是虚拟地址
unsigned long put_page(unsigned long page,unsigned long address)
{
	unsigned long tmp, *page_table;


	//memmap其实就是page管理,看4G内存哪个被分配了 一页4kb所以右移12
	
	if (page < LOW_MEM || page >= HIGH_MEMORY)
		printk("Trying to put page %p at %p\n",page,address);
	if (mem_map[(page-LOW_MEM)>>12] != 1)
		printk("mem_map disagrees with %p at %p\n",page,address);
	page_table = (unsigned long *) ((address>>20) & 0xffc);
	//这里是这么理解 *pagetable通过mmu去找前12位对应的地址,如果有效则说明mmu建立了映射,无效则取get——free——page
	//*pagetable其实就是页表实际保存的物理地址
	if ((*page_table)&1)
		page_table = (unsigned long *) (0xfffff000 & *page_table);//找前20位对应的页表然后找到
		//前10位对应的地址保存的是页表项的地址
		//中间10位的地址保存的是页的地址
	else {
		if (!(tmp=get_free_page()))
			return 0;
		*page_table = tmp|7;
		page_table = (unsigned long *) tmp;
	}
	page_table[(address>>12) & 0x3ff] = page | 7;
/* no need for invalidate */
	return page;
}

这段代码将物理页映射到虚拟地址。逐行解释如下:

unsigned long tmp, *page_table;
定义了临时变量 tmp 和页表指针 page_table。

if (page < LOW_MEM || page >= HIGH_MEMORY)
检查物理页是否在有效的低内存和高内存范围内。

printk("Trying to put page %p at %p\n",page,address);
如果页不在有效范围内,打印警告信息。

if (mem_map[(page-LOW_MEM)>>12] != 1)
验证 mem_map 中该页的状态是否与预期一致。

printk("mem_map disagrees with %p at %p\n",page,address);
如果 mem_map 不一致,打印警告信息。

page_table = (unsigned long *) ((address>>20) & 0xffc);
计算虚拟地址所在页表的地址。将虚拟地址右移20位后取低12位,得到页目录项的地址。

if ((*page_table)&1)
检查页表是否已经存在。如果存在,页表项的最低位应为1。

page_table = (unsigned long *) (0xfffff000 & *page_table);
如果页表项存在,提取页表的物理地址(掩码为 0xfffff000)。

else {
如果页表项不存在:

if (!(tmp=get_free_page()))
尝试分配一个新的页。如果失败,返回0*page_table = tmp|7;
更新页表项,设置为新分配的页地址,并设置标志位。

page_table = (unsigned long *) tmp;
更新 page_table 指针,指向新的页表。

}
结束 else 代码块。

page_table[(address>>12) & 0x3ff] = page | 7;
在页表中设置虚拟地址到物理页的映射,标志位也设置。

return page;
返回物理页的地址。

异常和中断
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
IDT
idt介绍

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
fork调用原理:
在这里插入图片描述
在这里插入图片描述
写时复制:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
进程组:
在这里插入图片描述
进程切换的场景:
在这里插入图片描述

在这里插入图片描述
进程和线程的切换:
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值