- 博客(51)
- 资源 (3)
- 收藏
- 关注
原创 通过KBUILD_MODNAME让dev_err等函数打印模块的name
在drivers/base/core.c 中有dev_err 等的实现2808 #define define_dev_printk_level(func, kern_level) \2809 void func(const struct device *dev, const char *fmt, ...) \2810 {
2017-07-31 15:26:01 5866
原创 通过cat /prco/driver/rtc 看到rtc的信息
在drivers/rtc/rtc-efi.c 中会定义rtc_class_ops 由于注册rtc设备static const struct rtc_class_ops efi_rtc_ops = { .read_time = efi_read_time, .set_time = efi_set_time, .read_alarm = efi_re
2017-07-31 10:31:10 1077
原创 idr 映射总结
idr的源码包含lib/idr.c 和include/linux/idr.hidr 是一种关联数组,采用基数让没一个键关联一个特定的值可以通过下面的方式初始化一个idr,采取先定义然后调用idr_init 来初始化.动态创建static struct idr hfi1_unit_table; idr_init(&hfi1_unit_table);静态创建stati
2017-07-29 14:45:31 4612
原创 socket系统调用
当user space调用socket 编程是,最终会调用到linux kernel系统调用如下:SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol){ int retval; struct socket *sock; int flags; //主要是建立一个struct
2017-07-29 11:46:23 1100
原创 acpi_apd.c 的作用是create I2C device.
acpi_apd.c 用于创建I2C devicestatic const struct acpi_device_id acpi_apd_device_ids[] = { /* Generic apd devices */#ifdef CONFIG_ARM64 { "APMC0D0F", APD_ADDR(xgene_i2c_desc) }, { "BRCM9
2017-07-28 11:42:10 1043
原创 使用objdump grub中的命令
grub2中没有统一的symbol文件而是由一个一个的模块组成,这里以reboot 为例查看objdump -s 和objdump -S的区别
2017-07-27 17:14:32 687
原创 设置网卡设备默认名字是eth0/eth1的过程
在网卡设备的驱动中首先会调用 ndev = alloc_etherdev_mq(sizeof(struct hns_nic_priv), NIC_MAX_Q_PER_VF); if (!ndev) return -ENOMEM;来申请一个struct net_device *ndev;#define alloc_etherdev_mq(sizeof
2017-07-27 11:14:20 6511
原创 grub2 中时间的获取在arm和arm64的差别
在arm32的时候,在grub中通过调用bios提供的create_event 来产生时间戳,源码路径如下:grub-core/kernel/arm/efi/init.cincrement_timer (grub_efi_event_t event __attribute__ ((unused)), void *context __attribute__ ((unused)
2017-07-27 09:38:31 2306
原创 ceph系统的整体逻辑架构
ceph系统的逻辑结构如下:rados:是有大量的存储节点组成,每个节点都有字节的硬件资源(cpu/memory/net),和软件资源 例如os和文件系统,rados本身就是一个对象存储系统.librados:对rados进行的抽象和封装,因此librados也是对象存储的文件系统rdos gw:提供和swift兼容的RESTfulrbd:提供一个块设备接口,主要用于虚拟化场景
2017-07-24 14:24:14 834
原创 kernel中的除法总结
在lib/div64.c 中提供了除法操作static inline u64 div_u64(u64 dividend, u32 divisor); //无符号除法操作:除数是无符号64bit,被除数是无符号32static inline s64 div_s64(s64 dividend, s32 divisor);//有符号除法操作:除数是有符号64bit,被除数是有符号32stat
2017-07-21 11:35:28 6611
原创 通过ktime 测试code 运行时间
在kernel中可以按照下面的sample code来通过ktime测量code运行的时间 ktime_t ktime; s64 runtime = 0; ktime = ktime_get(); xxx xxx 需要测量时间的code xxx ktime = ktime
2017-07-21 10:52:38 5995 1
原创 dma client test
在driver/dma/dmatest.c 可以测试dma client.config DMATEST tristate "DMA Test client" depends on DMA_ENGINE select DMA_ENGINE_RAID help Simple DMA test client. Say N unless you'r
2017-07-21 10:26:46 3547
原创 使用NAPI的完整例子
hns_nic_try_get_ae->hns_nic_init_ring_datastatic int hns_nic_init_ring_data(struct hns_nic_priv *priv){struct hnae_handle *h = priv->ae_handle;struct hns_nic_ring_data *rd;bool is_ver1 = AE_
2017-07-18 15:19:50 3090
原创 net_device_ops的ndo_open和ndo_start_xmit函数
net_device_ops的ndo_open 函数实在dev_open->__dev_open 中打开的. if (!ret && ops->ndo_open) ret = ops->ndo_open(dev);static int hns_nic_net_open(struct net_device *ndev){ struct hns_nic
2017-07-18 11:01:05 8648 1
原创 acpi的_PXM 表示device所在的numa id
如果使能了CONFIG_NUMA#ifdef CONFIG_NUMAstatic inline int dev_to_node(struct device *dev){ return dev->numa_node;}static inline void set_dev_node(struct device *dev, int node){ dev->nu
2017-07-17 09:38:54 2104
原创 optee 中静态memory的管理
optee os中的静态memory都存在static_memory_map 这个数组中,这里的#define MAX_MMAP_REGIONS 13所以这个数组最大保存14个静态memorystatic struct tee_mmap_region static_memory_map[MAX_MMAP_REGIONS + 1] __early_bss;这个数组会在core_in
2017-07-14 15:57:58 2019
原创 对TA 镜像文件的加密
optee中通过scripts中的sign.py 来对tee签名#def get_args(): from argparse import ArgumentParser parser = ArgumentParser() parser.add_argument('--key', required=True, help='Name of key file
2017-07-14 14:55:21 995
原创 通过memblock的debugfs接口查看memblock信息
在mm/memblock.c 中会为memblock 在/sys/kernel/debug 下为memblock新建一个入口,通过这个入口可以看到bios 传给kernel的memory和在kernel中已经reserve 好的memory.static int __init memblock_init_debugfs(void){//在调用debugfs_create_dir 是如果
2017-07-14 09:24:00 1981
原创 tee driver 对共享内存的管理
在driver/tee/optee/core.c中的optee_probe函数中会调用optee_config_shm_memremap 来配置secure world 和 normal world之间的共享内存static struct tee_shm_pool *optee_config_shm_memremap(optee_invoke_fn *invoke_fn, void **m
2017-07-13 17:08:36 1663
原创 netperf 测试
下载源码后tar xf netperf-2.7.0.tar.gzcd netperf-2.7.0./configure --build=aarch64-unknown-linux-gnumake && make install这个时候有可能发生下面的错误针对这个问题solution 如下:最终nerservice 这个bin已经build 出来了
2017-07-13 14:43:03 1455
原创 coremark测试
coremark的官网在http://www.eembc.org/coremark/index.php。注册后申请就可以拿到源码拿到源码后通过下面的方法即可以编译运行tar xf coremark_v1.0.tgzcd coremark_v1.0makecoremark 运行的结果会生成两个文件run1.log和run2.log
2017-07-13 10:05:03 6532
原创 kernel中的tee driver
optee 驱动主要是tee_supplicant和libteec 和tee 交互的桥梁.其路径在drivers/tee 这个路径下:其核心文件有两一个,一个是tee_core.c ,另外一个是optee/core.c先看tee_core.cstatic int __init tee_init(void){ int rc;//新建一个class,这样就可以在/sys/cl
2017-07-13 09:30:25 2066
原创 通过cache_line_size得到L1 cache size
通过cache_line_size 可以得到L1 cache的size if (cache_line_size() == 128 || cache_line_size() == 256) { mlx4_dbg(dev, "Enabling CQE stride cacheLine supported\n"); /* Changing the real
2017-07-12 09:12:51 3202
原创 DO_ONCE 和 printk_once
DO_ONCE 这个宏是是kernel 为避免一个函数被调用两次而定义的宏#define DO_ONCE(func, ...) \ ({ \ bool ___ret = false; \
2017-07-12 08:53:18 1601
原创 e1000 网卡使用NAPI
在e1000 网卡的probe函数中会调用netif_napi_add 来注册在第一次接收中断后的poll函数。netif_napi_add(netdev, &adapter->napi, e1000_clean, 64);在e1000_setup_rx_resources 函数中会申请一个4k的DMA bufferstatic int e1000_setup_rx_resources
2017-07-12 08:52:35 2526
原创 java 测试
安装包 128 2017-07-10 05:15:25 zypper install java 129 2017-07-10 05:16:28 java -version这里就可以运行java version命令,如果要编译的话,还需要安装下面的包。这里一定要注意java的测试文件的名字就是类的名字。我还在这里犯了个错误 150 2017-07-10 05:25:26
2017-07-10 17:41:26 397
原创 cmake 测试
首先写一个简单的c语言程序通过cmake 生产makefile,然后再通过makefile 来编译程序,并运行那个程序cmake 和makefile后执行后的目录
2017-07-10 10:34:30 835
原创 scsi 底层实现的template(sas/sata host)
scsi 子系统是一个分层结构,总共分为三层Upper leve:disk driver(linux/drivers/scsi/sd.c), taple driver(linux/drivers/scsi/st.c),cdrom driver(linux/drivers/scsi/sr.c),generic driver(linux/drivers/scsi/sg.c)mid leve
2017-07-07 10:51:51 1053
原创 grub2的exit命令
在grub-core/commands/minicmd.c 中有实现cat/help/dump/rmmod/lsmod/exit 命令GRUB_MOD_INIT(minicmd){ cmd_cat = grub_register_command ("cat", grub_mini_cmd_cat, N_("FILE"), N_("Show t
2017-07-06 17:02:51 1008
原创 通过bcc 使用ebpf
通过前一篇博文知道要使用ebpf debug kernel还是相当麻烦的,github 上有个项目https://github.com/iovisor/bcc 可以简化ebpf的操作,应为kernel space已经支持ebpf,所以这个项目主要集中在user space部分的编写,user space 可以通过各种语言编写,这里以python为例.下面的代码的是在调用sys_clone的
2017-07-06 09:33:26 3023
原创 ebpf 实例
ebpf的全程是enhancement to berkeley packet filter。网上介绍的资料有很多,举个例子。ebpf的code 都分成user space 和 kernel space的两部分,在/samples/bpf 路径下有很多例子我以其中的一个为例首先看kernel 部分SEC("kprobe/__netif_receive_skb_core")in
2017-07-06 09:24:04 3230
原创 kprobe
kprobe 则可以分别在被探测函数的前后分别执行毁掉函数,kprobe->pre_handle->被探测函数->post_handler.当执行到被探测函数发生fault(例如怕个fault)会调用fault_handler,当陷入breakopint是会调用break_handler例如下例会在执行_do_fork前执行handler_pre,执行完成后调用handler_post,当
2017-07-06 09:09:20 526
EDK_II_UserManual_0_7.pdf
2017-03-24
EDK_II Module Writer_s Guide_0_7.pdf
2017-03-24
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人