内核编译
一、ARM开发板
X6818 使用的芯片是 : 三星 S5P6818的芯片(8 核A53 ARM 架 构)
ARM : 英国剑桥一个公司的名字,只授权 ARM 架构的技术 给一些 厂家:
授权给三星: S5P4418, S3C2440, S3C44B0, S5P6818 ....
华为设计芯片的公司:麒麟 990 ,麒麟1000 (找台积电生产)
台积电:有光刻机 (荷兰的 ASML)
ASML: 美国公司控股。
核心板: ARM芯片+内存+NAND flash (1G/2G)组成
底板: 底板+核心票
底板: 硬件接口: USB, LED, KEY, NET , SD, UART ,LCD , GPIO
二、手动配置内核
嵌入式系统: 根据应用的硬件,来定制一个linux系统
把 linux 内核裁剪:定制(裁剪掉不需要的代码模块,只需要保留需 要的模块)
执行命令:tar jxvf x6818_linux_180209.tar.bz2 -C ~
解压得到内核源码包: home/china/x6818_linux_180209/linux/kernel/kernel-3.4.39
配置这个 内核源码包: 裁剪
交叉编译这个 源码包 -----> uImage 内核镜像文件
交叉编译: 在 ubuntu上 编译 ARM 平台运行的程序
交叉编译工具: ARM平台上运行的程序,内核
编译工具是要用:arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
1.解压工具包
sudo tar jxvf arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 -C /usr/local/arm 交叉编译工具的路径:/usr/local/arm/arm-2014.05/bin
export PATH=/usr/local/arm/arm-2014.05/bin:$PATH (临时有效)
vim ~/.bashrc 把 一句添加到 最后一行 (永久有效)
2. 把 myln.sh (在群里) 复制到 /usr/local/arm/arm-2014.05/bin
sudo cp myln.sh /usr/local/arm/arm-2014.05/bin
sudo ./myln.sh
3. arm-linux-gcc -v
上面结果说明已经成功安装了 arm-linux-gcc 。
4. sudo apt-get install libncurses5-dev
5. cd ~/x6818_linux_180209/linux/kernel/kernel-3.4.39
6. make menuconfig ,进入内核配置图形界面
如果配置完成之后, 保存得到一个 .config 文件。
7. 在 root用户也添加一个 PATH路径
sudo su
vim /root/.bashrc
在后面添加路径:export PATH=/usr/local/arm/arm-2014.05/bin:$PATH
8. .config 厂家已经配置好了一个 默认配置文件 x6818-defconfig
将~/x6818_linux_180209/linux/kernel/kernel-3.4.39/arch/arm/configs/x6818-defconfig文件复制到~/x6818_linux_180209/linux/kernel/kernel-3.4.39/.config,命令:
cp ~/x6818_linux_180209/linux/kernel/kernel-3.4.39/arch/arm/configs/x6818-defconfig ~/x6818_linux_180209/linux/kernel/kernel-3.4.39/.config
9.执行命令
cd ~/x6818_linux_180209/linux
sudo ./mk -u
得到这个文件:/home/china/x6818_linux_180209/linux/bootloader/u-boot-2014.07/tools/mkimage
拷贝程序到/bin ,即配置环境变量:
cp /home/china/x6818_linux_180209/linux/bootloader/u-boot-2014.07/tools/mkimage /bin
sudo make uImage arch=arm CROSS_COMPILE=arm-linux-
上面这条命令执行的时间可能有些长,耐心等待。最后出现 uImage already 字眼表示成功执行,生成一个uImage 内核镜像文件。
sudo ./mk -k 编译内核镜像 boot.img
sudo ./mk -u 编译 u-boot启动文件: u-bookpak.bin
sudo ./mk -b 编译 文件系统: qt-rootfs.img
以上3个镜像文件: 组成了 嵌入式系统。
三、添加一个内核菜单,即添加一个内核模块
以下编译一个hello (将~/x6818_linux_180209/linux/kernel/kernel-3.4.39/drivers/char/beep 文件复制成同一目录下的 hello,将hello里的 x8618-beep.c 文件改名为 x8618-hello.c) 模块为例。
1.方式一:编译进内核
每次添加一个 内核模块,就要去重新编译内核,再烧写开发板 菜单是如何生成的?
kbuild 编译系统。
hello里的 kconfig 是用来生成菜单的一个脚本文件,改写成如下内容:
hello里的 Makefile 是用来指定编译哪个源文件的脚本文件,改写成如下内容:
上一级目录 kconfig,改写成如下内容:
上一级目录的 Makefile,改写成如下内容:
再在之前的目录下,再次执行命令:
make uImage arch=arm CROSS_COMPILE=arm-linux-
CC kernel/configs.o
LD kernel/built-in.o
CC drivers/char/hello/x6818-hello.o ====>hello编译进内核
LD drivers/char/hello/built-in.o
LD drivers/char/built-in.o
LD drivers/built-in.o
LD vmlinux.o
2. 方式二:编译成 module
可以把内核模块,选择编译成 module 方式。将hello里的Kconfig文件改写成如下:
注意:其他要修改的文件按方式一里的改。
编译命令如下:
得到一个 x6818-hello.ko 内核模块文件。
在内核开发图形菜单界面中存在hello选项:
下载到开发板:
insmod x6818-hello.ko 动态加载模块
rmmod x6818-hello 动态卸载模块
3. 方式三:自己写一个 Makefile
再把 Makfefile 和一个 x6818-hello.c 放到一个目录,Makefile 内容如下(路径改为自己的路径)。
在对应的目录下make 就会产生 : x6818-hello.ko 。
烧写到开发板的 NAND FLASH (硬盘)
连接 USB-SERI 线到 电脑:
使用 secureCRT 工具: 执行 SecureCRT.exe 。
连接成功后,按换行键,如下操作,登录:
Welcome to X6818
X6818 login:
Welcome to X6818
X6818 login: root
Password: 123456
[root@X6818:~]# ===> 6818开发板的命令行
下载 x6818-hello.ko 内核模块到开发板(命令:rz)。
insmod hello.ko 加载模块到内核
lsmod 查看 内核有什么模块
rmmod hello 卸载hello模块
此时加载模块hello.ko会失败,由于hello模块是复制的代码,模块加载的机制会出现重复加载。所以改写 hello.c 代码即可。可以改写hello.c 代码如下:
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
int hello_init(void)
{
printk(KERN_INFO "hello init module\n");
return 0;
}
void hello_exit()
{
printk(KERN_INFO "hello exit module\n");
return ;
}
module_init(hello_init); //insmod hello.ko
module_exit(hello_exit); //rmmod hello
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("hello module");