2013年09月06日
/************************************************************************************************************************************************************************************************************/
内核编译:
1.
tar xf linux-2.6.28_smdk6410.tar.bz2
2.
make clean把临时文件删了
//make distclean把配制文件删除了==>得到一个干净的内核
老刘经验之谈:
与硬件相关:arch目录
最好的linux注释:linux-2.6.28_smdk6410/Documentation
3.
make config==>用命令来配制我们要生成的linux
make menuconfig==>用菜单来生成的linux
/linux-2.6.28_smdk6410/arch/arm/configs/smdk6410nfs_defconfig==》smdk6410_config
cp smdk6410_config .config
make
cp /linux-2.6.28_smdk6410/arch/arm/boot/zImage /tftpboot==>将最生成的zImage拷到/tftpboot下面,以后我们通过tftp来传到DRAM中
/****************************************************************************************************
一个例子
*****************************************************************************************************/
4.
加入到内核模快中的一个例子:(可以通过菜单来查看,我们将要加入的这个模快,Kconfig,是配制菜单的)
<1>.在/linux-2.6.28_smdk6410/drivers目录下创建youyou目录
<2>.在youyou目录下创建三个文件,分别如下Kconfig ,Makefile,test.c:
-rw-r--r-- 1 root root 152 09-06 17:38 Kconfig
menu "this is youyou"
config YOUYOU
bool "pretty boy"
default y
help
this is youyou pretty boy
hello world ,I'am coming!
welcom.
endmenu
-rw-r--r-- 1 root root 35 09-06 17:35 Makefile
obj-$(CONPIG_YOUYOU) += you.o
-rw-r--r-- 1 root root 21 09-06 10:55 you.c
void youyou()==>仅仅为一个空函数,什么也不做
{}
<3>.youyou上层目录:Makefile加入一句
obj-$(CONFIG_YOUYOU) += youyou/
<4>.youyou上层目录:Kconfig加入一句
source "drivers/youyou/Kconfig"==>source 生效我们的配制
<5>./linux-2.6.28_smdk6410/arch/arm/Kconfig文件中加入下面一句:
source "drivers/youyou/Kconfig"
5.
上面我们以已经生成好内核文件,这里我们进入下一步:
busybox,制做我们的根文件系统:
<1>.
tar xf busybox-1.13.3.tar.bz2
cd busybox-1.13.3
<2>.
make menuconfig
Busybox setting=>Build options==>修改交叉编译前缀,我们的arm-gcc放在那里的.
Busybox setting=>Installation options ==>编译后busybox中的文件放在哪一个目录,在这里我们放在/mynfsroot
<3>.
make ==>编译
<4>.
make install==>将busybox中的bin,sbin,usr,linuxrc放入我们上面指定的根文件系统中,也就/mynfsroot
<5>.
Cp /usr/local/arm/arm-none-linux-gnueabi/arm-none-linux-gnueabi/libc/lib /mynfsroot ==>将我们所需要的库拷到我们做的根文件系统中
<6>.
制做其它文件:
mkdir etc dev sys proc tmp
mkdir etc/init.d
touch etc/init.d/rcS这个文件内容如下:
#/bin/sh
echo "----youyou----"
mount -t proc none /proc
mount -t sysfs none /sys
mount -t tmpfs none /tmp
mkdir dev/console c 5 1
mkdir dev/tty c 5 0
mkdir dev/null c 1 3
mkdir dev/tty0 c 4 0
mkdir dev/tty1 c 4 1
mkdir dev/tty2 c 4 2
mkdir dev/tty3 c 4 3
mkdir dev/tty4 c 4 4
<7>.
chmod 777 * -R ==> 让所有的文件的权限都为777
<8>
为我们插入与删除模快做准备
在lib目录下面创建:modules/2.6.18.(uname -a内核版本号)
<9>.
做一个test.c,Makefile,模快来试验一下:
Test.c:
#include<linux/init.h>
#include<linux/module.h>
#include<linux/thread_info.h>
#include<linux/sched.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("you");
/*实现功能是在内核中打印出当前执行进程的名字*/
用到了struct_info==>struct_stask==>char comm[ ]
在comm数组中保存了录前的进程名字.
int test_init()
{
int i;
unsigned long addr = (unsigned long)&i;
struct thread_info*pp;
pp = (struct thread_info *)(addr & ~((1<<13)-1));//这里以8K的字节对齐
printk("this is test init\n");
printk("this comm is %s\n",pp->task->comm);
return 0;
}
void test_exit()
{
printk("goodbye module!!!!!!!!!!!!!!!!!!\n");
}
module_init(test_init);
module_exit(test_exit);
Makefile文件如下:(make -C 进入linux源代码层顶的目录中执行Makefile,调用我们的Makefile来执行,也就是我们需要顶层目录的环境 )
default:
make -C (顶层makefile) M=(当前makefile)==>指定顶层makefile来编缉当前makefile
clean:
make -C (顶层makefile) M=(当前makefile) clean
obj-m += test.o
<9>.
动态加入模块与卸载:
insmod test.ko
rmmod test
/******************************************************************************************************
次要内容
******************************************************************************************************/
其它:
编译一般的文件:
arm-none-linux-gnueabi-gcc hell.c -o 2th -lc==>用动态库链接
arm-none-linux-gnueabi-gcc hell.c -o 2th -static==>用静态库链接
arm-none-linux-gnueabi-gcc hell.c -o 2th
老刘经验之谈:
1.内核中有函数有返回值,一定要返回!因为再也没有谁来为我们调用exit。就像十八岁了,做什么事要自己负责。
2.物联网:比如一有一个屏幕,我们按下一个键,比如做饭,她就去自动做饭,关窗,就自动关窗。
/*************************************************************
小 题
************************************************************/
周末四个题:
1.mycp ==>将一个文件拷到另一个目录中
2.重搭环境
3.bootloader(nand)==>在U-boot中用名命将linux内核代码写入nand flash中,我们自己写一个nand flash 读程序来读出这个映象linux文件,到DRAM中,看能不能启动内核.
4.ps==>读出所有进程的名字