Tải bản đầy đủ (.doc) (38 trang)

Thuyết trình lưu chữ dữ liệu.doc

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (208.53 KB, 38 trang )

THUYẾT TRÌNH NHÚNG
ĐỀ TÀI : LƯU TRỮ DỮ LIỆU
Thành viên thực hiện:
Phan Ngọc Châu T076274
Nguyễn Trí Ðạt T077033
Ðặng Tiến Lâm T076339
Lưu Thị Bảo Ngân T072923
Nguyễn Thị Lan Phương T073773
I/ Lưu trữ dữ liệu:
Lưu trữ trên hệ thống nhúng được thực hiện bằng cách sử dụng ROM cho việc lưu
trữ của đọc-mã và NVRAM cho việc lưu trữ cho các đọc-ghi dữ liệu. Tuy
nhiên, đã được thay thế bởi công nghệ flash, cung cấp nonvol mật độ cao atile lưu
trữ. Những lợi thế kết hợp với chi phí thấp của đèn flash có cách sử dụng tăng lên
đáng kể trong các hệ thống nhúng. Chương này bàn về các hệ thống lưu trữ chủ
yếu trên các thiết bị đèn flash và hệ thống tập tin khác nhau có sẵn trên Linux có
nghĩa là cho các hệ thống nhúng. Chương này được chia thành bốn phần.
+ Flash nhúng bản đồ cho Linux.
+Sự hiểu biết MTD (Memory Công nghệ điều khiển) có nghĩa là hệ thống con
chủ yếu cho các thiết bị đèn flash.
+ Sự hiểu biết hệ thống tập tin liên kết với các hệ thống nhúng. Ở đó chuyên hệ
thống tập tin trên bộ nhớ flash và trên bo mạch cho nhúng hệ thống.
+Chỉnh cho không gian lưu trữ thêm: kỹ thuật để siết chặt thêm các chương
trình lên đèn flash của bạn.
1.1 Flash Bản đồ
Trên một hệ thống Linux nhúng, đèn flash thường được sử dụng cho:
+ Lưu trữ các bộ tải khởi động
+ Lưu trữ hình ảnh hệ điều hành
+ Lưu trữ các ứng dụng và ứng dụng thư viện hình ảnh
+ Lưu trữ các đọc-ghi tập tin (có dữ liệu cấu hình)
Trong 4 phần , phần thứ 3 đầu tiên là chỉ đọc cho hầu hết các hệ thống thực
thi thời gian (ngoại trừ ở lần nâng cấp). Đó là nếu bạn sử dụng một bộ tải khởi


động bạn nên có ít nhất hai phân vùng: một có bộ tải khởi động và các cái khác
đang nắm giữ hệ thống tập tin gốc. Các bộ phận của đèn flash có thể được mô
tả như bản đồ flash. Tại đầu của dự án của bạn, bạn đến với một bản đồ flash. Một
bản đồ flash như các bản sửa lỗi bộ nhớ trên bản đồ làm thế nào bạn có kế hoạch
phân vùng đèn flash để lưu giữ các dữ liệu trên và làm thế nào bạn có kế hoạch để
truy cập vào dữ liệu . Sau đây là những vấn đề thiết kế khác nhau sẽ đến khi bạn cố
gắng đóng băng trên một bản đồ flash.
Làm thế nào bạn muốn phân vùng đèn flash? Bạn có thể có hệ điều hành, appli
- Cation, và đọc-ghi ảnh trong một phân vùng duy nhất nhưng điều đó làm tăng
nguy cơ làm hư hỏng các dữ liệu của toàn bộ hệ thống bởi vì toàn bộ các phân
vùng được đọc -ghi. Mặt khác bạn có thể đọc dữ liệu chỉ trong một phân vùng
riêng biệt và đọc-ghi trong một phân vùng riêng để việc đọc dữ liệu được an toàn
từ bất kỳ nhiễm; nhưng sau đó bạn sẽ cần sửa chữa một kích thước trên mỗi phân
vùng và đảm bảo rằng kích thước phân vùng sẽ không được vượt quá tại bất kỳ
điểm nào trong tương lai.
- Làm thế nào bạn muốn truy cập các phân vùng nguyên hoặc bạn muốn sử
dụng một hệ thống tập tin? Nguyên phân vùng có thể có ích cho bộ nạp khởi động
vì sẽ không đòi hỏi bạn phải có một hệ thống tập tin, bạn có thể đánh dấu một khu
vực đèn flash cho giữ dữ liệu cấu hình khởi động và phần còn lại của ngành để giữ
khởi động mã. Tuy nhiên, đối với phân vùng Linux đang nắm giữ dữ liệu, nó là an
toàn hơn để đi qua hệ thống tập tin. Những gì hệ thống tập tin bạn chọn cho các dữ
liệu cũng đóng một vai trò quan trọng trong tờ bản đồ flash.
- Làm thế nào bạn muốn nâng cấp nào? Nâng cấp trên một hệ thống nhúng có
thể được thực hiện trên hệ thống đang chạy hoặc từ khởi động. Trong trường hợp
nâng cấp của bạn liên quan đến việc thay đổi chỉ đọc dữ liệu chỉ tốt hơn để phân
vùng flash thành chỉ đọc và đọc-ghi phân vùng để bạn sẽ không phải làm bất cứ
sao lưu và phục hồi của đọc-ghi dữ liệu.
1,2 MTD- ( Memory technology devices )
MTD là viết tắt của Công nghệ và thiết bị bộ nhớ, là hệ thống con được sử dụng
để xử lý các thiết bị lưu trữ trên tàu. Chính xác những gì là công việc của MTD

