使用的3.4.24的内核,如有什么错误就提出来,大家一起学习;
1.找到内核源码;解压;
2.修改名称位llinux(只用于查看内核的);
3.再解压一份,用于编译修改的内核,修改名称为linux3.4(使用的版本)
4.进入到llinux目录下,建立索引:
a.进入arch 目录:删掉除arm 以外的全部平台
mv arm ../
rm -rf *
mv ../arm .
b.进入arm 目录:删掉多余的CPU相关目录
mv mach-s3c64xx ../
mv plat-samsung ../
rm -rf mach-*
rm -rf plat-*
mv ../mach-s3c64xx .
mv ../plat-samsung .
c.回到内核的根目录下,
ctags -R .
d.会在当前目录下生成tags 文件,很大,100多M
e.在当前用户的vim 配置文件(.vimrc)中,添加
set tags = <linux>/llinux/tags
5.使用索引查找的方法:
a.vim -t <func>
b.:cstags <func> 在上面的查找不对的情况下,进入命令行参数;输入命令
c.Ctrl + ] 在查找的函数内再查找,将光标定位到函数上,按键
Ctrl + o 返回原位置
############ 添加驱动 #############
进入linux3.4目录:
cd drivers/
mkdir my_test
cd my_test
vim test.c
--> #include <linux/init.h>
#include <linux/module.h>
//内核接口,硬性规定;返回值必须是int,参数必须是void
//__init:函数放在init 段;只在内核启动过程中执行一次,使用完了函数所占资源就释放了
//static 是怕和别的函数重名
static __init int test_init(void)
{
printk("hello world\n");
//与printf语法相同,只是加了消息机制
return 0;
//若担心出错,return EFAULT;EFAULT是返回错误号
}
//声明内核启动过程中需执行这个函数
module_init(test_init);
//符合符合开源规则(GPL规则)
<-- MODULE_LICENSE("GPL");
vim Makefile
--> obj-y += test.o
@y:yes 需编译
@n:no 不编译
<-- @m:模块 模块设备
vim ../Makefile //回到上层目录的Makefile 添加自己的目录
<-> obj-y += my_test/ //必须加上最后的 / ,这样代表的是目录,会继续搜寻下一层的Makefile
cd ../../
回到llinux目录,编译内核
make
烧到板子上就会在内核启动时看到 hello world
######## make menuconfig #########
1.解压完内核后,初次执行 make menuconfig,
a.编译 scripts 目录,生成 mconf
b.执行 Kconfig 脚本,在内核根目录下生成配置文件 .config,文件内的标号可直接应用在 Makefile 中
2.创建自己的选项卡
进入内核根目录:
cd drivers/my_test/
vim Kconfig
--> config TEST
#创建选项卡
bool "support test"
default n
help
If you select, then ...
menu "TEST_FOR_6410"
#创建选项目录
config IRQ
bool "support irq"
default n
help
...
config VIC_IRQ
bool "support vic_irq"
default n
help
...
config DMA
tristate "support dma"
#配置三态选项卡
default n
help
...
config WDT
bool "support wdt"
default n
depends on IRQ
#依赖于IRQ,IRQ 不选,这个也不会出现在菜单里
help
...
config ADC
bool "support adc"
default n
help
...
config TS
bool "support ts"
default n
depends on ADC && IRQ
help
...
config BUTTON
bool "support button"
default n
depends on IRQ || VIC_IRQ
#依赖于IRQ或VIC_IRQ
help
...
config AC97
bool "support ac97"
default n
depends on IRQ && !DMA
#依赖IRQ,不依赖于DMA
help
...
#设置多选一的选项
comment "I am happy"
#出现在下面选项之前
choice
prompt "select lcd type"
#总的选项卡
config LCD43
bool "lcd 4.3"
help
...
config LCD70
bool "lcd 7.0"
help
...
config LCD100
bool "lcd 10.0"
help
...
endchoice
#条件选择选项,与条件依赖很相似
config GPIO
bool "support gpio"
default n
help
...
if GPIO
config LED
bool "support led"
default n
help
...
endif
#要选DM9000,同时必须选上SROMC
config SROMC
bool "support sromc"
default n
help
...
config DM9000_my
bool "support dm9000_my"
default n
select SROMC
help
...
<-- endmenu
vim ../Kconfig
<-> source "drivers/my_test/Kconfig" //添加自己编写的目录
此时make menuconfig 就可以看到自己的各种目录
3.与Makefile 结合使用,就可配置,编译内核了
进入内核根目录:
vim .config // 找到自己添加的选项卡,前面会自动添加 CONFIG_,自己实现的是CONFIG_TEST
vim drivers/my_test/Makefile
<-> obj-$(CONFIG_TEST) += test.o