在BIOS源码里初始化BSS段内存
来源:互联网 发布:vector与数组的区别 编辑:程序博客网 时间:2024/05/12 01:39
今天调试BIOS会发生注册ethernet_register_protocol函数里发生注册失败的问题。
内核代码:
/* netman_start_monitor_device - start the monitor device and all protocol handlers for it */
int netman_start_monitor_device(void)
{
if (!ether_device_init(monitor_ether_device)) return FALSE;
PRTRACE2("device started, device:%d\n", monitor_ether_device);
arp_init(monitor_ether_device);
PRTRACE2("ARP initialised, device:%d\n", monitor_ether_device);
ip_init(monitor_ether_device);
PRTRACE2("IP initialised, device:%d\n", monitor_ether_device);
udp_init(monitor_ether_device);
PRTRACE2("UDP initialised, device:%d\n", monitor_ether_device);
device_initialised[monitor_ether_device] = TRUE;
return TRUE;
}
现象:
device started, device:0
Failed to register ethernet protocol 8,6
ARP initialised, device:0
Failed to register ethernet protocol 8,0
IP initialised, device:0
UDP initialised, device:0
Successed to start network.
Waiting for link......
OK!
定位文件</bios/net/ethernet.c>发现:
代码申请的局部变量
static struct
{
int in_use;
ethernet_packet_handler processing_function;
ethernet_protocol_id protocol_id;
void * protocol_data;
} protocol_table[MAX_ETHER_DEVICES][MAX_REGISTERED_ETHERNET_PROTOCOLS];
会发生初始值不为0的情况,导致数据结构使用中发生错误。
C语言规定全局变量和static变量(不管是函数里的还是函数外的)如果不初始化则初值为0,未初始化的和明确初始化为0的全局变量、static变量都会分配在bss段。
解决这个问题,只需要专门在BIOS main函数里初始化BSS段为0,步骤如下:
(1) 查找到代码编译生成的链接规则文件<bios/lds/console.lds0.S>文件,里面可以找到BSS段的内存区间。
(2) 初始化BSS段方法</bios/init/main.c>里添加代码:
void start_kernel(void)
{
#if 1
extern char _edata, _end;
unsigned long pro_len = &_end - &_edata;
memset (&_edata, 0, pro_len);
printk("bss_start: %p\nbss_end: %p\n", &_edata, &_end);
#endif
local_irq_disable();
// omitted
}
- 在BIOS源码里初始化BSS段内存
- bss段初始化
- BSS 未初始化段
- BSS段为什么需要初始化
- BSS段为什么需要初始化
- BSS段为什么需要初始化
- 初始化的和未初始化的全局变量分别放在什么地方?BSS段的全称是啥?为啥用BSS 段,有啥好处
- BSS PE中的未初始化段
- memset在STVD中初始化BSS段的数据(COSMIC)
- BSS段,数据段,代码段,堆内存和栈
- BSS段,数据段,代码段,堆内存和栈
- BSS段,数据段,代码段,堆内存和栈
- [C语言内存分配] text段,data段,bss段
- 内存分布--bss段/Data段/Text段/堆/栈
- BSS段,数据段,代码段,堆内存和栈
- BSS段,数据段,代码段,堆内存和栈
- BSS段,数据段,代码段,堆内存和栈
- BSS段,数据段,代码段,堆内存和栈
- hibernate Criteria QBC,QBE查询
- mysql笔记 一 基础篇
- mysql笔记 二 字段类型
- 初学android注意事项
- mysql笔记 三 查询语句 where having group order by
- 在BIOS源码里初始化BSS段内存
- linux /dev 常见特殊设备介绍与应用[loop,null,zero,full,random]
- mysql笔记 四 左连接 视图 字符集
- mysql笔记 五 触发器
- 提高开发效率小技巧
- mysql 笔记 六 存储引擎 事务 索引 存储过程
- 收集需求的方法:群体创新技术
- PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
- 何在Ext.Ajax.request正请求后台数据时弹出个正在请求的提示框?