让vdsp与uclinux共舞(7):在内核为驱动预留空间
来源:互联网 发布:网页美工实例教程 编辑:程序博客网 时间:2024/05/05 15:21
快乐虾
http://blog.csdn.net/lights_joy/
lights@hb165.com
本文适用于
ADSP-BF561
Visual DSP++ 5.0(update 6)
Bfin-uclinux-2009r1.6
欢迎转载,但请保留作者信息
我们在内核的bss段预留一段1M的空间,同时规定此空间的前面64个字节用于内核与驱动通信之用。之所以选用bss段是因为我们希望在内核初始化时将之清0。
为了预留空间,我们修改vmlinux.lds.s:
.bss :
{
. = ALIGN(4);
___bss_start = .;
__vdsp_driver_start = .;
. += 1024 * 1024;
__vdsp_driver_end = .;
………
}
然后定义一个结构体:
typedef struct _vdsp_comm
{
int driver_loaded;
void (*driver_load)();
int driver_exited;
void (*driver_exit)();
}vdsp_comm;
extern char _vdsp_driver_start[];
当内核线程检测到driver_loaded时它将调用driver_load进行初始化,当检测到dirver_exited时它将调用driver_exit。
咱直接使用idle线程来检测,在(arch/blackfin/kernel/process.c中):
void cpu_idle(void)
{
/* endless idle loop with no priority at all */
while (1) {
void (*idle)(void) = pm_idle;
vdsp_comm* pcomm = (vdsp_comm*)_vdsp_driver_start;
if(pcomm->driver_loaded)
{
printk("driver loaded detect!");
if(pcomm->driver_load)
{
printk("prepare to init driver");
pcomm->driver_load();
}
else
printk("no init function setup");
pcomm->driver_loaded = 0;
}
if(pcomm->driver_exited)
{
printk("driver exited detect!");
if(pcomm->driver_exit)
{
printk("prepare to exit driver");
pcomm->driver_exit();
}
else
printk("no exit function setup");
pcomm->driver_exited = 0;
}
…………….
}
现在我们需要记下几个地址给vdsp使用,这些地址来自于System.map.initramfs:
00139000 B __vdsp_driver_start
00239000 B __vdsp_driver_end
00129190 R ___start___ksymtab
在VDSP下加载内核,此时a核上运行的是uclinux内核,b核跑的是一段空闲代码,我们保持a核运行,让b核中断,打开b核的Memory窗口,找到__vdsp_driver_start的位置,即0x00139000,将第一个字节改为1,此时内核的idle线程将检测到数据变化,但因为没有配置回调函数,因此我们将在命令行看到其输出:
driver loaded detect!和no init function setup。
刷新一下b核的Memory窗口,可以看到刚刚修改的值又改回了0。
这说明我们对内核的修改已经起作用了!
1 参考资料
让vdsp与uclinux共舞(6):用vdsp开发驱动的设想(2009-11-2)
让vdsp与uclinux共舞(5):加入dwarf调试信息(2009-11-2)
让vdsp与uclinux共舞(4):加载uclinux(2009-11-2)
让vdsp与uclinux共舞(3):boot kernel(2009-10-31)
让vdsp与uclinux共舞(2):vdsp的影响(2009-10-31)
让VDSP与uclinux共舞(1):开篇(2009-10-30)
关于uClinux-2.6(bf561) for VDSP的移植(2008/3/11)
- 让vdsp与uclinux共舞(7):在内核为驱动预留空间
- 让vdsp与uclinux共舞(14):驱动发布
- 让vdsp与uclinux共舞(6):用vdsp开发驱动的设想
- 让vdsp与uclinux共舞(8):vdsp驱动框架
- 让vdsp与uclinux共舞(4):加载uclinux
- 让vdsp与uclinux共舞(9):查找内核函数
- 让vdsp与uclinux共舞(10):加载SMP内核
- 让VDSP与uclinux共舞(1):开篇
- 让vdsp与uclinux共舞(3):boot kernel
- 让vdsp与uclinux共舞(11):方案改进
- 让vdsp与uclinux共舞(12):应用程序开发
- 让vdsp与uclinux共舞(13):应用程序加载
- 让vdsp与uclinux共舞(15):总结
- 让vdsp与uclinux共舞(18):让VDSP读取vmlinux的调试信息
- 让vdsp与uclinux共舞(2):vdsp的影响
- 让vdsp与uclinux共舞(5):加入dwarf调试信息
- 让vdsp与uclinux共舞(16):修正一处错误
- 让vdsp与uclinux共舞(17):实战uboot-2009r1-rc3
- 单例模式的三种实现方式:singleton
- URL重写
- linux tail 命令详解!Linux 文件内容查看工具介绍
- 《嵌入式linux应用程序开发完全手册》通用异步收发器UART学习笔记
- 存储过程实例
- 让vdsp与uclinux共舞(7):在内核为驱动预留空间
- Not live in vain——Leo关于生与死的感悟
- 对上传附件类的扩展——装饰模式
- C语言读文件
- jrtplib 分包处理
- Linux升级后OpenOffice没有反应
- 防火墙规则静态检测——FireWallRulesAnalyzer
- 端口查看命令
- Oracle复制解决方案