编译linux内核和文件系统
2. linux 文件系统 内核编译
1、第一条命令没问题;
2、第二条命令:
#mkfs.ext2 myfs
myfs is not a block special device.
无路如何也要继续?(y,n)
这时要输入y
3、第三条命令,linux kernel不支持myext2文件系统。我猜你是想要在红帽或ubuntu上mount一个ext2文件系统的loop设备,但是想使用myext2的文件系统驱动,对吧。我没有这么做过,猜不出你的myext2摘出来之后是什么样子的。我以前试过在linux安装新的文件系统支持,比如fuse系统,源码编译通过后会生成一个.ko的模块文件,使用insmod命令将其加入内核,才能获得内核对该文件系统的支持。我想你可能也应该这样做,你应该需要生成一个类似myext2.ko的模块,然后将其insmod到内核中去。
3. 如何配置编译在mini2440开发板上运行的linux内核
参考:http://www.it165.net/os/html/201409/9334.html
系统ubuntu12.04(非虚拟机下)
mini2440
CPU型号: S3C2440AL-40
Nanflash型号:K9F1G08
Norflash型号:SST39VF1601
LCD: 统宝 240 x 320
$: 普通账户
#:root账户
*当shell下输入路径时可使用tab键自动补全
(一)建立交叉编译环境
1.将mini2440光盘中的linux文件夹拷贝到 /home/lianghuiyong 并改名为Linux_share
(其中两个文档为我后面添加进去的)
2.Ctrl+Alt+T打开shell
3.$ su - root (切换root权限)
4.# cd /home/lianghuiyong/Linux_share
5.解压安装arm-linux-gcc编辑器
# tar xvzf arm-linux-gcc-4.4.3.tar.gz –C / //注意:C后面有个空格
执行该命令,将把 arm-linux-gcc 安装到/usr/loca/arm/4.4.3 目录。这句来自mini2440用户手册,我发现其实是安装到 /opt/FriendlyARM/toolchain/4.4.3 目录
6.# vim /root/.bashrc
7.在最后一行添加:export PATH=$PATH:/opt/FriendlyARM/toolschain/4.4.3/bin //opt/FriendlyARM/toolschain/4.4.3/bin 为arm-linux-gcc 环境变量
:wq保存退出。
# source ~/.bashrc
8.# sudo gedit /etc/environment
games后面添加标记部分
9.# arm-linux-gcc -v //gcc后面有空格
测试hello.c(这是在安装了第二部分的linux示例程序才有examples/hello目录)
# cd /opt/FriendlyARM/mini2440/examples/hello
# arm-linux-gcc -o hello hello.c
# ./hello
(二)安装源代码及其他工具
创建工作目录(以下都为root环境下):
# mkdir -p /opt/FriendlyARM/mini2440
1>>解压安装linux内核源代码
# cd /opt/FriendlyARM/mini2440
# tar xvzf /home/lianghuiyong/Linux_share/linux-2.6.32.2-mini2440-20100106.tar.gz
2>>解压安装嵌入式图形系统qtopia源代码
# cd /opt/FriendlyARM/mini2440
# tar xvzf /home/lianghuiyong/Linux_share/x86-qtopia.tgz
# tar xvzf /home/lianghuiyong/Linux_share/arm-qtopia.tgz
3>>解压安装嵌入式图形系统 QtE-4.6.1 源代码
# cd /opt/FriendlyARM/mini2440
# tar xvzf /home/lianghuiyong/Linux_share/arm-qte-4.6.3-20100802.tar.gz
4>>解压安装busybox 源代码
# cd /opt/FriendlyARM/mini2440
# tar xvzf /home/lianghuiyong/Linux_share/busybox-1.13.3-mini2440.tgz
5>>解压安装 Linux 示例程序
# cd /opt/FriendlyARM/mini2440
# tar xvzf /home/lianghuiyong/Linux_share/examples-20100108.tgz
6>>解压安装 vboot 源代码
# cd /opt/FriendlyARM/mini2440
# tar xvzf /home/lianghuiyong/Linux_share/vboot-src-20100106.tar.gz
7>>解压安装 bootloader 源代码
# cd /opt/FriendlyARM/mini2440
# tar xvzf /home/lianghuiyong/Linux_share/bootloader.tgz
8>>解压创建目标文件系统
# cd /opt/FriendlyARM/mini2440
#tar xvzf /home/lianghuiyong/Linux_share/rootfs_qtopia_qt4-20100816.tar.gz
9>>解压安装目标文件系统映象制作工具 mkyaffs2image
# cd /opt/FriendlyARM/mini2440
# tar xvzf /home/lianghuiyong/Linux_share/mkyaffs2image.tgz –C /
10>>解压安装LogoMaker
# cd /opt/FriendlyARM/mini2440
# tar xvzf /home/lianghuiyong/Linux_share/logomaker.tgz –C /
(三)定制linux内核及制作文件系统
config_mini2440_x35 – 适用于 Sony 3.5” LCD 的内核配置文件
config_mini2440_t35 – 适用于统宝 3.5” LCD 的内核配置文件
config_mini2440_l80 – 适用于 Sharp 8” LCD(或兼容)的内核配置文件
config_mini2440_n35 – 适用于 NEC3.5” LCD 的内核配置文件
config_mini2440_h43 – 适用于 4.3” LCD 的内核配置文件
config_mini2440_a70 – 适用于群创 7” LCD 的内核配置文件
config_mini2440_vga1024x768 – 适用于 VGA 显示输出(分辨率 1024x768)模块的内核
配置文件
1.配置缺省文件config_t35 (统宝240x320)
# cd /opt/FriendlyARM/mini2440/linux-2.6.32.2
# cp config_mini2440_t35 .config
# make menuconfig
出现界面
不做更改,exit退出。这样做是为了生成相应配置(统宝240x320)的头文件。
2.编译内核
在/opt/FriendlyARM/mini2440/linux-2.6.32.2 目录下编译内核
#make zImage
编译结束后,会在 arch/arm/boot 目录下生成 linux 内核映象文件:zImage(zImage 可下载到开发板测试)
3.定制linux内核(根据用户手册来走一遍)
# cd /opt/FriendlyARM/mini2440/linux-2.6.32.2
# make menuconfig
出现配置选项:
3.1配置cpu
主菜单-->System --> Type S3C2400 Machines --> FriendlyARM Mini2440 development board
3.2配置lcd驱动
主菜单-->Device Drivers-->Graphics support-->Support for frame buffer devices-->Backlight-->LCD select-->3.5 inch 240x320 Toppoly LCD
3.3配置触摸屏
主菜单-->Device Drivers-->Input device support-->Touchscreens-->Samsung s3c24410 touchscreen input driver
3.4配置usb鼠标和键盘
主菜单-->Device Drivers-->hid devices-->USB Human interface Device
3.5 配置优盘
主菜单-->Device Drivers-->SCSI device support--> SCSI disk
3.6配置万能驱动USB摄像头
主菜单-->Device Drivers-->Multimedia devices-->Video capture adapters -->V4L USB devices-->GSPCA based webcams-->ALi USB m 5602 Camera Driver
3.7 配置CMOS摄像头驱动
主菜单-->Device Drivers-->Multimedia devices-->Video capture adapters-->OV9650 on the s3c2440 driver
3.8配置网卡驱动
主菜单-->Netwoking support-->Networking options -->选择Unix和TCP/IP
主菜单-->Device Drivers-->Network device support-->Ethernet (10 or 100Mbit)-->
选择 <*> Generic Media Independent Interface device support
<*> DM9000 support
3.9 配置USB无线网卡驱动
主菜单-->Netwoking support-->wireless-->IEEE 802.11
主菜单-->Device Drivers-->Netwoking device support-->wireless LAN-->Wireless LAN(IEEE 802.11)-->Ralink driver support-->
3.10 配置音频驱动
主菜单-->Device Drivers-->Sound card supprt-->OSS Mixer API -->ALSA for Soc audio support-->SoC Audio for the samsung S3Cxxxx Chips
3.11 配置SD/MMC卡驱动
主菜单-->Device Drivers-->MMC/SD/SDIO card-->samsung S3C SD/MMC card
3.12 配置看门狗驱动支持
主菜单-->Device Drivers-->Watchdog Timer-->s3c2440 Watchdog
3.13 配置LED驱动
主菜单-->Device Drivers-->Character devices-->LED support for Mini2440
3.14 配置按键驱动
主菜单-->Device Drivers-->Character devices-->Buttons driver
3.15 配置PWM控制蜂鸣器驱动
主菜单-->Device Drivers-->Character devices-->buzzer driver for
3.16 配置AD转换驱动
主菜单-->Device Drivers-->Character devices-->ADC driver for
3.17 配置串口驱动
主菜单-->Device Drivers-->Character devices-->Serial drivers-->samsung S3C2440/S3C2442
3.18 如何配置RTC实时时钟驱动
主菜单-->Device Drivers-->Real Time Clock-->samsung S3C series SoC RTC
3.19 配置I2C-EEPROM驱动支持
主菜单-->Device Drivers-->I2C support -->I2C Hardware Bus support-->S3C2410 I2C Driver
3.20 配置yaff2s文件系统的支持
主菜单-->Device Drivers-->MTD-->NAND Device Support -->NAND FLASH Support
主菜单-->File systems-->Miscellaneous filesystems -->YAFFS2 file system support
3.21 配置EXT2/VFAT/ NFS等文件系统
主菜单-->File systems-->Network File Systems -->root file system on NFS
为了支持FAT32 文件系统.
主菜单-->File systems-->DOS/FAT/NT Filesystems -->VFAT (windows-95) fs support
关于mini2440 linux内核裁剪到此为止,退出后有一个是否保存提示,选择保存!
3.22 制作Linux logo
本来想使用Logomaker,结果生成的图片都是无数据的,这可能和系统内一些参数有关
使用命令方式制作logo:
在图片(open_show.png)目录下
# pngtopnm open_show.png > temp.ppm
# ppmquant 224 temp.ppm >temp2.ppm
# pnmnoraw temp2.ppm > logo.ppm
将目录下生成的logo.ppm改成linux_logo_clut224.ppm,替代linux2.6.32.2/drivers/video/logo 目录下的同名文件
4. linux内核与文件系统是什么关系啊
内核与文件系统的关系
技术上说Linux是一个内核。“内核”指的是一个提供硬件抽象层、磁盘及文件系统控制、多任务等功能的系统软件。一个内核不是一套完整的操作系统。一套基于Linux内核的完整操作系统叫作Linux操作系统,或是GNU/Linux。
文件系统是kernel的一部分。文件系统实现了系统上存储介质和其他资源的交互。kernel tree中的fs目录都是关于文件系统的,可以说它是kernel的一个大子系统。
嵌入式系统在flash中分配了存放内核、根文件系统的区域。bootloader加载了内核,内核启动,加载文件系统,进入Linux系统。
整个嵌入式系统而言,可以分为三个部分1.uboot 2.kernel 3.文件系统。其中kernel中以VFS去支持各种文件系统,如yaffs,ext3,cramfs等等。yaffs/yaffs2是专为嵌入式系统使用NAND型闪存而设计的一种日志型文件系统。在内核中以VFS来屏蔽各种文件系统的接口不同,以VFS向kernel提供一个统一的接口。如打开一个文件时统一使用open,写时采用write,而不用去考虑是那种文件系统,也不用去考虑文件系统是如何将数据写入物理介质的。其中 kernel中的配置,只是让VFS支持这种接口。
5. 在编译内核时修改linux文件系统出现这样的情况,不能保存,怎么破
这个是linux的保护机制,一般配置文件会自动产生一个.old文件。
因为文件非常重要,所以linux的保护机制提示需要备份一个,配置出错也能恢复。
每次操作一些文件的时候不妨 cp /xx/yyyy/aa.bbb /xx/yyyy/aa.bbb.old 后再进行操作。
这样出错了也能自己手动恢复回来,应该养成这样一个良好的习惯。
编辑的话觉得vi用不惯可以用nano。gedit编辑好像会出问题,以前我配置网卡IP的时候nano,vi写出来没问题,gedit写出来就有问题。这个我也就不懂了
6. linux 编译内核几个常见问题解决方法
第一次把自己编译的驱动模块加载进开发板,就出现问题,还好没花费多长时间,下面列举出现的问题及解决方案
1:出现insmod: error inserting 'hello.ko': -1 Invalid mole format
法一(网上的):是因为内核模块生成的环境与运行的环境不一致,用linux-2.6.27内核源代码生成的模块,可能就不能在linux-2.6.32.2内核的linux环境下加载,需要在linux-2.6.27内核的linux环境下加载。
a.执行 uname -r //查看内核版本
b.一般出错信息被记录在文件/var/log/messages中,执行下面命令看错误信息
# cat /var/log/messages |tail
若出现类似下面:
Jun 4 22:07:54 localhost kernel:hello: version magic '2.6.35.6-45.fc14.i686.PAE
' should be '2.6.35.13-92.fc14.i686.PAE'
则把 Makefile里的KDIR :=/lib/moles/2.6.35.6-45.fc14.i686.PAE/build1 改为
KDIR :=/lib/moles/2.6.35.13-92.fc14.i686.PAE/build1 //改成自己内核源码路径
(这里的build1是一个文件链接,链接到/usr/src/kernels/2.6.35.6-45.fc14.i686.PAE和13-92的)
然并卵,我的fedora 14 /usr/src/kernels下并没有2.6.35.13-92.fc14.i686.PAE,只有2.6.35.13-92.fc14.i686,虽然不知道两者有什么区别,但改成2.6.35.13-92.fc14.i686还是不行,照样这个问题,还好后来在看教学视频的到启发
法二:改的还是那个位置
KDIR :=/opt/FriendlyARM/linux-2.6.32.2 //把这里改成你编译生成kernel的那个路径
all:
$ (MAKE) -C $ (KDIR) M = $ (PWD) moles ARCH=arm CROSS_COMPILE=arm-linux- //加这句
2. [70685.298483] hello: mole license 'unspecified' taints kernel.
[70685.298673] Disabling lock debugging e to kernel taint
方法:在模块程序中加入: MODULE_LICENSE("GPL");
3. rmmod: chdir(2.6.32.2-FriendlyARM): No such file or directory 错误解决
方法:lsmod 可查看模块信息
即无法删除对应的模块。
就是必须在/lib/moles下建立错误提示的对应的目录((2.6.32.2)即可。
必须创建/lib/moles/2.6.32.2这样一个空目录,否则不能卸载ko模块.
# rmmod nls_cp936
rmmod: chdir(/lib/moles): No such file or directory
但是这样倒是可以卸载nls_cp936,不过会一直有这样一个提示:
rmmod: mole 'nls_cp936' not found
初步发现,原来这是编译kernel时使用make moles_install生成的一个目录,
但是经测试得知,rmmod: mole 'nls_cp936' not found来自于busybox,并不是来自kernel
1).创建/lib/moles/2.6.32.2空目录
2).使用如下源码生成rmmod命令,就可以没有任何提示的卸载ko模块了[luther.gliethttp]
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
int main(int argc, char *argv[])
{
const char *modname = argv[1];
int ret = -1;
int maxtry = 10;
while (maxtry-- > 0) {
ret = delete_mole(modname, O_NONBLOCK | O_EXCL);//系统调用sys_delete_mole
if (ret < 0 && errno == EAGAIN)
usleep(500000);
else
break;
}
if (ret != 0)
printf("Unable to unload driver mole \"%s\": %s\n",
modname, strerror(errno));
}
3).把生成的命令复制到文件系统
# arm-linux-gcc -static -o rmmod rmmod.c
# arm-linux-strip -s rmmod
# cp rmmod /nfs/
cp /nfs/rmmod /sbin
代码如下:
proc.c
[html] view plain
<span style="font-size:18px;">#include <linux/mole.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/proc_fs.h> /* Necessary because we use the proc fs */
#define procfs_name "proctest"
MODULE_LICENSE("GPL");
struct proc_dir_entry *Our_Proc_File;
int procfile_read(char *buffer,char **buffer_location,off_t offset, int buffer_length, int *eof, void *data)
{ int ret;
ret = sprintf(buffer, "HelloWorld!\n");
return ret;
}
int proc_init()
{ Our_Proc_File = create_proc_entry(procfs_name, 0644, NULL);
if (Our_Proc_File == NULL) {
remove_proc_entry(procfs_name, NULL);
printk(KERN_ALERT "Error: Could not initialize /proc/%s\n",procfs_name);
return -ENOMEM; }
Our_Proc_File->read_proc = procfile_read;//
// Our_Proc_File->owner = THIS_MODULE;
Our_Proc_File->mode = S_IFREG | S_IRUGO;
Our_Proc_File->uid = 0;
Our_Proc_File->gid = 0;
Our_Proc_File->size = 37;
printk("/proc/%s created\n", procfs_name);
return 0;
}
void proc_exit()
{ remove_proc_entry(procfs_name, NULL);
printk(KERN_INFO "/proc/%s removed\n", procfs_name);
}
mole_init(proc_init);
mole_exit(proc_exit);</span></span></span></span></span>
[html] view plain
<span style="font-size:18px;">
ifneq ($(KERNELRELEASE),)
obj-m :=proc.o
else
KDIR :=/opt/FriendlyARM/linux-2.6.32.2
#KDIR :=/lib/moles/2.6.35.13-92.fc14.i686.PAE/build1
PWD :=$(shell pwd)
all:
$(MAKE) -C $(KDIR) M=$(PWD) moles ARCH=arm CROSS_COMPILE=arm-linux-
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers
endif</span></span></span></span></span>
make后生成proc.ko,再在开发板上insmod proc.ko即可
执行 dmesg 就可以看到 产生的内核信息啦
7. linux内核编译和根文件系统制作过程
内核编译:
make
menuconfig配置相应的平台,然后保存退出直接make命令就可以编译了。
文件系统制作:
一般都用busybox开源软件来做,下载,解压,然后make
menuconfig配置你想要的属性,然后保存退出,make就可以了,然后make
install就会在目录下看到__install的目录就是你要的根文件系统目录了。
8. linux如何编译安装新内核支持NTFS文件系统(
第一步: 对硬件进行设置,使其满足要求并下载内核:
1. 新添加一块20G的硬盘及修改内存: