6.1 MTD
MTD(memory technology device内存技术设备) 在硬件和文件系统之间提供了一个抽象的接口。
6.1.1 MTD驱动
接下来,我们在uClinux下实现MTD,进入目录:cd /work/uClinux-dist/linux-2.4.x/drivers/mtd/maps
修改config.in文件:sudo gedit Config.in,在endmenu前添加一行:
dep_tristate ' CFI Flash device mapped on myboard_flash' CONFIG_MTD_MYFLASH $CONFIG_MTD_CFI,如下图:
保存退出。
然后再该目录下添加myflash.c文件。下面链接里有flash.c文件,直接使用。
在该路径下修改Makefile文件,增加obj-$(CONFIG_MTD_MYFLASH) += myflash.o,如下图
在路径/work/uClinux-dist/linux-2.4.x/include/linux/mtd下,修改mtd.h文件。命令:sudo gedit mtd.h
修改前:
修改后:
进入目录:/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 \
如下图:
6.1.2 更新内核配置
接下来更新内核配置,在目录/work/uClinux-dist/下执行命令:sudo make xconfig,按照下面几幅图一步一步选。
保存退出以后,执行命令:sudo make,等待编译完成。
6.1.3 下载到开发板
编译完成以后,下载到开发板,具体步骤和命令就不再累述了。但是在重启开发板的时候出现了下面的问题:
具体原因是:内核太大了,内存不够用,需要将一些东西卸载。这里我选择第三节课所讲的telnet卸载:
在目录在目录/work/uClinux-dist/下执行命令:sudo make xconfig
保存并且退出以后,接下来按照下面的来选择,
保存退出。然后执行命令:sudo make。再次将它下载进入开发板。下载完成以后,重启开发板,如果还出现以上情况,那么,把NFS也卸载了,直到不在出现以上问题。
下载到开发板,成功的截图如下:
可以通过cat命令查看:
6.1.4 用MTD保存配置
格式化/dev/mtdblock0
将/mnt文件夹挂载到/dev/mtdblock0
将/bin目录下的一个文件,比如newusr,复制到/mnt里,
然后解挂,命令:umount /mnt
重启开发板,然后然后再将/mnt文件夹挂载到/dev/mtdblock0,便是将/dev/mtdblock0里的数据传递给/mnt
然后我们检查一下/mnt里是否有newuser,
如上图,说明MTD配置成功。
6.2 登录用户名和密码修改
有了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里面,
重启开发板。
此时输入新的用户名和密码就可以登录进去了。
6.3 总结
这节课的内容不算多,但是不好理解,尤其是MTD的问题,利用好MTD做一个登陆程序用户名和密码的修改让我做到心态爆炸,多亏了同学的帮助才理解了一点,希望接下来能够做的更完善。
来源:oschina
链接:https://my.oschina.net/u/4337946/blog/3781141