squid日志的分割
作者 佚名技术
来源 Linux系统
浏览
发布时间 2012-07-04
AY & Msk_RTCDAY; rtc_tm->tm_hour = (unsigned char)BCDHOUR & Msk_RTCHOUR; rtc_tm->tm_min = (unsigned char)BCDMIN & Msk_RTCMIN; 拥有帝国一切,皆有可能。欢迎访问phome.net rtc_tm->tm_sec = (unsigned char)BCDSEC & Msk_RTCSEC; if (rtc_tm->tm_sec == 0) { /* Re-read all BCD registers in case of BCDSEC is 0. See RTC section at the manual for more info. */ goto read_rtc_bcd_time; } } spin_unlock_irq(&rtc_lock); BCD_TO_BIN(rtc_tm->tm_year); BCD_TO_BIN(rtc_tm->tm_mon); BCD_TO_BIN(rtc_tm->tm_mday); BCD_TO_BIN(rtc_tm->tm_hour); BCD_TO_BIN(rtc_tm->tm_min); BCD_TO_BIN(rtc_tm->tm_sec); /* The epoch of tm_year is 1900 */ rtc_tm->tm_year = RTC_LEAP_YEAR - 1900; /* tm_mon starts at 0, but rtc month starts at 1 */ rtc_tm->tm_mon--; } I/O操作似乎就是对ALMYEAR、ALMMON、ALMDAY定义的寄存器进行操作,那这些宏究竟定义为什么呢? #define ALMDAY bRTC(0x60) #define ALMMON bRTC(0x64) #define ALMYEAR bRTC(0x68) 其中借助了宏bRTC,这个宏定义为: #define bRTC(Nb) __REG(0x57000000 (Nb)) 其中又借助了宏__REG,而__REG又定义为: # define __REG(x) io_p2v(x) 的io_p2v才是真正“玩”虚拟地址和物理地址转换的地方: #define io_p2v(x) ((x) | 0xa0000000) 与__REG对应的有个__PREG: # define __PREG(x) io_v2p(x) 与io_p2v对应的有个io_v2p: #define io_v2p(x) ((x) & ~0xa0000000) 可见有没有出现ioremap是次要的,关键问题是有无虚拟地址和物理地址的转换! 下面的程序在启动的时候保留一段内存,然后使用ioremap将它映射到内核虚拟空间,同时又用remap_page_range映射到用户虚拟空间,这样一来,内核和用户都能访问.如果在内核虚拟地址将这段内存初始化串"abcd",那么在用户虚拟地址能够读出来: /************mmap_ioremap.c**************/ #include <linux/module.h> #include <linux/kernel.h> 拥有帝国一切,皆有可能。欢迎访问phome.net #include <linux/errno.h> #include <linux/mm.h> #include <linux/wrapper.h> /* for mem_map_(un)reserve */ #include <asm/io.h> /* for virt_to_phys */ #include <linux/slab.h> /* for kmalloc and kfree */ MODULE_PARM(mem_start, "i"); MODULE_PARM(mem_size, "i"); static int mem_start = 101, mem_size = 10; static char *reserve_virt_addr; static int major; int mmapdrv_open(struct inode *inode, struct file *file); int mmapdrv_release(struct inode *inode, struct file *file); int mmapdrv_mmap(struct file *file, struct vm_area_struct *vma); static struct file_operations mmapdrv_fops = { owner: THIS_MODULE, mmap: mmapdrv_mmap, open: mmapdrv_open, release: mmapdrv_release, }; int init_module(void) { if ((major = register_chrdev(0, "mmapdrv", &mmapdrv_fops)) < 0) { printk("mmapdrv: unable to register character devicen"); return ( - EIO); } printk("mmap device major = %dn", major); printk("high memory physical address 0x%ldMn", virt_to_phys(high_memory) / 1024 / 1024); reserve_virt_addr = ioremap(mem_start *1024 * 1024, mem_size *1024 * 1024); printk("reserve_virt_addr = 0x%lxn", (unsigned long)reserve_virt_addr); if (reserve_virt_addr) { int i; for (i = 0; i < mem_size *102 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
关于squid日志的分割的所有评论