và khi nào và làm thế nào để bạn bao gồm các thiết bị đèn flash theo một
MTD hệ thống con? Làm thế nào để đặt hệ thống tập tin trên một thiết bị MTD?
Sau đây là phần trả lời cho những câu hỏi này.
1.2.1 Các Mẫu MTD
Mặc dù các thiết bị đèn flash là thiết bị lưu trữ như đĩa cứng, có một số cơ bản
khác biệt giữa chúng.
+ Thông thường các ổ đĩa cứng có một khu vực kinh tế mà chia một kích
thước trang là 4.096 byte. Giá trị tiêu chuẩn là 512 byte. Các mô hình hệ thống
tập tin Linux, đặc biệt là bộ nhớ cache bộ đệm (cache bộ nhớ giữa một hệ thống
tập tin và thiết bị khối lớp), là dựa trên giả định này. Flash chip trên Mặt khác
có kích cỡ khu vực kinh tế lớn; kích thước chuẩn là 64 K.
+ Flash lĩnh vực bình thường có thể xoá hoàn toàn trước khi viết thư này để
cho họ; cách viết và xóa các hoạt động có thể được độc lập tùy thuộc vào phần
mềm sử dụng đèn flash.
+Flash chip có một đời giới hạn được quy định tại các điều khoản của
số, của khu vực kinh tế một lần là bị xóa. Vì vậy, nếu một lĩnh vực cụ thể là
nhận bằng văn bản rất thường xuyên của tuổi thọ được rút ngắn. Để ngăn chặn
này, viết cho một đèn flash
cần phải được phân phối cho tất cả các lĩnh vực. Điều này được gọi mặc và san
lấp mặt bằng không được hỗ trợ bởi các thiết bị khối.
+Bình thường các hệ thống tập tin không thể được sử dụng trên một đèn
flash vì những đi thông qua bộ nhớ cache bộ đệm. Bình thường đĩa IO chậm; để
tăng tốc độ nó lên một bộ nhớ cache trong bộ nhớ được gọi là cửa hàng đệm
cache của IO dữ liệu vào đĩa. Trừ khi dữ liệu này được flushed trở lại đĩa, hệ
thống tập tin là trong một không phù hợp nói. Tuy nhiên, các hệ thống nhúng có
thể được cung off mà không tắt máy phù hợp và vẫn còn có dữ liệu phù hợp;
như vậy thường tập tin hệ thống và thiết bị chặn mô hình không đi tốt với
nhúng hệ thống.
Các phương pháp truyền thống để truy cập flash được sử dụng để được
thông qua FTL( Flash Translation Layer). Lớp này mô phỏng một thiết bị chặn

