linux内核调试

三大帮助命令:

XXX -h(xxx –help)

man -a XXX

info XXX

 

arm-elf-XXX 工具集是用于uclinux的。

 

设备驱动程序的开发过程:

1.查看原理图,理解设备的工作原理。

2.定义设备号。

3.实现初始化函数。驱动的注册和卸载。

4.设计所要实现的文件操作,定义file_operations结构。

5.实现中断服务,并用request_irq向内核注册,中断并不是每个设备驱动所必需的。

6.编译该驱动程序到内核中,或者用insmod命令加载模块。

7.测试该设备,编写应用程序,对驱动程序进行测试。

 

与中断和内存不同,使用一个没有申请的I/O端口不会使处理器产生异常,也就不会导致诸如“segmentationfault”一类的错误发生。由于任何进程都可以访问任何一个I/O端口,此时系统无法保证对I/O端口的操作不会发生冲突,甚至因此而使系统崩溃。因此,在使用I/O端口前,也应该检查此I/O端口是否已有别的程序在使用,若没有,再把此端口标记为正在使用,在使用完以后释放它。在设备驱动程序中,一般都需要用到计时机制。在Linux系统中,时钟是由系统接管的,设备驱动程序可以向系统申请时钟。printk打印的信息不仅出现在屏幕上,同时还记录在文件syslog里。

内核模块与系统中其他程序一样是已链接的目标文件,但不同的是它们被链接成可重定位映像。内核将为其分配一个新的module结构,以及足够的内核内存,并将新模块添加在内核模块链表的尾部,然后将新模块标记为uninitialized。

 

老的:

ret = devfs_register_chrdev(GPIO_LED_MAJOR,"led_drv", &GPIO_LED_ctl_ops);

混杂设备:

ret= misc_register(&misc);

 

块设备驱动程序的编写与字符设备驱动程序的编写有很大不同,块设备驱动最具特色的就是其请求队列。块设备一般有个通用块层。一个bio结构体是在通用块层或更底层对块设备i/o操作的的表示单位。通常1个bio对应1个I/O请求。

 

 

查看可执行映像的大小:size

得到映像文件或目标文件中的符号列表:objdump -syms test.o

反汇编映像文件:objdump -disassemble test.o

编译一个源文件:gcc test.c -o  test 或者 gcc -o image first.c second.c thrid.c

包含头文件编译:gcc test.c -I../inc/  -I../../inc2 -o test

在源文件中定义的符号常量(使用:#define)可以在编译的时候使用:gcc -D TEST_CONFIGURATION test.c -o test

一些调试选项加上 -g

检查普通警告的选项是-Wall

此外,还有一些优化等级选项。

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值