Android各代码层获取系统时间的方法 获取链接 Facebook Twitter Pinterest 电子邮件 其他应用 八月 07, 2017 在Android系统里,各代码层如何去获取系统时间呢?可分别调用如下函数来获取: 在java层,可以使用方法:long now = SystemClock.uptimeMillis(); 在native层,可以使用方法:nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC); 在驱动层,可以使用方法:s64 time = ktime_to_us(ktime_get()); 获取链接 Facebook Twitter Pinterest 电子邮件 其他应用 评论
I/O映射之I/O端口 七月 29, 2018 对于外设,操作系统会采用端口映射和内存映射两种方式来对其进行控制,其中端口映射就是操作系统规定好一段地址给指定换上设,其与外设的寄存器按顺序一一对应上。 在Linux内核源码include/asm-generic/io.h头文件里有如下我们对I/O port进行操作的函数: static inline u8 inb(unsigned long addr) { return readb(addr + PCI_IOBASE); } static inline u16 inw(unsigned long addr) { return readw(addr + PCI_IOBASE); } static inline u32 inl(unsigned long addr) { return readl(addr + PCI_IOBASE); } static inline void outb(u8 b, unsigned long addr) { writeb(b, addr + PCI_IOBASE); } static inline void outw(u16 b, unsigned long addr) { writew(b, addr + PCI_IOBASE); } static inline void outl(u32 b, unsigned long addr) { writel(b, addr + PCI_IOBASE); } #define inb_p(addr) inb(addr) #define inw_p(addr) inw(addr) #define inl_p(addr) inl(addr) #define outb_p(x, addr) outb((x), (addr)) #define outw_p(x, addr) outw((x), (addr)) #define outl_p(x, addr) outl((x), (addr)) 分别对应对端口进行读取或写入字节、字、双字大小数据的操作。 该头文件中还有其他的操作函数及宏定义,请自行深入了解。 我们可通过读取/proc/ioports文件来了解Linux里I/O端口的映射 阅读全文
通过Netlink检测网线插拔 一月 10, 2017 最近有个需求需要检测RJ45网卡的网线有没有接上,而最近正在了解Netlink相关资料,刚好也看下通过Netlink可以进行检测,故在此做下粗略笔记: 1.首先要创建一个Netlink Socket,在用户层使用如下参数来调用socket()函数: fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE); 上面这个函数第一个参数必须是AF_NETLINK或PF_NETLINK,这两个标志在Linux下是一样的,第二个参数可以是SOCK_RAW或SOCK_DGRAM(对应用到TCP或UDP协议),而最后一个参数NETLINK_ROUTE为“路由守护进程”,用于接收来自内核的路由通知事件。 2.将上面创建的Socket绑定 addr.nl_family = AF_NETLINK; addr.nl_groups = RTNLGRP_LINK; //指定接收路由多播组消息 bind(fd, (struct sockaddr*)&addr, sizeof(addr)); 上面将创建的socket与相应的协议族和组进行绑定,接下来通过读fd这个socket来获得相应的消息数据struct nlmsghdr,再对该结构体数据进行判断来获得网线是接上或是拔掉,相应的源码如下: #include <sys/types.h> #include <sys/socket.h> #include <asm/types.h> #include <linux/netlink.h> #include <linux/rtnetlink.h> #include <stdlib.h> #include <stdio.h> #include <sys/ioctl.h> #include <linux/if.h> #include <string.h> #define BUFLEN 20480 int main(int argc, char *argv[]) { int fd, retval; char buf[BUFLEN] = {0}; 阅读全文
使用seq_file 七月 13, 2018 在《使用procfs》一文的源码示例中有说到proc文件系统每次读取的数据只能是1个页,如果超过则需多次读取,这样的话会增加读取次数,增多系统调用次数,影响了整体的效率,故而才有seq file序列文件的出现,该项功能使得内核对于大文件的读取更加容易。 对于seq file,其结构体定义在include/linux/seq_file.h文件中,内容如下: struct seq_file { char *buf; size_t size; size_t from; size_t count; size_t pad_until; loff_t index; loff_t read_pos; u64 version; struct mutex lock; const struct seq_operations *op; int poll_event; #ifdef CONFIG_USER_NS struct user_namespace *user_ns; #endif void *private; }; 这里不详细说明该结构体,仅供感受下。 对于seq_file,相应的文件操作需要实现seq_operations结构体的成员,该结构体在同一头文件中有如下定义: struct seq_operations { void * (*start) (struct seq_file *m, loff_t *pos); void (*stop) (struct seq_file *m, void *v); void * (*next) (struct seq_file *m, void *v, loff_t *pos); int (*show) (struct seq_file *m, void *v); }; 实现该结构体成员后,需要使用seq_open打开,让文件与该seq_operations关联起来,最终这个open函数要作为file_oper 阅读全文
评论
发表评论