hành vi trên một đèn flash để có được hệ thống tập tin thường xuyên làm việc
trên các thiết bị đèn flash, thay vì việc thay đổi các trình điều khiển ở cấp thấp
hoặc giới thiệu một lớp dịch, thay đổi các ứng dụng sử dụng các thiết bị bộ nhớ
là họ đang có.Các hệ thống phụ MTD được chia hành hai phần: driver và các
ứng dụng.
Các thiết bị có thể cho phép các thiết bị bộ nhớ được truy cập trực tiếp sử dụng
các tiêu chuẩn mở / đọc / ghi / ioctl cuộc gọi. Nhưng trong trường hợp bạn
muốn gắn kết một hệ thống tập tin thường xuyên về bộ nhớ điện thoại sử dụng
phương pháp truyền thống, bạn vẫn có thể mount nó bằng cách sử dụng khối
điều khiển. Hai thiết bị mà hiện nay được hỗ trợ bởi MTD: chip flash và đĩa
flash.
1.2.2 Flash Chips
Flash các thiết bị đi theo hai hương vị: flash NAND và NOR. Mặc dù cả hai
người trong số họ đến cùng một khoảng thời gian (NOR được giới thiệu bởi
Intel và NAND bởi
Toshiba vào cuối những năm 1980), NOR nhanh chóng bắt kịp với thế giới
nhúng
vì nó dễ dàng sử dụng. Tuy nhiên khi các hệ thống nhúng đã tiến hóa để có lưu
trữ lớn (như các máy nghe nhạc và máy ảnh kỹ thuật số), flash NAND đã trở
thành phổ biến cho các ứng dụng lưu trữ dữ liệu. Lớp MTD cũng phát triển ban
đầu xung quanh đèn flash NOR, nhưng sự hỗ trợ cho NAND đã được bổ sung
sau. Chip NOR đi theo hai hương vị: cũ không CFI chip và CFI mới hơn tuân
thủ. CFI thường gặp là viết tắt của Flash diện và là một chuẩn công nghiệp đảm
bảo khả năng tương thích giữa các chip flash đến từ các nhà bán cùng. Flash
chip như bất kỳ thiết bị bộ nhớ khác là luôn ở trong một giai đoạn tiến hóa với
chip mới thay thế những cái cũ rất nhanh chóng; này sẽ bao gồm viết lại các
trình điều khiển đèn flash. Thường thì những thay đổi này sẽ được cấu
hình thay đổi như xóa timeouts, khối các kích cỡ. Các tiêu chuẩn CFI được giới
thiệu cho phép các nhà cung cấp đèn flash cho phép dữ liệu cấu hình được đọc
từ các thiết bị đèn flash. Vì vậy, hệ thống phần mềm có thể tra hỏi các thiết bị

đèn flash và cấu hình lại chính nó. MTD hỗ trợ CFI tập lệnh của Intel và AMD.
1.2.3 Flash Disk
Ổ Flash được giới thiệu cho các ứng dụng lưu trữ hàng loạt. Như tên gọi của họ
cho thấy, ổ đĩa flash có nghĩa là ổ đĩa cục bộ trên một hệ thống dựa trên công
nghệ flash. Đĩa Flash nữa đi theo hai hương vị: ATA-based và tuyến tính.
1.
2. Table 4.1 NOR versus NAND Flash
NOR NAND
Các dữ liệu có thể được truy cập
tại ngẫu nhiên như SRAM. Cái
hoạt động từ ngày flash có thể
được:
+ Đọc thói quen: Đọc nội dung
của flash.
+Xoá bỏ thói quen: Xoá bỏ
là quá trình thực hiện tất cả
các bit trên một đèn flash 1. Xoá
bỏ về các chip NOR xảy ra
Các chip NAND chia lưu
trữ thành các khối, được chia
thành trang một lần nữa. Mỗi
trang được chia vào dữ liệu
thường xuyên và out-of-
band dữ liệu. The out-of-dữ
liệu ban nhạc được sử dụng để
lưu trữ các siêu dữ liệu như
ECC (Error-Correction Code)
và dữ liệu xấu chặn thông tin.
Truy cập
dữ liệu

trong
điều khoản của các khối
+Viết thường lệ: Viết là quá
trình chuyển đổi một từ 1 đến 0
trên flash. Khi một chút là
làm 0, nó không thể được
bằng văn bản vào cho đến khi
khối là xoá hoàn toàn, trong đó
tập hợp tất cả các bit trong một
khối để 1.
Các NAND đèn flash như đèn
flash NOR có ba hoạt động cơ
bản: đọc, xóa,
và viết. Tuy nhiên, không
giống như NOR mà có thể truy
cập dữ liệu ngẫu nhiên, NAND
những lần đọc và viết
được thực hiện trong điều
khoản của các trang trong
khi xóa bỏ xảy ra trong điều
khoản của các khối
Bảng Giao
Diện
Đây là các kết nối như
thiết bị SRAM bình thường
địa chỉ và xử lý dữ liệu xe buýt.
Có nhiều cách của kết nối với
đèn flash NAND CPU khác
nhau trên khắp các nhà cung
cấp. NAND truy cập được

thực hiện bởi kết nối dữ liệu
và lệnh đường đến thường
dòng IO 8 ngày chip flash.
Execution o
code
Mã số có thể được thực thi trực
tiếp từ NOR vì nó được kết nối
trực tiếp đến địa chỉ / dữ liệu bus
Nếu mã là trong flash NAND
nó cần đến được sao chép vào
bộ nhớ cho thực hiện.
Performanc Flash NOR được đặc trưng bằng
cách xóa chậm, chậm viết, và
nhanh chóng đọc.
Flash NAND được đặc trưng
bởi nhanh xóa, nhanh chóng
viết, và đọc nhanh.
Bad blocks Chip flash NOR không dự kiến
sẽ có xấu khối bởi vì họ có được
thiết kế để giữ hệ thống dữ liệu.
Những nhấp nháy được thiết
kế một về cơ bản là một thiết
bị lưu trữ giá thấp hơn, do đó,
mong rằng họ có khối xấu.
Thông thường các chip flash
đến với xấu đánh dấu trong
lĩnh vực này. Cũng NAND
flash bị nhiều lĩnh vực các vấn
đề của bit flipping nơi một
chút lộn khi nhận được bằng

