Tham số/Thành phần Giá trị
Tần số làm việc 100 MHz
I cache 16 KB
D cache 64 KB
Ethernet Controller Tri-mode EMAC
Serial interface RS232_UART lite
DRAM controller MCB_DDR3
Các bước thực hiện kết nối tại FPGA:
- Chương trình được thực hiện bắt đầu từ hàm main(). Việc cấu hình cho Xilkernel với luồng tĩnh được gọi là main_thread. Luồng này thiết lập LwIP bằng việc sử dụng các hàm lwip_init() và tạo ra một luồng mạng mới có tên là network_thread sử dụng hàm sys_thread_new(). Main () {…. sys_thread_new("main_thrd", (void(*)(void*))main_thread, 0, THREAD_STACKSIZE, DEFAULT_THREAD_PRIO); …..}
- Network_thread sẽ thiết lập cho một giao thức mạng gồm các thông số địa chỉ MAC và IP sử dụng hàm xemac_add(). Hàm này này sẽ lấy địa chỉ MAC và IP cho giao tiếp và khởi chạy nó.
80
Unsigned char mac_ethernet_address [] = {0x00,0x0a,0x35,0x00,0x01,0x02}; netif = &server_netif;
/*Khởi tạo địa chỉ IP để sử dụng*/ IP4_ADDR(&ipaddr, 192, 168, 1, 10); IP4_ADDR(&netmask, 255, 255, 255, 0); IP4_ADDR(&gw, 192, 168, 1, 1);
xemac_add(netif, &ipaddr, &netmask, &gw, mac_ethernet_address, EMAC_BASEADDR)
- Tạo ra một luồng mới để xử lý các yêu cầu được gửi tới :
sys_thread_new("testethernet",test_ethernet_thread,0,THREAD_STACKSIZE, DEFAULT_THREAD_PRIO);
- Luồng mới này sẽ lắng nghe các yêu cầu và chấp nhận chúng sử dụng hai hàm được hỗ trợ bởi thư viện Lwip là lwip_listen() và lwip_accept().
- Quá trình truyền nhận dữ liệu được thực hiện bằng hàm read(sd, recv_buf, RECV_BUF_SIZE). Hàm này trả về số byte đã nhận được với ý nghĩa của các thông số như sau: recv_buf là địa chỉ v ng nhớ để lưu dữ liệu, RECV_BUF_SIZE là kích thước v ng chứa dữ liệu tạm thời.
/* đọc và lưu dữ liệu */
read_len = read(sd, recv_buf, RECV_BUF_SIZE)
- Khi toàn bộ dữ liệu được lưu trữ vào DDRAM, FPGA sẽ đóng kết nối, thực hiện các lệnh nội tại và chờ cho những bản tin cập nhật tiếp theo.
Các bước thực hiện kết nối tại máy tính:
- Tạo một đối tượng Clientsocket() với các thông số MAC và IP /* Initialize IP */
IPAddress[] ipAddress = Dns.GetHostAddresses("192.168.1.10"); IPEndPoint ipEnd = new IPEndPoint(ipAddress[0], 9999);
Socket clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
- Sau khi khởi tạo các thơng số máy tính sẽ xử lý dữ liệu từ một File thành dạng byte, đóng gói chúng thành dạng mảng của byte rồi chuyển chúng tới bộ đệm.
/* Convert data to a sequence of bytes */
byte[] fileNameByte = Encoding.ASCII.GetBytes(fileName);
/* read contents of the file into a byte array*/
byte[] fileData = File.ReadAllBytes(filePath + fileName);
byte[] clientData = new byte[4 + fileNameByte.Length + fileData.Length]; byte[] fileNameLen = BitConverter.GetBytes(fileNameByte.Length);
81 /* init buff */
fileNameLen.CopyTo(clientData, 0); fileNameByte.CopyTo(clientData, 4);
fileData.CopyTo(clientData, 4 + fileNameByte.Length);
- Máy tính sẽ gửi yêu cầu kết nối với FPGA khi FPGA chấp nhận yêu cầu thì kết nối được hình thành và bắt đầu gửi dữ liệu đi.
/* connect */
clientSock.Connect(ipEnd); /* send data */
clientSock.Send(clientData);
- Máy tính sẽ gửi file bitstream đến FPGA và đợi cho tới khi file được gửi thành cơng thì máy tính sẽ tự động đóng luồng và socket.
/* wait for reached file and close socket */ clientSock.wait(clientdata);
clientSock.Close();
- Giao diện chương trình quản lý cập nhật máy chủ SuM
Hình 4.7 Trình quản lý cập nhật máy chủ SuM
Mỗi khi có bitstream mới, trình quản lý cập nhật máy chủ SuM, Hình 4.7, sẽ gửi thơng báo đến cho các thiết bị người dùng cuối có trong cơ sở dữ liệu người dùng được lưu trữ ở trong máy chủ. Khi phía thiết bị người dùng cuối đồng ý cập nhật thì hai bên chính thức thực hiện kết nối qua giao thức cập nhật an tồn. Q trình bắt tay và thống nhất các thuật tốn mã hóa và xác thực thành công, SuM sẽ gửi bitstream từng phần cần cập nhật cho thiết bị người dùng.
82
4.1.4. Xây dựng hệ thống cấu hình lại đƣợc từng phần
Hình 4.8 Sơ đồ quá trình thực hiện cấu hình từng phần
Quy trình xây dựng và thiết kế hệ thống cấu hình từng phần dựa trên FPGA của Xilinx được thực hiện nhờ công cụ PlanAhead [109] mà hãng cung cấp kèm theo trong bộ công cụ ISE như được trình bày trong Hình 4.8:
Trong đó
- ngc: là các tập tin dữ liệu *.ngc ở dạng netlist chứa các mơ-đun chức năng sau q trình tổng hợp của các cơng cụ thiết kế như ISE, XPS của Xilinx.
- ucf: là các tập tin dữ liệu *.ucf chứa thông tin ràng buộc và gán chân cho các khối trong hệ thống.
- elf: là các tập tin ảnh *.elf chứa các chương trình phần mềm nhúng chạy trên vi xử lý nhúng. *elf được sinh ra sau quá trình biên dịch từ bộ công cụ SDK.
- Full bitstream: là tập tin *.bit, đây là tập tin cấu hình đầy đủ cho FPGA trong hệ thống cấu hình lại được từng phần.
- Partial bitstream: là tập tin *.bit, là tập tin từng phần, đại diện cho một mơ-đun từng phần có thể cấu hình lại được.
Các bước thực hiện cấu hình lại từng phần FPGA:
- Các tập tin *.ngc, *.ucf và *.elf được đưa vào PlanAhead để xác định vị trí các module (Floor) trên FPGA đâu là phần tài nguyên mà các mô-đun từng phần sẽ được cấu hình lên đó.
- Sau đó, PlanAhead sẽ thực hiện hai q trình Implement và Timing để tạo ra các tập tin “Bitstream đầy đủ” d ng cho việc cấu hình tồn bộ FPGA và các tập tin “Bitstream từng phần” d ng để cấu hình cho các khu vực cấu hình lại được từng phần.
83
Giao diện chương trình quản lý cập nhật từng phần
Hình 4.9 Trình quản lý cập nhật từng phần máy trạm CuM
Để thực hiện mơ hình thử nghiệm, tác giả xây dựng hai mơ đun cấu hình lại được từng phần là: mơ đun thực hiện phép nhân hai tốn hạng Mult và mô đun thực hiện phép cộng hai tốn hạng Adder.
Hai mơ đun Mult và Adder sau khi được cập nhật từ máy chủ cập nhật sẽ được lưu
vào bộ nhớ RAM trên thiết bị. Chúng sẽ sử dụng chung một phân vùng cấu hình lại được từng phần trên FPGA của người dùng. Trình quản lý cập nhật từng phần ở máy trạm sẽ quyết định chọn và cho phép mô đun chức năng nào cần nạp vào hệ thống và để thực hiện nhiệm vụ của mình. Nếu khơng cần sử dụng đến, các mơ đun này có thể được giải phóng bằng cách cấu hình lên phân vùng đó một mơ đun Blank.
Mơ đun Blank là một mô đun trắng không thực hiện bất cứ chức năng nào. Vì vậy nó hồn tồn khơng tiêu thụ điện năng, điều này sẽ có ích trong việc tiết kiệm năng lượng của hệ thống.
4.2 Kết quả và đánh giá
Để thể hiện tính linh hoạt và tính đa dạng trong thực hiện bảo mật bitstream như framework đã đề xuất, luận án này xây dựng các khối mã hóa và xác thực theo hai cách:
- Hồn tồn bằng phần mềm
84 Việc mã hóa và xác thực bitstream là bắt buộc trong framework và giao thức an toàn cập nhật của luận án này cũng như trong các hệ thống bảo mật hiện đại. Vì vậy, tốc độ thực hiện của các bộ mã hóa và xác thực có yếu tố quyết định trong tồn bộ q trình cập nhật hệ thống. T y thuộc vào tài nguyên của từng thiết bị và nhu cầu thực tế của người dùng, việc lựa chọn thực hiện bằng phần cứng, phần mềm hoặc kết hợp sẽ cho một kết quả thích hợp.
4.2.1. Giải pháp bằng phần mềm
Để thực hiện phần mềm, luận án này sử dụng các bộ giải mã AES-256, bộ xác thực SHA-512, bộ giải mã RSA và bộ giải nén RLE được cung cấp từ nguồn [110] và [111]. Khi thực hiện các thuật toán này trên MicroBlaze, luận án này đã có một vài sửa đổi và tối ưu để ph hợp hệ thống của mình. Bảng 4.3 tóm tắt kết quả thực hiện bằng phần mềm của các thuật toán được xem xét trong hai tham số: kích thước bộ nhớ và thơng lượng của từng thuật tốn.
Có thể thấy rằng tốc độ thực hiện bằng phần mềm trên hệ thống của luận án này là tương đương với việc thực hiện AES-128 và SHA-256 chạy trên MicroBlaze của FPGA Virtex-II Pro [112]. Mặc d việc thực hiện bằng phần mềm là chậm hơn so với việc thực hiện bằng phần cứng, nhưng nó khơng tiêu thụ thêm bất kỳ nguồn tài nguyên phần cứng nào của FPGA. Trong khi việc thực hiện bằng phần cứng chiếm xấp xỉ 31,5% tài nguyên Slice của FPGA Spartan-6 LX45, xem Bảng 4.4. Con số 31,5% cho chúng ta thấy rằng, việc thực hiện bằng phần cứng các thuật tốn mã hóa và xác thực đối với các hệ thống dựa trên FPGA chi phí thấp là rất lớn so với tổng số tài nguyên sẵn có của nó. Trong khi đó, chi phí về bộ nhớ dùng cho các thuật toán này khi thực hiện bằng phần mềm là khá nhỏ so với kích thước của bộ nhớ flash và DDRAM có sẵn trong các hệ thống nhúng hiện nay. Với thông lượng như trong Bảng 4.3, phải mất vài giây để cập nhật thành công một bitstream từng phần (thường có dung lượng vài chục đến vài trăm KB). Luận án này tin rằng điều này là có thể chấp nhận được vì việc cập nhật xảy ra là không thường xuyên.