2012-03-12 17 views
17

Bộ nhớ nhân và bộ nhớ của người dùng được phân biệt chính xác như thế nào trong hạt nhân Linux (về mặt bảo mật cho không gian hạt nhân)?Cách truy cập không gian hạt nhân từ không gian người dùng?

Tôi có thể viết những cách khác nhau nào vào không gian địa chỉ hạt nhân từ không gian người dùng?

Một cách tôi biết là thông qua cuộc gọi hệ thống. Có nhiều cuộc gọi hệ thống mà chúng tôi có thể sử dụng, nhưng cuối cùng chúng là tất cả các cuộc gọi hệ thống. Ngay cả trong các cuộc gọi hệ thống, chúng tôi gửi dữ liệu đến không gian hạt nhân, nơi nó (trình điều khiển hoặc mô-đun tương ứng) gọi các hàm như copy_from_user() để sao chép dữ liệu từ không gian người dùng sang không gian hạt nhân. Ở đây chúng tôi chính xác không viết vào không gian địa chỉ. chúng ta chỉ cần truyền một con trỏ người dùng có chứa dữ liệu cần được sao chép vào bộ đệm hạt nhân.

Câu hỏi của tôi là có cách nào để chúng tôi có thể truy cập địa chỉ thực có trong không gian hạt nhân và thực hiện các thao tác trên đó không?

Thứ hai, Ngoài các cuộc gọi hệ thống, có bất kỳ cách nào khác mà tôi có thể viết vào không gian hạt nhân từ ứng dụng người dùng không?

Tôi đã gọi điều này link từ stackoverflow. Nhưng tôi nghĩ câu hỏi của tôi không được trả lời ở đó và có quan điểm khác. Do đó tôi nghĩ đến việc hỏi một câu hỏi khác.

Hãy chia sẻ kiến ​​thức của bạn ... Cảm ơn bạn.

+0

Trước tiên hãy tìm hiểu cách phân trang x86 hoạt động: https://stackoverflow.com/questions/18431261/how-does-x86-paging-work, điều này sẽ hữu ích. –

+1