văn bản đến; này được phát
hiện bởi lỗi thuật toán điều
chỉnh được gọi là ECC EDC,
được thực hiện hoặc
trong phần cứng hay phần
mềm.
Usage Đây là những cơ bản được sử
dụng cho Mã thực hiện. Khởi
động bộ tải có thể tồn tại
trên NOR nhấp nháy vì mã từ
các nhấp nháy có thể được trực
tiếp thực thi. Những nhấp nháy
là khá
tốn kém và họ cung cấp bộ nhớ
thấp hơn mật độ và có một tương
đối ngắn hơn cuộc sống span
(khoảng 100.000 xóa
chu kỳ).
Đây là những chủ yếu được sử
dụng như lưu trữ thiết bị cho
các hệ thống nhúng chẳng hạn
như hộp set-top và MP3 . Nếu
bạn định sử dụng một hội
đồng chỉ với NAND, bạn có
thể phải
đặt trong một ROM khởi động
bổ sung. Họ cung cấp mật độ
cao thấp giá cả và có một
khoảng dài hơn cuộc sống
(khoảng 10 đến sức mạnh của

6 xóa chu kỳ).
3. ATA dựa trên đĩa flash sử dụng giao diện đĩa tiêu chuẩn cho giao diện trên
bo mạch chủ, để họ xuất hiện như là IDE đĩa trên hệ thống. Một bộ điều
khiển ngồi trên các silic giống như đèn flash, nhưng không thực hiện FTL để
bản đồ flash đến lĩnh vực. Ngoài ra, nó thực hiện các giao thức để đĩa
flash xuất hiện như một đĩa bình thường vào hệ thống. Đây là phương pháp
lấy bằng CompactFlash thiết kế. Ưu điểm chính của việc sử dụng cách tiếp
cận này được phần mềm tương thích nhưng bất lợi là nó đã được đắt hơn bởi
vì các giải pháp toàn diện đã được thực hiện trong phần cứng. Linux xử lý
các thiết bị này như thường xuyên thiết bị IDE và trình điều khiển cho các
thiết bị này có thể được tìm thấy trong drivers / ide thư mục.
Các đĩa flash tuyến tính là cơ chế đó là làm việc của các M2000 hệ thống.
Đây là những NAND dựa trên các thiết bị có khả năng khởi động (nó có
một ROM khởi động được chấp nhận như là một phần mở rộng BIOS), một
bộ điều khiển mỏng mà sử dụng các thuật toán sửa lỗi, và phần mềm nào các
trueFFFS FTL thi đua. Vì thế những thiết bị này có thể được sử dụng để trực
tiếp khởi động hệ thống và có thể được sử dụng để chạy các hệ thống tập tin
thường xuyên trên một thiết bị blocklike. Những cái này ít tốn kém khi so
sánh với các nhấp nháy nhỏ gọn nhưng tại cùng một thời gian cho tất cả các
tính năng cần thiết như là một thiết bị chặn. Bởi vì người truy cập
những thiết bị đèn flash tương tự như một thiết bị truy cập vào bộ nhớ,
Linux thực hiện các trình điều khiển cho các mô hình theo MTD.
1,3 MTD Kiến trúc
Một thiết bị flash-based:
+Linux hỗ trợ các trình điều khiển đèn flash của tôi, nếu không làm cách nào để
cổng driver?
+ Nếu trình điều khiển Linux hỗ trợ đèn flash của tôi, làm cách nào để làm
cho nó phát hiện các flash trên
- Các MTD kiến trúc này được chia thành các thành phần sau:
-MTD Điểm: này cung cấp giao diện giữa các trình điều khiển đèn flash thấp

