linux內核導出符號

Linux 2.6系統的"/proc/kallsyms"文件對應着內核符號表,它記錄了符號以及符號所在的內存地址。

模塊可以使用如下宏導出符號到內核符號表:

EXPORT_SYMBOL(符號名);

EXPORT_SYMBOL_GPL(符號名);     //只適用於包含GPL許可權的模塊;

符號必須在模塊文件的全局部分導出,不能在函數中導出,這是因爲上述這兩個宏將被擴展成一個特殊用途的聲明,而該變量必須是全局的。

使用方法:

1.在模塊函數或符號定義後使用EXPORT_SYMOL_GPL(符號名);

2.在調用的模塊中使用extern聲明與之對應;

3.必須保證被調用的符號所在模塊已被加載;

舉例說明下,比如我們要使用driver/char/pwm.c中的變量pwm_dev及函數pwm_set_duty_cycle(),如下所示:

struct pwm_dev pwm_dev = {
	.id = 11,
	.mux_offset = GPT11_MUX_OFFSET,
};
EXPORT_SYMBOL_GPL(pwm_dev);


int pwm_set_duty_cycle(struct pwm_dev *pd, u32 duty_cycle)
{
	u32 new_tmar;

	if (duty_cycle > 100)
		return -EINVAL;

	if (duty_cycle == 0) {
		pwm_off(pd);
		return 0;
	}

	new_tmar = (duty_cycle * pd->num_settings) / 100;

	if (new_tmar < 1)
		new_tmar = 1;
	else if (new_tmar > pd->num_settings)
		new_tmar = pd->num_settings;

	pd->tmar = pd->tldr + new_tmar;
	pwm_on(pd);
	pd->current_val = duty_cycle;

	return 0;
}
EXPORT_SYMBOL_GPL(pwm_set_duty_cycle);
如果我們在板級文件board-am3517evm.c中調用該函數,需要先聲明再調用:

extern struct pwm_dev pwm_dev;
.......
......
......
pwm_set_duty_cycle(&pwm_dev,0);


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章