【Linux网络源码4】组件初始化基础架构

组件初始化基础架构

(一)引导期间内核选项

    引导阶段,会调用parse_args两次,负责引导期间配置输入数据。parse_args是一个函数,用于解析输入字符串,输入的字符串是一些参数,寻找特定关键字并启用适当处理的函数

(二)注册关键字

    内核组件使用__setup宏,注册关键字和相关联的处理函数:

__setup(string,function_handler)

string是关键字,function_handler是相关联的处理函数。处理函数实例:

net/core/dev.c

__setup("netdev=", netdev_boot_setup);

    两次调用parse_args原因是引导期间选项分成两类:

  1. 默认选项
    使用__setup定义,并且在parse_args第二次被调用时处理。
  2. 初期选项
    内核提供了parse_early_papams选项,这些选项会有一个特殊的标识。内核引导期间,这些选项必须必其他选项更早的处理。

(三)两次调用parse_args

  1. 第一遍只看必须在初期处理的较高优先级的选项,由一个特殊标志(early)标识。
  2. 第二遍则会不足所有其他选项。遵循旧模型的所有选项都会在这一遍处理。
旧的选项和新的选项会放在两个不用的内存区域:
旧:
__setip_start......__setip_end

这个区域会在引导阶段结束时释放掉。内核引导后这些选项就不在需要了,用户无法再运行期间查看或修改这些选项。

新:
__start___param......__stop___param

这个区域不会被释放,内容会输出到/sys,展露给用户。

(四)init.setip

在include\linux\init.h中,存储__setip的两个输入数据

struct obs_kernel_param {
    // 关键字
	const char *str;
    // 处理函数
	int (*setup_func)(char *);
    // 是否在第一遍检查
	int early;
};
  • 所有obs_kernel_param会放入一个专用的内存区域。这样做有两个原因:
    1. 容易遍历所有实例。
    2. 这些数据结构不再使用的时候,内核可以快速释放所有数据结构。

(五)网络选项初始化配置

ether=netdev=都使用netdev_boot_setup处理。结果保存在数据结构中:

struct netdev_boot_setup {
    // 设备名
	char name[IFNAMSIZ];
    // 存储输入配置值的数据结构
	struct ifmap map;
};

struct ifmap {
	unsigned long mem_start;
	unsigned long mem_end;
	unsigned short base_addr; 
	unsigned char irq;
	unsigned char dma;
	unsigned char port;
	/* 3 bytes spare */
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值