cấp và các ứng dụng. Nó thực hiện chế độ ký tự và thiết bị cấm. Thấp cấp trình
điều khiển đèn flash: phần này nói về NOR và NAND dựa trên Chip flash chỉ.
BSP cho flash: Một đèn flash có thể được duy nhất một kết nối trên máy
bay. Ví dụ, một đèn flash NOR có thể được kết nối trực tiếp trên xe buýt vi xử
lý hoặc có thể được kết nối với một PCI bus bên ngoài. Việc truy cập vào flash
cũng có thể được duy nhất tùy thuộc vào loại vi xử lý. Lớp BSP làm cho đèn
flash trình điều khiển làm việc với bất kỳ hội đồng / bộ xử lý. Người sử dụng có
để cung cấp các chi tiết cách flash là ánh xạ ở trên diễn đàn, chúng tôi chỉ đến
đoạn này của mã như đèn flash lập bản đồ, trình điều khiển.
- MTD ứng dụng: Đây có thể là hạt nhân submodules như JFFS2 hoặc
- NFTL, hoặc sử dụng các ứng dụng không gian như quản lý nâng cấp.
- Con số 4,2 cho thấy cách các thành phần tương tác với nhau và
phần còn lại của hạt nhân.
1.3.1 mtd_info Cấu trúc dữ liệu
mtd_infois trái tim của phần mềm MTD. Nó được định nghĩa trong tập tin này
bao gồm :
Linux / mtd / trình điều khiển phần mềm mtd.h.The ngày phát hiện một đèn
flash cụ thể lấp đầy lên cấu trúc này với các con trỏ đến tất cả các công việc cần
thiết (như xóa, đọc, viết, vv) được sử dụng bởi lõi MTD và các ứng dụng
MTD. Danh sách các cơ cấu mtd_info cho tất cả các thiết bị nhất là giữ trong
một bảng gọi là mtd_table [].
1.3.2 Giao diện giữa MTD Core và Low-Level Flash Drivers
Như đã đề cập ở trên, các trình điều khiển cấp thấp flash xuất khẩu các chức
năng sau đây
Điểm đến MTD:
+ Chung cho cả hai chip flash NAND và NOR Chức năng
- Đọc () / ghi ()
- Xóa ()
- Khóa cửa () / mở khóa ()
- Đồng bộ ()

- Đình chỉ () / phục hồi ()
+Chức năng cho chip NAND chỉ
- Read_ecc () / write_ecc ()
- Read_oob () / write_oob ()
Nếu bạn có một CFI-bật đèn flash NOR hoặc IO một thiết bị tiêu chuẩn ánh
xạ 8 -- bit chip NAND. Nếu không, bạn cần phải thực hiện điều khiển MTD.
Một số thói quen có thể yêu cầu phần cứng hỗ trợ, vì thế bạn cần kiểm tra bảng
đèn flash dữ liệu của bạn để thực hiện các chức năng.
Mục dưới đây cho các mô tả về công việc khác hơn là đọc (), viết (), và xóa ()
thói quen.
+ khóa () và mở khóa (): Đây là được sử dụng để thực hiện flash khóa; một
phần flash được có thể viết hay xóa bảo vệ để ngăn chặn tình cờ ghi đè của
hình ảnh. Ví dụ, bạn có thể khóa tất cả các phân vùng trên mà bạn có chỉ đọc hệ
thống tập tin cho hầu hết các hệ thống thực thi trừ khi nâng cấp xong. Đây là
những xuất khẩu sang các applications người sử dụng ioctls MEMLOCK và
MEMUNLOCK.
+ đồng bộ (): Điều này được gọi là khi một thiết bị được đóng cửa hoặc phát
hành và nó bảo đảm rằng đèn flash là trong trạng thái an toàn.
+đình chỉ () andresume (): Đây là những chỉ hữu dụng khi bạn
bật CONFIG_PM lựa chọn xây dựng hạt nhân.
+ read_ecc () và write_ecc (): Những thói quen áp dụng cho flash NAND
chỉ. ECC là sửa chữa sai sót mã được sử dụng để phát hiện bất kỳ bit xấu trong
một trang. Những thói quen hành xử như là đọc bình thường () / ghi (), ngoại
trừ rằng một bộ đệm riêng biệt có chứa ECC cũng đọc hay viết cùng với các dữ
liệu.
+read_oob () và write_oob (): Những thói quen áp dụng cho flash NAND
chỉ. Mỗi flash NAND được chia thành hai 256 - hoặc 512-trang byte; mỗi của
các trang này có chứa một bổ sung 8 - hoặc 16-byte phụ tùng khu vực được gọi
là out -dữ liệu của ban nhạc, các cửa hàng của ECC, xấu chặn thông tin, và tập
tin bất kỳ hệ thống dữ liệu phụ thuộc. Các chức năng này được sử dụng để truy

