MTD(memory technology device内存技术设备) 在硬件和文件系统之间提供了一个抽象的接口。linux
接下来,咱们在uClinux下实现MTD,进入目录:cd /work/uClinux-dist/linux-2.4.x/drivers/mtd/mapsapp
修改config.in文件:sudo gedit Config.in,在endmenu前添加一行:less
dep_tristate ' CFI Flash device mapped on myboard_flash' CONFIG_MTD_MYFLASH $CONFIG_MTD_CFI,以下图:spa
保存退出。3d
而后再该目录下添加myflash.c文件。下面连接里有flash.c文件,直接使用。blog
在该路径下修改Makefile文件,增长obj-$(CONFIG_MTD_MYFLASH) += myflash.o,以下图内存
在路径/work/uClinux-dist/linux-2.4.x/include/linux/mtd下,修改mtd.h文件。命令:sudo gedit mtd.h开发
修改前:get
修改后:
进入目录:/work/uClinux-dist/vendors/Marvell/Firefox,修改Makefile,命令:sudo gedit Makefile,以下图:
增长:
\
mtd0,c,90,0 mtd1,c,90,2 mtd2,c,90,4 \
mtdblock0,b,30,0 mtdblock1,b,30,1 mtdblock2,b,30,2 \
以下图:
接下来更新内核配置,在目录/work/uClinux-dist/下执行命令:sudo make xconfig,按照下面几幅图一步一步选。
保存退出之后,执行命令:sudo make,等待编译完成。
编译完成之后,下载到开发板,具体步骤和命令就再也不累述了。可是在重启开发板的时候出现了下面的问题:
具体缘由是:内核太大了,内存不够用,须要将一些东西卸载。这里我选择第三节课所讲的telnet卸载:
在目录在目录/work/uClinux-dist/下执行命令:sudo make xconfig
保存而且退出之后,接下来按照下面的来选择,
保存退出。而后执行命令:sudo make。再次将它下载进入开发板。下载完成之后,重启开发板,若是还出现以上状况,那么,把NFS也卸载了,直到不在出现以上问题。
下载到开发板,成功的截图以下:
能够经过cat命令查看:
格式化/dev/mtdblock0
将/mnt文件夹挂载到/dev/mtdblock0
将/bin目录下的一个文件,好比newusr,复制到/mnt里,
而后解挂,命令:umount /mnt
重启开发板,而后而后再将/mnt文件夹挂载到/dev/mtdblock0,即是将/dev/mtdblock0里的数据传递给/mnt
而后咱们检查一下/mnt里是否有newuser,
如上图,说明MTD配置成功。
有了MTD咱们要修改用户名和密码就有了思路:咱们将改好的用户名和密码复制到/mnt,并将/mnt挂载到/dev/mtdblock0,再开机重启的时候,经过rc脚本命令,将/dev/mtdblock0里的数据也就是修改之后的密码传递给etc目录下覆盖以前的PsWd文件。
首先应该编写一个修改密码和用户名的程序,在/work/uClinux-dist/user/scu目录下星将一个文件newusr.c,命令:sudo gedit newusr.c
里面的内容以下:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <pwd.h>
#include <getopt.h>
#include <errno.h>
#include <string.h>
#include <crypt.h>
#define PATH_PASSWD "/etc/PsWd" //定义存放真实用户名和密码的路径
char usernamebuf[128];
char userPswbuf[128];
int main()
{
FILE *fp;
char * newuser,*newpsw;
char * cryptmode = "ab";
int i=0;
char userinfo[128]={'u','s','e','r','='};
char pwdinfo[128]={'p','a','s','s','w','d','='};
if((fp = fopen(PATH_PASSWD,"w"))== NULL){
printf("fail to create or open the file\n");
return -1;
}
printf("New Nser:\n");
fgets(usernamebuf, sizeof(usernamebuf), stdin);
newuser=crypt(usernamebuf,cryptmode);
for(i=0;i<sizeof(newuser);i++)
{
userinfo[5+i]=newuser[i];
}
printf("New Passwd:\n");
fgets(userPswbuf, sizeof(userPswbuf), stdin);
newpsw=crypt(userPswbuf,cryptmode);
for(i=0;i<sizeof(newpsw);i++)
{
pwdinfo[7+i]=newpsw[i];
}
fputs(userinfo,fp);
fputs("\n",fp);
fputs(pwdinfo,fp);
fclose(fp);
return 0;
}
修改Makefile
EXEC = newusr
OBJS = newusr.o
all: $(EXEC)
$(EXEC): $(OBJS)
$(CC) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS)
romfs:
$(ROMFSINST) /bin/$(EXEC)
clean:
-rm -f $(EXEC) *.elf *.gdb *.o
而后,到目录:/work/uClinux-dist/vendors/Marvell/Firefox下执行命令:sudo gedit rc
在文件尾添加:
意思为:将保存的PsWd数据传递给/etc下,这样在开机启动的时候数据就复制到PsWd里了,用户名和密码就是修改的值了。
到目录/work/uClinux-dist下执行命令:sudo make
编译完成后,将程序下载到开发板。
重启,此时咱们尚未执行修改密码和用户名的程序,因此,程序仍是执行初始时设置的用户名和密码,
到/bin目录下执行newusr程序,命令:./newusr
如上设置新的用户名和密码,并回车,将新的数据保存到PsWd文件里,
而后,格式化/dev/mtdblock0
将/mnt文件夹挂载到/dev/mtdblock0
将/etc目录下的一个文件,好比newusr,复制到/mnt里,
/>cp /etc/PsWd /mnt
而后解挂,命令:umount /mnt,将数据所有传输到mtdblock0里面,
重启开发板。
此时输入新的用户名和密码就能够登陆进去了。
这节课的内容不算多,可是很差理解,尤为是MTD的问题,利用好MTD作一个登录程序用户名和密码的修改让我作到心态爆炸,多亏了同窗的帮助才理解了一点,但愿接下来可以作的更完善。