linux内核编译开始第一天

20130906


/************************************************************************************************************************************************************************************************************/


内核编译:

  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中的binsbinusrlinuxrc放入我们上面指定的根文件系统中,也就/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 进入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==>读出所有进程的名字

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值