cập out-of - ban nhạc dữ liệu.
1,4 mẫu MTD driver cho NOR Flash
Bây giờ chúng ta đi vào chi tiết của một trình điều khiển đèn flash NOR cho
Linux. Các tập tin mtd.c có chứa mã cho một đèn flash NOR, đơn giản, dựa trên
các giả định sau đây.
+Các thiết bị đèn flash có một khu vực duy nhất để xóa tất cả các ngành có
cùng một cỡ. (An xóa vùng được định nghĩa là một khu vực của một con chip
có chứa thành phần của cùng kích thước.)
+ Chip flash được truy cập bằng cách sử dụng một 4-byte xe buýt chiều
rộng.
+ Không có khóa, mở khóa, đình chỉ, và phục hồi chức năng.
Để đơn giản vì lợi ích của chúng tôi giả định rằng các thông tin sau đây có
sẵn
đối với chúng tôi như macro hoặc chức năng.
- DUMMY_FLASH_ERASE_SIZE: The flash xóa cỡ khu vực
- DUMMY_FLASH_SIZE: The flash kích thước
- PROBE_FLASH (): Chức năng thăm dò rằng nếu đèn flash NOR có mặt
tại địa chỉ cụ thể
-WRITE_FLASH_ONE_WORD: Chức năng / macro để viết một từ ở
một xác định địa chỉ
-ERASE_FLASH_SECTOR: Chức năng để xóa một lĩnh vực nhất định
-DUMMY_FLASH_ERASE_TIME: Mỗi thời gian trong lĩnh vực xóa
jiffies
Trước tiên chúng ta hãy đặt tất cả các tiêu đề các tập tin, chúng tôi muốn cho
các driver của đèn flash của chúng tôi.
4. /* mtd.c */
5. #include <linux/kernel.h>
6. #include <linux/module.h>
7. #include <linux/types.h>
8. #include <linux/sched.h>

9. #include <linux/errno.h>
10.#include <linux/interrupt.h>
11.#include <linux/mtd/map.h>
12.#include <linux/mtd/mtd.h>
13.#include <linux/mtd/cfi.h>
14.#include <linux/delay.h>
15.
16.Now we put all the APIs/macros that we expect the user to define.
17.
18.#define DUMMY_FLASH_ERASE_SIZE
19.#define PROBE_FLASH(map)
20.#define WRITE_FLASH_ONE_WORD(map, start, addr, data)
21.#define ERASE_FLASH_SECTOR(map, start, addr)
22.#define DUMMY_FLASH_ERASE_TIME
23.#define DUMMY_FLASH_SIZE
24. Một lời giải thích ngắn gọn về các đối số được truyền cho các API ở trên là
như sau.
- Bản đồ: Đây là một con trỏ đến một cấu trúc map_info tuyên bố trong
tiêu đề
file include / linux / mtd / map.h. Cấu trúc này được giải thích thêm
chi tiết tại mục 4.5.
-bắt đầu: Đây là địa chỉ bắt đầu của chip flash NOR. Đây là địa chỉ
thường được sử dụng cho các lập trình flash với lệnh xóa hoặc
ghi dữ liệu.
- addr: Đây là địa chỉ bù đắp từ chipâ € ™ s bắt đầu, nơi dữ liệu
cần phải được viết hoặc khu vực cần phải được xoá hoàn toàn.
- dữ liệu: đối số này cho viết API là một 32-bit, từ đó xác định những

cần phải được bằng văn bản tại địa chỉ được chỉ định.
Tiếp theo, chúng tôi xác định một cấu trúc chứa thông tin cá nhân để đèn

flash này.
25.struct dummy_private_info_struct
26.{
27.int number_of_chips; /* Number of flash chips */
28.int chipshift; /* Size of each flash */
29.struct flchip *chips;
30.} ;
31. Một lời giải thích ngắn gọn về từng lĩnh vực cấu trúc như sau.
number_of_chips: Như tên cho thấy, điều này chỉ rõ có bao nhiêu
chip liên tiếp có thể được tìm thấy tại địa chỉ obe pr. API
PROBE_FLASH () là bắt buộc để trở về con số này vào mã điều
khiển.
chipshift: Đó là tổng số bit địa chỉ cho thiết bị, mà
được sử dụng để tính toán offsets địa chỉ và tổng số byte trong đó
các thiết bị có khả năng.
chip: Các struct flchip có thể được tìm thấy trong include / linux /
mtd /
flashchip.h. Thêm hình của nó được giải thích trong các dummy_probe
() function.
Tiếp theo là danh sách các chức năng tĩnh cần được khai báo.
32.static struct mtd_info * dummy_probe(struct map_info *);
33. static void dummy_destroy(struct mtd_info *);
34.static int dummy_flash_read(struct mtd_info *, loff_t , size_t ,
35.size_t *, u_char *);
36.static int dummy_flash_erase(struct mtd_info *,
37.struct erase_info *);
38.static int dummy_flash_write(struct mtd_info *, loff_t ,
39.size_t , size_t *, const u_char *);
40.static void dummy_flash_sync(struct mtd_info *);
41. Các mtd_chip_driver cấu trúc được sử dụng bởi những thói quen khởi