Ngoài ra, hãy xem [Cách truy cập mmaped/dev/mem mà không làm đứt hạt nhân Linux?] (Https://stackoverflow.com/q/11891979/608639), [mmap/dev/mem không thành công với đối số không hợp lệ, nhưng địa chỉ là liên kết trang] (https://stackoverflow.com/q/39134990/608639) và [Cách truy cập không gian hạt nhân từ không gian người dùng?] (https://stackoverflow.com/q/9662193/608639) – jww

+0

Bạn có thể muốn đọc về [vDSO] (https://en.wikipedia.org/wiki/VDSO). –

Trả lời

18

Tôi có thể viết những cách khác nhau nào vào không gian địa chỉ hạt nhân từ không gian người dùng?

Tôi không chắc chắn nếu có là các phương pháp khác, nhưng bạn có thể truy cập vào bộ nhớ vật lý sử dụng /dev/mem & hệ thống gọi mmap().

/dev/mem là một tập tin thiết bị nhân vật đó là một hình ảnh của bộ nhớ chính của máy tính. Nó có thể được sử dụng, ví dụ, để kiểm tra (và thậm chí bản vá) hệ thống. Địa chỉ byte trong mem được hiểu là địa chỉ bộ nhớ vật lý.

thêm về /dev/mem: http://linux.about.com/library/cmd/blcmdl4_mem.htm

thêm về mmap(): http://linux.die.net/man/2/mmap

Bạn có thể sử dụng mmap() để ánh xạ một phần của /dev/mem và sử dụng trong chương trình người dùng của bạn. Một mã ví dụ ngắn gọn:

#define MAPPED_SIZE //place the size here 
#define DDR_RAM_PHYS //place the physical address here 

int _fdmem; 
int *map = NULL; 
const char memDevice[] = "/dev/mem"; 

/* open /dev/mem and error checking */ 
_fdmem = open(memDevice, O_RDWR | O_SYNC); 

if (_fdmem < 0){ 
printf("Failed to open the /dev/mem !\n"); 
return 0; 
} 
else{ 
printf("open /dev/mem successfully !\n"); 
} 

/* mmap() the opened /dev/mem */ 
map= (int *)(mmap(0,MAPPED_SIZE,PROT_READ|PROT_WRITE,MAP_SHARED,_fdmem,DDR_RAM_PHYS)); 

/* use 'map' pointer to access the mapped area! */ 
for (i=0,i<100;i++) 
printf("content: 0x%x\n",*(map+i)); 

/* unmap the area & error checking */ 
if (munmap(map,MAPPED_SIZE)==-1){ 
perror("Error un-mmapping the file"); 
} 

/* close the character device */ 
close(_fdmem); 

Tuy nhiên, hãy chắc chắn rằng khu vực bạn đang lập bản đồ không được sử dụng, ví dụ bằng hạt nhân, hoặc nó sẽ làm sụp đổ hệ thống của bạn/treo, và bạn sẽ bị buộc phải khởi động lại sử dụng nút nguồn phần cứng.

Hy vọng điều đó sẽ hữu ích.

+0

Cảm ơn. Có, tôi nghĩ rằng những gì bạn đề cập ở đây hoạt động hoàn hảo. Ngay cả trong lập trình c nhúng, cho bộ nhớ ánh xạ IO, chúng tôi làm theo các bước tương tự, nơi chúng tôi có thể truy cập đăng ký trực tiếp. Điều tương tự tôi nghĩ cũng sẽ làm việc cho không gian hạt nhân. –

+0

Tôi tin rằng bạn cần thực hiện các lệnh và chức năng đó với đầy đủ các đặc quyền (gốc hoặc tương tự). –

+0

Yup, tôi luôn chạy chương trình người dùng của mình bằng root. –

3

Bộ nhớ người dùng và hạt nhân chính xác được phân biệt như thế nào bên trong hạt nhân Linux (về bảo mật cho không gian hạt nhân)?

Không chắc chắn nếu tôi hiểu câu hỏi của bạn.

Để hạt nhân không có nhiều sự khác biệt về mặt kỹ thuật, nó chỉ là bộ nhớ. Tại sao? Vì hạt nhân đang chạy ở chế độ CPU đặc quyền nhất, có thể truy cập tất cả bộ nhớ.

Tôi có thể viết những cách khác nhau nào vào không gian địa chỉ hạt nhân từ không gian người dùng?

Trừ khi có lỗ hổng bảo mật trong trình điều khiển thiết bị chế độ lõi hoặc hạt nhân, bạn không thể thực hiện điều đó, ít nhất là không trực tiếp. Tuy nhiên, hạt nhân (hoặc một trong các trình điều khiển của nó) có thể sao chép dữ liệu từ bộ nhớ của ứng dụng chế độ người dùng sang bộ nhớ hạt nhân.

... có cách nào để chúng tôi có thể truy cập địa chỉ thực là trong không gian hạt nhân và thực hiện các thao tác trên đó không?

Điều tương tự, bạn sẽ không thể truy cập bộ nhớ bằng địa chỉ thực nếu có bản dịch địa chỉ ảo đến hiện tại. Ngay cả hạt nhân cũng không thể tránh được bản dịch này khi nó được kích hoạt. Nó phải tạo các ánh xạ địa chỉ ảo tới vật lý thích hợp trong các bảng trang để truy cập bộ nhớ tại các địa chỉ vật lý tùy ý.

Ngoài các cuộc gọi hệ thống, có bất kỳ cách nào khác để tôi có thể viết vào không gian hạt nhân từ ứng dụng người dùng?

Bạn cũng có thể buộc CPU chuyển sang mã hạt nhân bằng cách kích hoạt ngoại lệ (ví dụ: chia cho 0, lỗi trang, lỗi bảo vệ chung, v.v.). Nhân là người đầu tiên xử lý các ngoại lệ. Hạt nhân sẽ thay đổi bộ nhớ của nó khi cần thiết để đáp lại một ngoại lệ. Nó có thể tải dữ liệu từ đâu đó (ví dụ: đĩa) trên một lỗi trang.