2016-07-15 6 views
2

의 특정 메모리 위치에 구조체를 복사 : 나는 메모리에, 예를 들어, 특정 위치에 복사하려면 어떻게나는 <code>struct</code>이있는 경우, 예를 들어, 녹

#[derive(Clone, Copy)] 
#[repr(C, packed)] 
pub struct SomeData { 
    a: u16, 
    b: u64, 
    c: u32, 
    d: u16, 
} 

효율적으로 메모리에 0x1000 지점에? 이 작품이 좋아질까요?

let dst_addr: u64 = 0x1000; 
let src = SomeData {a: 1, b: 2, c: 3, d: 4}; 
unsafe { 
    let tmp: &[u8; 10] = transmute(src); 
    copy(dst_addr as *mut _, tmp); 
} 

repr(C, packed) 부분이 실제로 여기에서만 필요하다는 점에 유의하시기 바랍니다.

소프트웨어는 운영 체제 나 기타 제한 사항없이 베어 x86_64, 링 0에서 실행됩니다. 또한 표준 라이브러리없이 을 프로그래밍하므로 core 라이브러리만으로이 작업을 수행 할 수 있습니다.

물론 안전하지 않지만 문제는 아닙니다.

수정 : 초기화되지 않은 메모리로 복사 중입니다.

+1

[* 줄리아 에반스 (Julia Evans)의 작은 단계 *로 녹에 OS 쓰기] (http://jvns.ca/blog/2014/03/12/the- rust-os-story /)와 [필립 오 퍼먼 (Phil Oppermann)의 Rust *에서 OS 작성하기] (http://os.phil-opp.com/)와 두 개 이상의 큰 프로젝트 [Intermezzos] (https : // intermezzos .github.io/book /) 및 [Redox] (https://github.com/redox-os/redox)를 참조하십시오. – Shepmaster

+0

@Shepmaster 그래, 둘 다 읽었 어. 나는 자습서가 항상 올바른 것을 얻는 것이 아니며, 내가 알지 못했던 위대한 "트릭"이 있다면, 이것을하기에 "적절한"방법이 무엇인지 궁금 할뿐입니다. –

+0

이 튜토리얼은 하위 리디렉션이나 사용자 포럼 또는 해커 뉴스에 게시 될 때 커뮤니티에서 철저히 읽어야한다고 생각합니다. 나는 그들이 꽤 잘 검토되기를 기대한다. – Shepmaster

답변

6

core::ptr 모듈을보고 싶을 것입니다.

write 기능은 당신이 원하는 것을 정확히 수행합니다

언급 한 바와 같이
pub unsafe fn write<T>(dst: *mut T, src: T) 
core::ptr::write(dst_addr as *mut_, src); 

, 그것은 (당신이 그렇게 할 read을 사용할 수 있습니다) dst_addr에서 값 전류를 드롭하지 않습니다.

내장 함수가 안정화되지 않으므로 intrinsics::copy_nonoverlapping을 사용하지 말 것을 권장합니다.

+0

작동했습니다 => 받아 들였습니다! 'SomeData' 메소드 내에서 이렇게했기 때문에'ptr :: write (dst_addr as * mut SomeData, * self); '를 사용해야했습니다. –