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作一個登錄程序用戶名和密碼的修改讓我作到心態爆炸,多虧了同窗的幫助才理解了一點,但願接下來可以作的更完善。