dummy_flash_init () và các chức năng thoát dummy_flash_exit (). Cái
hầu hết các lĩnh vực quan trọng là probethat. được gọi là để phát hiện nếu
một flash của một đặc biệt là loại có mặt tại một địa chỉ được chỉ định ở trên
diễn đàn. Lớp MTD duy trì một danh sách các cấu trúc. Những thói quen
thăm dò được truy cập khi
do_map_probe thường trình () được gọi bằng đèn flash, lập bản đồ điều
khiển.
42.static struct mtd_chip_driver dummy_chipdrv =
43.{
44..probe = dummy_probe,
45..destroy = dummy_destroy,
46..name = "dummy_probe",
47..module = THIS_MODULE
48.};
49. Bây giờ chúng tôi xác định những thói quen thăm dò. Chức năng này xác
nhận nếu một đèn flash có thể được tìm thấy tại bản đồ địa chỉ-> virt, được
làm đầy bởi các trình điều khiển lập bản đồ. Nếu nó là có thể phát hiện một
đèn flash, sau đó nó phân bổ cơ cấu mtd và dummy_private_info cấu trúc.
Cơ cấu mtd là đầy khác nhau driver thói quen như đọc, viết, xóa, vv. Cái cơ
cấu dummy_private_info là đầy đèn flash thông tin cụ thể. Tại chức năng
thăm dò là những hàng đợi chờ và mutex này. Đây là được sử dụng để ngăn
chặn đồng thời truy cập vào flash, mà là một yêu cầu cho hầu hết các thiết bị
đèn flash. Do đó bất cứ khi nào một hoạt động như đọc hoặc viết cần phải
được thực hiện, Điều này được thực hiện bằng cách sử dụng lĩnh vực nhà
nước, được thiết lập để FL_READY lúc khởi tạo. Nếu đèn flash là đang
được sử dụng, sau đó tiến trình cần chặn trên hàng đợi chờ cho đến khi nó
được đánh thức. Các mutex (spinlock) được dùng để ngăn ngừa những vấn
đề chủng tộc trên SMP sự mua trước máy hoặc trong trường hợp được kích
hoạt.
Tiếp theo, chúng tôi đi đến thói quen đọc. Những thói quen đọc đăng ký

