|
|
#include <sys/types.h> #include <sys/ddi.h>void bcopy(caddr_t from, caddr_t to, size_t bcount);
The source and destination address ranges must both be within the kernel address space and must be memory resident. No range checking is done. Since there is no mechanism by which DDI conformant drivers can obtain and use a kernel address that is not memory resident (an address that is paged out), DDI conforming drivers can assume that any address to which they have access is memory resident and therefore a valid argument to bcopy( ). Addresses within user address space are not valid arguments, and specifying such an address may cause the driver to corrupt the system in an unpredictable way. For copying between kernel and user space, drivers must use an appropriate function defined for that purpose (such as copyin(D3), copyout(D3), uiomove(D3), ureadc(D3), or uwritec(D3)).
DDI 8 drivers can use bcopy( ) to access memory above the 4GB boundary that was allocated with kmem_alloc_phys(D3) or msgphysreq(D3str).
bcopy function is used since both
the RAM disk and the buffer are part of the kernel address space.
1 #define RAMDNBLK 1000 /* number of blocks in the RAM disk */ 2 #define RAMDBSIZ NBPSCTR /* bytes per block */ 3 char ramdblks[RAMDNBLK][RAMDBSIZ]; /* blocks forming RAM disk */ ... 4 5 if (bp->b_flags & B_READ) { 6 /* 7 * read request - copy data from RAM disk to system buffer 8 */ 9 bcopy(ramdblks[bp->b_blkno], bp->b_un.b_addr, bp->b_bcount); 10 11 } else { 12 /* 13 * write request - copy data from system buffer to RAM disk 14 */ 15 bcopy(bp->b_un.b_addr, ramdblks[bp->b_blkno], bp->b_bcount); 16 }
``Data, copying'' in HDK Technical Reference
``Memory-mapped I/O'' in HDK Technical Reference