ในคอมพิวเตอร์คุณเขียนไปยัง 'ที่อยู่หน่วยความจำ' ที่ระบุ ที่อยู่นี้ได้รับการยอมรับจากระบบว่าเป็นที่อยู่ของฮาร์ดแวร์และฮาร์ดแวร์ที่เหมาะสมได้รับหรือส่งค่าที่เหมาะสม
ระบบฮาร์ดแวร์ส่วนใหญ่มีรีจิสเตอร์ต่าง ๆ มากมายที่สามารถตั้งค่าหรืออ่านได้ บางคนอาจมีบางคนอาจมีบางคน การลงทะเบียนเหล่านี้จะถูกจัดกลุ่มเป็นช่วงต่อเนื่อง ตัวชี้พื้นฐานชี้ไปที่จุดแรกในช่วงและคุณเขียนถึงเช่นพอร์ตที่สองที่มี base_pointer + 1 คุณไม่จำเป็นต้องเขียนโดยตรงไปยังตัวชี้ แต่การใช้ออฟเซ็ตจะทำให้การทำงานง่ายขึ้น
Raspberry Pi ตระหนักถึงการลงทะเบียนฮาร์ดแวร์ที่หลากหลายตามที่อยู่ 0x20000000 ช่วงของการลงทะเบียนที่ระบบควบคุมนาฬิกาเข้าถึงได้จาก BCM2708_PERI_BASE + 0x101000 รีจิสเตอร์ที่ควบคุมนาฬิกา I2S คือการลงทะเบียน 38 และ 39 ในบล็อกนั้นซึ่งเขียนขึ้นโดยใช้ BCM2708_PERI_BASE + 0x101000 + 0x26 และ 0x27
คุณไม่สามารถเปลี่ยนค่านาฬิกาได้เพียงปิดการใช้งานนาฬิกาเปลี่ยนค่าและเริ่มใหม่
หากคำตอบนี้ธรรมดาเกินไปฉันขอโทษ ในกรณีนี้คำถามของคุณไม่ยอมใครง่ายๆโชคดีจริงๆ คุณอาจพบว่าลิงค์นี้มีประโยชน์
อัปเดต: เหตุใดจึงใช้ mmap และไม่เขียนลงในหน่วยความจำโดยตรง
เมื่อโปรแกรมทำงานที่อยู่หน่วยความจำที่โปรแกรมคิดว่าไม่ใช่ที่อยู่จริงโปรแกรมเหล่านั้นจะถูกแมปไปยังที่อยู่จริงโดยผู้จัดการหน่วยความจำ สิ่งนี้จะหยุดโปรแกรมหนึ่งไม่ให้ส่งผลกระทบต่อโปรแกรมอื่น สองกระบวนการสามารถอ่านและเขียนไปยังที่อยู่ของตนเอง 1234 อย่างมีความสุขอย่างสมบูรณ์และผู้จัดการหน่วยความจำจะแยกสองตำแหน่งอย่างสมบูรณ์
พอร์ตฮาร์ดแวร์อย่างไรก็ตามเป็นที่อยู่ทางกายภาพที่แน่นอน แต่คุณไม่สามารถเขียนถึงพวกเขาโดยตรงเพราะผู้จัดการหน่วยความจำจะนำที่อยู่ของคุณและแมปไปยังพื้นที่หน่วยความจำส่วนตัวของคุณ
บน Linux / dev / mem เป็น ' ไฟล์อุปกรณ์ตัวอักษรที่เป็นรูปภาพของหน่วยความจำหลักของคอมพิวเตอร์ '
ถ้าคุณเปิดไฟล์แบบนี้คุณจะสามารถอ่านและเขียนมันได้เหมือนไฟล์ ในตัวอย่าง mem_fd ที่ให้มาเป็นตัวจัดการไฟล์ที่เป็นผลมาจากการเปิด / dev / mem
อีกระบบที่สามารถทำให้ชีวิตง่ายขึ้นมากคือความสามารถในการแมปไฟล์ไปยังหน่วยความจำและเขียนลงในหน่วยความจำ ดังนั้นหากคุณมีไฟล์ที่คุณต้องการอ่านหรือเขียนบิตเฉพาะที่แตกต่างกันแล้วแทนที่จะย้ายตัวชี้ไฟล์ไปข้างหน้าหรือข้างหลังคุณสามารถแมปไฟล์นั้นไปยังตำแหน่งในหน่วยความจำแล้วเขียนลงโดยตรงราวกับว่ามันเป็นหน่วยความจำ
ดังนั้นในตัวอย่างนี้รหัสกำลังสร้างตัวจัดการหน่วยความจำกายภาพราวกับว่ามันเป็นไฟล์บนดิสก์แล้วขอให้ระบบรักษามันราวกับว่ามันเป็นหน่วยความจำ ค่อนข้างซับซ้อน แต่จำเป็นเพื่อให้รอบตัวจัดการหน่วยความจำเสมือนและเขียนไปยังที่อยู่ทางกายภาพจริง มูลค่า 0x20000000 ดูเหมือนว่าเป็นปลาเฮอริ่งแดง รหัสกำลังเสนอที่อยู่นี้ว่าเป็นคำใบ้ระบบไม่จำเป็นต้องแมป / dev / mem ที่นี่แม้ว่าอาจเป็นไปได้ โดยปกติแล้วค่า null จะถูกส่งผ่านและระบบจะแม็พหมายเลขอ้างอิงไฟล์กับที่อยู่ใด ๆ ที่คิดว่าดีที่สุด
ตอนนี้หน่วยความจำกายภาพถูกแมปกับกระบวนการหน่วยความจำเสมือนจริงและอ่านและเขียนตามที่คุณคาดหวัง
อ้างอิง:
http://www.kernel.org/doc/man-pages/online/pages/man2/mmap.2.html
http://www.raspberrypi.org/phpBB3/viewtopic.php?f=44&t=8496&p=104359
https://superuser.com/questions/71389/what-is-dev-mem