với MTD lõi là dummy_flash_read (), được gọi là để đọc lennumber của
byte từ đèn flash bù đắp từ. Bởi vì các chip span có thể viết nhiều,
các dummy_flash_read_one_chip chức năng () được gọi là nội bộ để đọc dữ
liệu từ một con chip duy nhất. Bây giờ chúng ta đi đến thói quen viết.
Thường đăng ký với MTD lõi là dummy_flash_write (). Bởi vì viết có thể
bắt đầu từ removed địa chỉ, chức năng bảo đảm rằng nó bộ đệm dữ liệu
trong trường hợp như vậy và trong lần lượt gọi
dummy_flash_write_oneword chức năng () để viết 32-bit dữ liệu đến 32-bit
địa chỉ liên kết.
50. Các chức năng xoá đăng ký để lõi MTD là dummy_flash_erase ().
Chức năng này cần đảm bảo rằng xoá địa chỉ được chỉ định là khu vực kinh
tế
liên kết và số byte được xoá hoàn toàn là một của nhiều kích cỡ khu
vực. Các dummy_flash_erase_one_block chức năng () được gọi là nội bộ;
này erases một trong những khu vực kinh tế tại một địa chỉ nhất định. Do
các khu vực xóa là tốn thời gian,
51.Listing 4.1 Dummy Probe Function
52.
53.static struct mtd_info *dummy_probe(struct map_info *map)
54.{
55. struct mtd_info * mtd = kmalloc(sizeof(*mtd), GFP_KERNEL);
56.unsigned int i;
57.unsigned long size;
58.struct dummy_private_info_struct * dummy_private_info =
59.kmalloc(sizeof(struct dummy_private_info_struct), GFP_KERNEL);
60.
61.if(!dummy_private_info)
62.{
63.return NULL;
64.}

65.memset(dummy_private_info, 0, sizeof(*dummy_private_info));
66.
67./* The probe function returns the number of chips identified */
68.dummy_private_info->number_of_chips = PROBE_FLASH(map);
69.if(!dummy_private_info->number_of_chips)
70.{
71.kfree(mtd);
72.return NULL;
73.}
74.
75./* Initialize mtd structure */
76.memset(mtd, 0, sizeof(*mtd));
77.mtd->erasesize = DUMMY_FLASH_ERASE_SIZE;
78.mtd->size = dummy_private_info->number_of_chips *
DUMMY_FLASH_SIZE;
79.for(size = mtd->size; size > 1; size >>= 1)
80.dummy_private_info->chipshift++;
81.mtd->priv = map;
82.mtd->type = MTD_NORFLASH;
83.mtd->flags = MTD_CAP_NORFLASH;
84.mtd->name = "DUMMY";
85.mtd->erase = dummy_flash_erase;
86.mtd->read = dummy_flash_read;
87.mtd->write = dummy_flash_write;
88.mtd->sync = dummy_flash_sync;
89.
90.dummy_private_info->chips = kmalloc(sizeof(struct flchip) *
91.dummy_private_info->number_of_chips, GFP_KERNEL);
92.memset(dummy_private_info->chips, 0,
93.sizeof(*(dummy_private_info->chips)));

94.for(i=0; i < dummy_private_info->number_of_chips; i++)
95.{
96.dummy_private_info->chips[i].start = (DUMMY_FLASH_SIZE * i);
97.dummy_private_info->chips[i].state = FL_READY;
98.dummy_private_info->chips[i].mutex =
99.&dummy_private_info->chips[i]._spinlock;
100. init_waitqueue_head(&dummy_private_info->chips[i].wq);
101. spin_lock_init(&dummy_private_info->chips[i]._spinlock);
102. dummy_private_info->chips[i].erase_time =
DUMMY_FLASH_ERASE_TIME;
103. }
104.
105. map->fldrv = &dummy_chipdrv;
106. map->fldrv_priv = dummy_private_info;
107.
108. printk("Probed and found the dummy flash chip\n");
109. return mtd;
110. }
111. Listing 4.2 Dummy Read Routines
112.
113. static inline int dummy_flash_read_one_chip(struct map_info *map,
114. struct flchip *chip, loff_t addr, size_t len, u_char *buf)
115. {
116. DECLARE_WAITQUEUE(wait, current);
117.
118. again:
119. spin_lock(chip->mutex);
120.
121. if(chip->state != FL_READY)
122. {

123. set_current_state(TASK_UNINTERRUPTIBLE);
124. add_wait_queue(&chip->wq, &wait);
125. spin_unlock(chip->mutex);
126. schedule();
127. remove_wait_queue(&chip->wq, &wait);
128. if(signal_pending(current))
129. return -EINTR;
130. goto again;
131. }
132.
133. addr += chip->start;
134. chip->state = FL_READY;
135. map_copy_from(map, buf, addr, len);
136. wake_up(&chip->wq);
137. spin_unlock(chip->mutex);
138. return 0;
139. }
140.
141. static int dummy_flash_read(struct mtd_info *mtd, loff_t from,
142. size_t len,size_t *retlen, u_char *buf)
143. {
144. struct map_info *map = mtd->priv;
145. struct dummy_private_info_struct *priv = map->fldrv_priv;
146. int chipnum = 0;
147. int ret = 0;
148. unsigned int ofs;
149. *retlen = 0;
150.
151. /* Find the chip number and offset for the first chip */
152. chipnum = (from >> priv->chipshift);

153. ofs = from & ((1 << priv->chipshift) - 1);
154. while(len)
155. {
156. unsigned long to_read;
157. if(chipnum >= priv->number_of_chips)
158. break;
159.
160. /* Check whether the read spills over to the next chip */
161. if( (len + ofs - 1) >> priv->chipshift)
162. to_read = (1 << priv->chipshift) - ofs;
163. else
164. to_read = len;
165. if( (ret = dummy_flash_read_one_chip(map, &priv->chips[chipnum],
166. ofs, to_read, buf)))
167. break;
168. Listing 4.2 Dummy Read Routines (continued)
169.
170. *retlen += to_read;
171. len -= to_read;
172. buf += to_read;
173. ofs=0;
174. chipnum++;
175. }
176. return ret;
177. }
178. Chức năng này gọi preempts các nhiệm vụ làm cho nó ngủ cho
DUMMY_FLASH_
ERASE_TIME jiffies. Vào cuối những xóa, lõi MTD là tín hiệu rằng việc
xóa xong bằng cách thiết lập xóa nhà nước để MTD_ERASE_DONE và sau
đó bất cứ xóa callbacks được đăng ký có được gọi trước khi trở về. Danh

mục 4,4 để thực hiện xóa thói quen.
Chức năng đồng bộ được gọi khi các thiết bị đèn flash được đóng lại.
Chức năng này có để đảm bảo rằng không có các chip flash đang sử dụng tại
thời điểm đóng cửa;
nếu sau đó chức năng làm cho quá trình kêu gọi chờ đợi cho đến khi tất cả
các con chip đi vào tình trạng không sử dụng, mục 4,5 cho các chức năng
đồng bộ flash dummy thực hiện.
Chức năng dummy_destroyis gọi trong trường hợp điều khiển đèn flash
được tải
như là một mô-đun. Khi đun được bốc dỡ, các dummy_destroy chức năng
() hiện tất cả các dọn dẹp.
179. static void dummy_destroy(struct mtd_info *mtd)
180. {
181. struct dummy_private_info_struct *priv =
182. ((struct map_info *)mtd->priv)->fldrv_priv;
183. kfree(priv->chips);

×