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做一個登陸程序用戶名和密碼的修改讓我做到心態爆炸,多虧了同學的幫助才理解了一點,希望接下來能夠做的更完善。