Porting:linux内核的模块化、根文件系统的制作和自动挂载
1、关于内核模块($: linux #: 开发板)
模块化设计。
$:' vi drivers/char/Makefile
obj-m += led_drv.o
$:' make uImage -j4
$:' cp arch/arm/boot/uImage /tftpboot/
#:' tftp 48000000 uImage
#:' bootm 48000000
#: dmesg | grep "led_init"
// 验证并没有执行led_drv.c中的函数
$:' make modules
#:' cat /proc/cmdline
//显示加载根文件的目录
$:' cp drivers/char/led_drv.ko /opt/rootfs
#:' cd /
#:' insmod led_drv.ko
// 安装内核模块
#:' lsmod
// 显示内核中动态安装的模块信息
#:' rmmod led_drv
// 卸载模块,无文件后缀名。
$:' make menuconfig
Kernel hacking --->
[ 4 ]Default message log level (1-7) // 修改为4,默认打印优先级
$:' cp arch/arm/boot/uImage /tftpboot/
#:' tftp 48000000 uImage
// 在uboot命令行下烧写uImage
#:' mmc write 48000000 800 3000
#:' re
// 进入开发板linux系统
#:' cd /
#:' insmod led_drv.ko
// [ 113.771000] call led_init!
#:' rmmod led_drv.ko
// [ 367.357000] call led_exit!
2. 让自己的模块可以通过make menuconfig来显示
make menuconfig
看到的所有的菜单元素都来源于各级子目录下的Kconfig
关于Kconfig文件的语法规则:
kernel/Documentation/kbuild/kconfig-language.txt
$:' vi drivers/char/Kconfig
10 config MY_LED
11 tristate "My led driver - Jan" // 变量类型为三态,3种取值
12 default y // 默认取值
13 help // 帮助信息不能超过help下第一行的对齐
14 This is my first kernel driver of led...
15 hello, world!!!
16 ah, ha ha ha ha ...
$:' make menuconfig
// .config 中会出现1个变量 CONFIG_MY_LED
$:' vi drivers/char/Makefile
obj-$(CONFIG_MY_LED) += led_drv.o
规律:
cp xxx.c drivers/char/
vi drivers/char/Kconfig
vi drivers/char/Makefile
-----------------------------------------------------------
1、根文件系统的制作
1.1 什么是根文件系统
【文件系统】文件的索引信息、文件的具体数据、操作索引的具体代码
操作索引的具体源码:kernel/fs/
ext2/3/4、fat、nfs、jffs2、gfs2、jffs2、yaffs2...
【根文件系统】linux内核启动时,加载的第1个文件系统
/bin 可执行程序
/dev 块、字符设备节点文件
/etc 主要配置文件盒初始化执行文件
/lib 基本库文件
/mnt 挂载点,临时挂载文件系统用
/opt 附加的软件包
/proc 虚拟文件系统,用于内核和进程通讯
/sbin 基本的系统管理程序
/tmp 临时文件目录
/usr 更多的用户程序
/sys 虚拟文件系统
/var 可变信息存储
根文件系统中存储的文件都是有特定需求的。
2、 准备根文件系统中必备的文件(目录)
2.1 【生成arm处理器能够使用的命令】
使用开源软件busybox
$:' cd ~/jy/porting/
$:' cp ~/workdir/rootfs/busybox-1.23.2.tar.bz2 .
$:' tar xvf busy*
开源程序,首先从README开始读。
$:' make menuconfig
Busybox Settings --->
Build Options --->
[*] Build shared libbusybox // 共享库
Installation Options ("make install" behavior) --->
What kind of applet links to install (as soft-links) --->
// 软连接(保持默认)
(./_install) BusyBox installation prefix (NEW)
// make install(保持默认)
$:' vi Makefile
164 CROSS_COMPILE ?= arm-...-gnueabi-
190 ARCH ?= arm
$:' make
$:' make install
** 查看busybox相关信息与linux文件系统对比,非必须步骤 **
$:' cd _install
$:' file bin/busybox
bin/busybox: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 3.4.5, BuildID[sha1]=0xe3bc5b540a72815fb0ae47eb360bf32ecaacb350, stripped
$:' du -h /bin
8.9M /bin
$:' du -h bin/
956K bin/
$:' du -h /sbin
9.1M /sbin
$:' du -h sbin/
4.0K sbin/
2.2 【准备busybox可执行程序所需要的库文件】
$:' cd ~/jy/porting/busybox-1.23.2/_install
$:' mkdir lib
$:' ll /opt/arm-cortex_a9-...-2.18/arm-...-gnueabi/sysroot/lib/libm.so.6
lrwxrwxrwx 1 tarena tarena 20 2月 23 14:26 lib/libm.so.6 -> libm-2.18-2013.10.so
$:' cp /opt/arm-cortex_a9-...-2.18/arm-...-gnueabi/sysroot/lib/libm.so.6 lib/ -d
$:' cp /opt/arm-cortex_a9-...-2.18/arm-...-gnueabi/sysroot/lib/libm-2.18-2013.10.so lib/ -d
$:' cp /opt/arm-cortex_a9-...-2.18/arm-...-gnueabi/sysroot/lib/libc.so.6 lib/ -d
$:' cp /opt/arm-cortex_a9-...-2.18/arm-...-gnueabi/sysroot/lib/libc-2.18-2013.10.so lib/ -d
$:' cp /opt/arm-cortex_a9-...-2.18/arm-...-gnueabi/sysroot/lib/ld*.so* lib/ -d
2.3 【准备系统启动所需的】
$:' mkdir etc
配置一:
$:' vi etc/inittab
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
配置二:
$:' mkdir etc/init.d
$:' vi etc/init.d/rcS
// 开机自启动的程序
#!/bin/sh
#自动挂载/etc/fstab文件中指定的分区
mount -a
#热插拔事件处理 创建设备文件
echo /sbin/mdev >/proc/sys/kernel/hotplug
mdev -s
$:' chmod +x etc/init.d/rcS
$:' vi etc/fstab
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
2.4 【创建必要的目录】
$:' mkdir proc/ sys/ tmp/ dev/ var/ mnt/ opt/
2.5 【创建必要的设备文件】
linux内核启动时需要使用两个设备文件
/dev/console : 控制台设备
/dev/null : 黑洞文件
// 设备文件的创建使用 mknod 命令
$:' sudo mknod dev/console c 5 1
$:' sudo mknod dev/null c 1 3
$:' sudo chown tarena:tarena dev/console
$:' sudo chown tarena:tarena dev/null
3、验证根文件系统数据的有效性
通过nfs方式加载。
服务器:
$:' sudo vi /etc/exports
/home/tarena/jy/porting/busybox-1.23.2/_install *(rw,sync,no_root_squash)
// 新增此行内容【注意路径!!】
$:' sudo /etc/init.d/nfs-kernel-server restart
// 重启服务器
客户端:
// 进入uboot命令行
#:' setenv bootargs root=/dev/nfs nfsroot=192.168.1.8:/home/tarena/jy/porting/busybox-1.23.2/_install ip=192.168.1.6:192.168.1.8:192.168.1.1:255.255.255.0 lcd=vs070cxn tp=gslx680-linux console=ttySAC0,115200 maxcpus=1 init=/linuxrc
// 修改了nfsroot的目录【注意路径!!】,新增了 init=/linuxrc
#:' saveenv
-------------------------------------------------------
【知识点】:
【1】 busybox 生成 bin比PC上的bin小很多
原因一: _install/bin的所有命令都是
PC机上对应命令的简化版本
原因二: _install/bin所有的命令都是执行
bin/busybox的软链接文件
ls 等效于 busybox ls
【2】 关于可执行程序busybox
$:' file bin/busybox
$:' arm-...-gnueabi-readelf -d bin/busybox
共享库:[libm.so.6]
共享库:[libc.so.6]
$:' which arm-...-gnueabi-gcc
/opt/arm-cortex_a9-...-2.18/bin/arm-...-gnueabi-gcc
$:' cd /opt/arm-cortex_a9-...-2.18/
$:' find ./ -name "libm.so.6"
./arm-...-gnueabi/sysroot/lib/libm.so.6
// 找到所需要的共享库
$:' ll arm-...-gnueabi/sysroot/lib/libm.so.6
// 软连接形式存在:libm.so.6 -> libm-2.18-2013.10.so*
<tips>
$:' cp -d
-d:保持软连接属性
-a:等价于 -dR
【3】linux自举完成后会去执行1号进程
1号进程如果指定为linuxrc// busybox linuxrc
linuxrc对应的实现代码
/home/tarena/porting/busybox-1.23.2/init/init.c
init_main()
{
打开 解析/etc/inittab
}
inittab文件有着固定的格式
<id>:<runlevel>:<action>:<process>
前两项在嵌入式根文件系统中经常忽略
在action条件下去执行process(可执行程序/脚本)
【4】fstab文件的格式
device mount-point type options dump fsck
devcie:要挂载的设备或者分区
mount-point: 挂载点
type: 文件系统类型
options: 挂载时的参数
-rw,对该device可读可写
defaults
dump: 对该分区是否备份
默认 给0
fsck: 是否对该分区进行格式检查
默认 给0
【5】设备文件的创建
touch
mknod dev/xxx c major minor
c: 字符设备
major: 主设备号
minor: 次设备号
Porting:linux内核的模块化、根文件系统的制作和自动挂载相关推荐
- linux 内核移植和根文件系统的制作【转载】
原文地址:http://www.cnblogs.com/hnrainll/archive/2011/06/09/2076214.html 1.1 Linux内核基础知识 在动手进行Linux内核移植之 ...
- linux 文件系统覆盖目录,Linux内核裁减及根文件系统定制
一.内核编译 1.准备工作 (1)整理出系统需要支持的硬件.文件系统类型以及网络协议等内容. (2)建议用命令uname –r 查看一下系统的版本号,如果你的系统版本与将要编译的内核版本一致,建议将/ ...
- Linux内核移植和根文件系统制作(详细步骤精讲)
第一章移植内核 1.1 Linux内核基础知识 1.1.1 Linux版本 1.1.2 什么是标准内核 1.1.3 Linux操作系统的分类 1.1.4 linux内核的选择 1.2 Linux内核启 ...
- s5pv210 linux内核移植,简单根文件系统制作 - S5PV210 Linux3.8.3内核移植_Linux编程_Linux公社-Linux系统门户网站...
1.这里为什么选nfs文件系统呢? 在产品开发阶段,因为nfs根文件系统并不需要编译进内核,方便调试. 2.制作根文件系统需要用到BusyBox 解压进入busybox目录: root@linuxid ...
- linux内核加载根文件系统,根文件系统 - Linux 内核引导选项简介
[KNL] root=字符串 指定根文件系统的所在位置.通常这是一个必须明确设置的选项. "字符串"可以使用如下几种形式: XXxx 一个16进制数,其中"XX" ...
- Linux——根文件系统的制作(jffs2 and ubifs)
一.根文件系统简介 根文件系统首先是一种文件系统,该文件系统不仅具有普通文件系统的存储数据文件的功能,但是相对于普通的文件系统而言它还是内核启动时所挂载(mount)的第一个文件系统,系统引导启动程序 ...
- Linux根文件系统的制作
1. 根文件系统 文件系统是包括在一个磁盘(包括光盘.软盘.闪盘及其它存储设备)或分区的目录结构:一个可应用的磁盘设备可以包含一个或多个文件系统:如果您想进入一个文件系统,首先您要做的是挂载(moun ...
- 根文件系统rootfs制作——使用buildroot工具(重制版)
根文件系统rootfs制作--使用buildroot工具(重制版) 0.前言 一.rootfs配置 1.下载buildroot源码 2.开始配置 Target options配置如下: Toolcha ...
- 第一季8:完整版(即包含mpp)根文件系统的制作
以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除. 一.概述 mpp是海思编写的与视频编解码有关的驱动.库等内容.我们需要部署这些内容,也就是把这些内容放在合适的目录位置. 二.mpp的目 ...
最新文章
- ArcGIS License Manager 相关总结
- 怎么用python读取大文件_使用Python读取大文件的方法
- atitit.提升开发效率---mda 软件开发方式的革命
- 暑期英语学习(词组积累)【持续更新中】
- 【NIPS 2017】基于深度强化学习的想象力增强智能体
- 使用服务器代替雷达信号处理,雷达数字信号处理解决方案
- 【爆漏】酷我音乐盒再曝缺陷
- 【校招实习面试实战,身临其境】华为软件开发工程师面试复盘总结
- c语言程序设计基本模板,《C语言程序设计基础教程》试讲教案模板
- 在文档中怎么画横线实线_怎样在一个word文档中添加一根实线,用作分开不同
- 所爱隔山海,山海皆可平
- MPEG2-PS格式分析实例
- 步进电机控制Proteus仿真
- IP-guard项目实施前情况调查表
- [特别篇] 评中国药学家距诺贝尔奖一步之遥
- 安卓微信浏览器唤起系统内部浏览器
- 《把时间当作朋友》 - 书评
- CV_shortcomings of original GAN
- 互联网时代程序员如何避免知识半衰期?
- 结构方程模型amos软件一些常见的处理问题
热门文章
- 配置上位机软件开发环境BOOST及cmake等
- 知到计算机专业英语翻译,计算机专业英语翻译_new重点.doc
- 如何快速成为微信小程序流量主
- doxygen教程-10-生成调用关系图
- 小米笔记本 Pro安装Mac OS_X(10. 15)双系统,亲自实战!
- python实现凯撒密码
- 基于android平台的云记事本软件,安卓记事本毕业论文--基于Android平台记事本的设计与实现...
- 微信H5页面跳转小程序 - Vue中使用微信开放标签<wx-open-launch-weapp>
- 一张图看懂开源许可协议,开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别
- 创龙基于TI AM335x ARM Cortex-A8 CPU,主频高达1GHz开发板CAN总线接口、RTC座