Linux环境开发指南
Jiaojinxing (讨论 | 贡献) (→搭建 SylixOS Linux 编译环境) |
Jiaojinxing (讨论 | 贡献) |
||
第164行: | 第164行: | ||
(位于/home/user/sylixos_workspace/examples/hello_library/Debug目录)。 | (位于/home/user/sylixos_workspace/examples/hello_library/Debug目录)。 | ||
+ | |||
+ | git clone https://github.com/qt4sylixos/qemu-mini2440.git | ||
+ | |||
+ | cd qemu-mini2440 | ||
+ | |||
+ | ./configure --target-list=arm-softmmu | ||
+ | |||
+ | 如果出现如下提示: | ||
+ | Error: zlib check failed | ||
+ | Make sure to have the zlib libs and headers installed. | ||
+ | 那么执行 | ||
+ | $ sudo apt-get install zlib1g-dev | ||
+ | |||
+ | 同样,如果出现 | ||
+ | Error: sdl check failed | ||
+ | 则执行如下安装 | ||
+ | $ sudo apt-get install libsdl1.2-dev | ||
+ | |||
+ | $ make | ||
+ | 正确编译之后,会在arm-softmmu下生成qemu-system-arm文件 | ||
+ | |||
+ | 4. 配置qemu的网络功能 | ||
+ | |||
+ | 在上面的介绍中,我们使用mini2440-qemu启动了uboot,但是此时的qemu并没有网络功能,那么也就不能使用u-boot通过NFS或者TFTP来加载内核或者文件系统,为了方便开发,接下来,我们为qemu配置网络功能。 | ||
+ | |||
+ | qemu支持多种网络链接方式,其中最常用的就是桥接(bridge)。 这需要依赖内核的tun/tap模块的支持。 | ||
+ | |||
+ | 安装必要的工具包 | ||
+ | $ sudo apt-get install uml-utilities | ||
+ | $ sudo apt-get install bridge-utils | ||
+ | |||
+ | 首先执行 | ||
+ | $ ls -l /dev/net/tun | ||
+ | crw-rw-rwT 1 root root 10, 200 Jul 26 08:28 /dev/net/tun | ||
+ | |||
+ | 如果上面的文件存在,这表明内核已经支持开启了tun支持,ubuntu12.04中,这个功能默认已经开启。如果这个文件不存在,则需要加载tun模块,并创建/dev/net/tun文件。 | ||
+ | |||
+ | 修改下面三个文件 | ||
+ | /etc/network/interfaces | ||
+ | 添加 | ||
+ | /etc/qemu-ifup | ||
+ | /etc/qemu-ifdown | ||
+ | |||
+ | 修改 /etc/network/interfaces,笔者的文件如下: | ||
+ | $ cat /etc/network/interfaces | ||
+ | # This file describes the network interfaces available on your system | ||
+ | # and how to activate them. For more information, see interfaces(5). | ||
+ | |||
+ | # The loopback network interface | ||
+ | auto lo | ||
+ | iface lo inet loopback | ||
+ | |||
+ | # The primary network interface | ||
+ | allow-hotplug eth0 | ||
+ | #iface eth0 inet dhcp | ||
+ | iface eth0 inet manual | ||
+ | |||
+ | auto br0 | ||
+ | iface br0 inet dhcp | ||
+ | bridge_ports eth0 | ||
+ | |||
+ | 默认情况下,当qemu使用tap设备时,会执行/etc/qemu-ifup和/etc/qemu-ifdown这两个脚本。 | ||
+ | 我们需要创建这两个脚本,然后为它们加上可执行权限(使用chmod +x),然后将它们放在/etc/目录下。 | ||
+ | |||
+ | 创建/etc/qemu-ifup 脚本,内容如下所示 | ||
+ | $ cat /etc/qemu-ifup | ||
+ | #!/bin/sh | ||
+ | |||
+ | echo sudo tunctl -u $(id -un) -t $1 | ||
+ | sudo tunctl -u $(id -un) -t $1 | ||
+ | |||
+ | echo sudo ifconfig $1 0.0.0.0 promisc up | ||
+ | sudo ifconfig $1 0.0.0.0 promisc up | ||
+ | |||
+ | echo sudo brctl addif br0 $1 | ||
+ | sudo brctl addif br0 $1 | ||
+ | |||
+ | echo brctl show | ||
+ | brctl show | ||
+ | |||
+ | 创建/etc/qemu-ifdown脚本,如下所示 | ||
+ | $ cat /etc/qemu-ifdown | ||
+ | #!/bin/sh | ||
+ | |||
+ | echo sudo brctl delif br0 $1 | ||
+ | sudo brctl delif br0 $1 | ||
+ | |||
+ | echo sudo tunctl -d $1 | ||
+ | sudo tunctl -d $1 | ||
+ | |||
+ | echo brctl show | ||
+ | brctl show | ||
+ | |||
+ | |||
+ | 5. 运行带有网络功能的mini2440-qemu | ||
+ | |||
+ | 重启计算机,使/etc/network/interfaces的配置生效。 | ||
+ | $ qemu -M mini2440 -mtdblock u-boot.nand -serial stdio -net nic,vlan=0 -net tap,vlan=0,ifname=tap0 | ||
+ | |||
+ | 如果出现如下信息: | ||
+ | warning: could not configure /dev/net/tun: no virtual network emulation | ||
+ | Could not initialize device 'tap' | ||
+ | |||
+ | 那么先手动执行如下命令 | ||
+ | $ /etc/qemu-ifup tap0 | ||
+ | 注意:不可使用sudo执行上述命令 |
2015年5月12日 (二) 17:54的版本
目录 |
搭建 SylixOS Linux 编译环境
- 笔者的主机操作系统是 ubuntu-12.04,使用的是普通用户 user。
安装开发工具
- 编译 Qemu 需要用到主机系统的 g++ 编译器和SDL开发包,而下载 SylixOS 源代码需要 Git 工具,修改配置文件需要用到 vim 编辑器,
如果你的系统不具备这些工具,请先执行如下命令安装它们到你的系统:
sudo apt-get install build-essential sudo apt-get install git sudo apt-get install vim
下载 SylixOS 源代码
- 创建一个名为 sylixos_workspace 的目录(下文约定该目录是 /home/user/sylixos_workspace 目录,即 ~/sylixos_workspace),
打开终端,进入该目录,输入如下命令即可下载 SylixOS Base工程、mini2440开发板BSP工程、示例工程等:
git clone http://git.sylixos.com/repo/sylixos-base.git git clone http://git.sylixos.com/repo/bspmini2440.git git clone http://git.sylixos.com/repo/examples.git git clone http://git.sylixos.com/repo/tools.git
- sylixos-base是SylixOS Base工程,里面包含了libsylixos和libcextern子工程,输入如下命令初始化和更新子工程:
cd sylixos-base git submodule init git submodule update
安装交叉编译器
- 下载的交叉编译器压缩包是 gcc-arm-none-eabi-4_9-2015q1-20150306-linux.tar.bz2。
- 输入如下命令将其解压到 /usr/lib 目录:
sudo tar jxvf gcc-arm-none-eabi-4_9-2015q1-20150306-linux.tar.bz2 -C /usr/lib
- 输入如下命令将解压后的目录重命名为 /usr/lib/gcc-arm-none-eabi 目录(避免编译器升级,版本号日期改变带来不必要的问题):
sudo mv /usr/lib/gcc-arm-none-eabi-4_9-2015q1/ /usr/lib/gcc-arm-none-eabi
- 由于 SylixOS 修改了编译器的 reent.h 文件,所以使用编译器自带的 reent.h 文件将不能编译成功,需要
复制 ~/sylixos_workspace/tools/arm-none-eabi-patch/4.9/reent.h 文件到 /usr/lib/gcc-arm-none-eabi/arm-none-eabi/include/sys 目录替换原有的文件。
- 替换前先备份编译器原有的 reent.h 文件:
sudo mv /usr/lib/gcc-arm-none-eabi/arm-none-eabi/include/sys/reent.h /usr/lib/gcc-arm-none-eabi/arm-none-eabi/include/sys/reent.h.bak
- 再替换编译器原有的 reent.h 文件:
sudo cp ~/sylixos_workspace/tools/arm-none-eabi-patch/4.9/reent.h /usr/lib/gcc-arm-none-eabi/arm-none-eabi/include/sys
- 为了方便后续使用,修改环境变量 PATH:
vim ~/.bashrc
- 添加如下命令到 .bashrc 文件的末尾:
export PATH=/usr/lib/gcc-arm-none-eabi/bin:$PATH
- 最后重新启动终端,输入 arm-none-eabi-gcc 如果得到以下结果说明编译器安装成功:
user@ubuntu:~/sylixos_workspace$ arm-none-eabi-gcc arm-none-eabi-gcc: fatal error: no input files compilation terminated.
编译 SylixOS
编译SylixOS Base工程
- sylixos-base工程包含了SylixOS操作系统libsylixos和SylixOS进程C库libextern子工程。
- 打开sylixos-base下的config.mk,修改为如下:
#********************************************************************************************************* # SylixOS Base Project path #********************************************************************************************************* SYLIXOS_BASE_PATH = /home/user/sylixos_workspace/sylixos-base #********************************************************************************************************* # Toolchain prefix #********************************************************************************************************* TOOLCHAIN_PREFIX = arm-none-eabi- #********************************************************************************************************* # Debug options (debug or release) #********************************************************************************************************* DEBUG_LEVEL = debug
- 输入 make 命令以编译:
make
- 编译耗费的时间视你的机器的性能而定,一般需要10分钟。
- 最后libsylixos子工程生成静态库文件libsylixos.a和libdsohandle.a及libvpmpdm.a、动态库文件libvpmpdm.so、内核模块xinput.ko
和xsiipc.ko、符号表文件symbol.c和symbol.h(位于/home/user/sylixos_workspace/sylixos-base/libsylixos/Debug目录)。
- libextern子工程生成静态库文件libcextern.a和动态库文件libcextern.so(位于/home/user/sylixos_workspace/sylixos-base/libcextern/Debug目录)。
编译bspmini2440工程
- bspmini2440工程是移植SylixOS操作系统到mini2440开发板的BSP工程。
- 打开bspmini2440下的config.mk,修改为如下:
#********************************************************************************************************* # SylixOS Base Project path #********************************************************************************************************* SYLIXOS_BASE_PATH = /home/user/sylixos_workspace/sylixos-base #********************************************************************************************************* # Toolchain prefix #********************************************************************************************************* TOOLCHAIN_PREFIX = arm-none-eabi- #********************************************************************************************************* # Debug options (debug or release) #********************************************************************************************************* DEBUG_LEVEL = debug
- 输入 make 命令以编译:
make
- 最后生成ELF文件bspmini2440.elf和二进制文件bspmini2440.bin(位于/home/user/sylixos_workspace/bspmini2440/Debug目录)。
编译examples工程
- examples工程是示例工程,包括应用程序工程、内核模块工程、库工程。
- 打开examples下的config.mk,修改为如下:
#********************************************************************************************************* # SylixOS Base Project path #********************************************************************************************************* SYLIXOS_BASE_PATH = /home/user/sylixos_workspace/sylixos-base #********************************************************************************************************* # Toolchain prefix #********************************************************************************************************* TOOLCHAIN_PREFIX = arm-none-eabi- #********************************************************************************************************* # Debug options (debug or release) #********************************************************************************************************* DEBUG_LEVEL = debug
- 输入 make 命令以编译:
make
- examples工程包含了三个子工程:应用程序示例工程hello_world、内核模块示例工程hello_module、库示例工程hello_library。
- 应用程序示例工程hello_world会生成应用程序可执行文件hello_world(位于/home/user/sylixos_workspace/examples/hello_world/Debug目录)。
- 内核模块示例工程hello_module会生成内核模块文件hello_module(位于/home/user/sylixos_workspace/examples/hello_module/Debug目录)。
- 库示例工程hello_library会生成静态库文件libhello_library.a和动态库文件libhello_library.so
(位于/home/user/sylixos_workspace/examples/hello_library/Debug目录)。
git clone https://github.com/qt4sylixos/qemu-mini2440.git
cd qemu-mini2440
./configure --target-list=arm-softmmu
如果出现如下提示: Error: zlib check failed Make sure to have the zlib libs and headers installed. 那么执行 $ sudo apt-get install zlib1g-dev
同样,如果出现 Error: sdl check failed 则执行如下安装 $ sudo apt-get install libsdl1.2-dev
$ make 正确编译之后,会在arm-softmmu下生成qemu-system-arm文件
4. 配置qemu的网络功能
在上面的介绍中,我们使用mini2440-qemu启动了uboot,但是此时的qemu并没有网络功能,那么也就不能使用u-boot通过NFS或者TFTP来加载内核或者文件系统,为了方便开发,接下来,我们为qemu配置网络功能。
qemu支持多种网络链接方式,其中最常用的就是桥接(bridge)。 这需要依赖内核的tun/tap模块的支持。
安装必要的工具包 $ sudo apt-get install uml-utilities $ sudo apt-get install bridge-utils
首先执行 $ ls -l /dev/net/tun crw-rw-rwT 1 root root 10, 200 Jul 26 08:28 /dev/net/tun
如果上面的文件存在,这表明内核已经支持开启了tun支持,ubuntu12.04中,这个功能默认已经开启。如果这个文件不存在,则需要加载tun模块,并创建/dev/net/tun文件。
修改下面三个文件 /etc/network/interfaces 添加 /etc/qemu-ifup /etc/qemu-ifdown
修改 /etc/network/interfaces,笔者的文件如下: $ cat /etc/network/interfaces
- This file describes the network interfaces available on your system
- and how to activate them. For more information, see interfaces(5).
- The loopback network interface
auto lo iface lo inet loopback
- The primary network interface
allow-hotplug eth0
- iface eth0 inet dhcp
iface eth0 inet manual
auto br0 iface br0 inet dhcp
bridge_ports eth0
默认情况下,当qemu使用tap设备时,会执行/etc/qemu-ifup和/etc/qemu-ifdown这两个脚本。 我们需要创建这两个脚本,然后为它们加上可执行权限(使用chmod +x),然后将它们放在/etc/目录下。
创建/etc/qemu-ifup 脚本,内容如下所示 $ cat /etc/qemu-ifup
- !/bin/sh
echo sudo tunctl -u $(id -un) -t $1 sudo tunctl -u $(id -un) -t $1
echo sudo ifconfig $1 0.0.0.0 promisc up sudo ifconfig $1 0.0.0.0 promisc up
echo sudo brctl addif br0 $1 sudo brctl addif br0 $1
echo brctl show brctl show
创建/etc/qemu-ifdown脚本,如下所示 $ cat /etc/qemu-ifdown
- !/bin/sh
echo sudo brctl delif br0 $1 sudo brctl delif br0 $1
echo sudo tunctl -d $1 sudo tunctl -d $1
echo brctl show brctl show
5. 运行带有网络功能的mini2440-qemu
重启计算机,使/etc/network/interfaces的配置生效。 $ qemu -M mini2440 -mtdblock u-boot.nand -serial stdio -net nic,vlan=0 -net tap,vlan=0,ifname=tap0
如果出现如下信息: warning: could not configure /dev/net/tun: no virtual network emulation Could not initialize device 'tap'
那么先手动执行如下命令 $ /etc/qemu-ifup tap0 注意:不可使用sudo执行上述命令