Linux内核0.11版本 fork.c文件

本文详细介绍了Linux-0.11内核中的fork.c文件,重点解析了verify_area(), copy_mem(), copy_process(), find_empty_process()等关键函数。在fork过程中,verify_area()用于验证内存区域,copy_process()复制进程信息,find_empty_process()分配唯一的进程ID。文章深入探讨了段寄存器和GDT/LDT在保护模式下的工作原理。" 6546489,696402,构建多线程UDP聊天应用,"['网络编程', 'C++', '套接字', '多线程开发']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

fork.c中含有fork的辅助子程序,其位置为Linux-0.11/kernel/frok.c.文件中主要包含了verify_area(),copy_mem(),copy_process(),find_empty_process()这几函数

首先分析verify_area()函数,源代码如下

void verify_area(void * addr,int size)
{
    unsigned long start;

    start = (unsigned long) addr;
    size += start & 0xfff;				//size=size+start%(4k),调整起始地址后的长度
    start &= 0xfffff000;				//重置开始地址,将地址整成整4k字节开始,即从整字节开始验证
    start += get_base(current->ldt[2]);//下面把start 加上进程数据段在线性地址空间中的起始基址,
	                                   //变成系统整个线性空间中的地址位置。
    while (size>0) {
        size -= 4096;                  //一次验证一页内存
        write_verify(start);           //写页面验证。若页面不可写,则复制页面
        start += 4096;
    }
}
copy_mem()设置新任务的代码和数据段基址、限长并复制页表。 nr 为新任务号;p 是新任务数据结构的指针。
int copy_mem(int nr,struct task_struct * p)
{
    unsigned long old_data_base,new_data_base,data_limit;
    unsigned long old_code_base,new_code_base,code_limit;

    code_limit=get_limit(0x0f);  //取局部描述符表中代码段描述符项中段限长。
    data_limit=get_limit(0x17);  // 取局部描述符表中数据段描述符项中段限长。
    old_code_base = get_base(current->ldt[1]);//取原代码段基值
    old_data_base = get_base(current->ldt[2]);//去原数据段基值
    if (old_data_base != old_code_base)       //在0.11版本内核中代码段和数据段起始位置相同
        panic("We don't support separate I&D");
    if (data_limit < code_limit)              //数据段一般位于代码后面,故而数据段限长不小于代码段
        panic("Bad data_limit");
    new_data_base = new_code_base = nr * 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值