自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(44)
  • 资源 (3)
  • 收藏
  • 关注

原创 smmu学习笔记之streamtable 2

streamtable的另一种组织方式是linear,调用的是static int arm_smmu_init_strtab_linear(struct arm_smmu_device *smmu){    void *strtab;    u64 reg;    u32 size;    struct arm_smmu_strtab_cfg *cfg = &smmu->s

2017-02-28 15:01:21 1364

原创 smmu学习笔记之streamtable

streamtable有两种组织方式,根据ARM_SMMU_FEAT_2_LVL_STRTAB来判断而这个flag是在arm_smmu_device_hw_probe 中通过读取ARM_SMMU_IDR0 这个寄存器来判断的static int arm_smmu_device_hw_probe(struct arm_smmu_device *smmu){    u32 reg;

2017-02-28 09:50:30 2069

原创 krealloc 源码分析

kernel 中提供了一个函数krealloc,这个函数可以重新申请一块memory,但是会将原来memory中的内容copy过来,比较适合0 size 数组的问题.其使用举例如下:        fwspec = krealloc(dev->iommu_fwspec, size, GFP_KERNEL);第一个参数是需要扩大size的指针,以数组为例的话,就是数组头指针,第二个是

2017-02-27 10:52:35 3007

原创 添加当前路径到PATH中

如果你在当前路径下有一个shell脚本例如sh2.sh 这样每次需要通过./sh2.sh 或者 sh sh2.sh 来执行。通过下面的命令可以将当前路径临时加到环境变量中,然后直接sh2.sh就可以执行了,因为bash可以找到这个shell的路径了ADD_PATH="$(pwd)" PATH="${ADD_PATH}:${PATH}"export PATH

2017-02-25 16:42:17 8155

原创 smmu 学习笔记之attach_dev 2

static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev){    int ret = 0;    struct arm_smmu_device *smmu;//从iommu_domain 中得到arm_smmu_domain    struct arm_smmu_domain

2017-02-25 15:27:22 2315

原创 smmu 学习笔记之attach_dev

根据hns_uio_set_iommu 函数中的flowvoid hns_uio_set_iommu(struct nic_uio_device *priv, unsigned long iova,               unsigned long paddr, int gfp_order){    struct iommu_domain *domain;    int

2017-02-25 14:29:35 2428

原创 smmu 学习笔记之domain_alloc

smmu提供iommu_domain_alloc 这个接口来申请iommu_domain,举例如下:void hns_uio_set_iommu(struct nic_uio_device *priv, unsigned long iova,               unsigned long paddr, int gfp_order){    struct iommu_dom

2017-02-25 11:18:57 1856

原创 sshfs的使用

可以用下列命令在ubuntu上将远端的文件夹同步到本地sudo sshfs -o allow_other,IdentityFile=~/.ssh/id_rsa tao@192.168.1.101:/home/tao/open-user/kernel /home/tao/linux如果提示下面的错误fuse: mountpoint is not emptyfuse: if you a

2017-02-25 10:07:56 3174

原创 smmu 学习笔记 之初始化

在使能了ACPI的情况下,会调用acpi_smmu_v3_init来初始化#ifdef CONFIG_ACPIstatic int __init acpi_smmu_v3_init(struct acpi_table_header *table){    if (iort_node_match(ACPI_IORT_NODE_SMMU_V3))        return arm

2017-02-25 09:37:55 3791

原创 RCU's CPU Stall Detector

有时候可以会打印INFO: rcu_bh_state detected stalls on CPUs/tasks: { } (detected by 4, 2502 jiffies) 类似的log。这不是bug,而是提醒你可能某些code执行太久了,超过CONFIG_RCU_CPU_STALL_TIMEOUT 定义的时间了。具体的call flow如下:在每个时间中断函数中都会走这个flow,也就

2017-02-24 14:32:49 8903 1

原创 CONFIG_PREEMPT 和 CONFIG_PREEMPT_VOLUNTARY的区别

在kernel/kernel/Kconfig.preempt中定义了两种抢占策略,PREEMPT_VOLUNTARY和PREEMPT其中PREEMPT_VOLUNTARY 适用于有桌面的环境,而PREEMPT 则可以用于桌面或者嵌入式,其调度延迟是毫秒级别的。详细说明如下:config PREEMPT_VOLUNTARY    bool "Voluntary Kernel Preemp

2017-02-24 14:16:50 5504

原创 pdb debug python

如果是命令行debug的话,只要加上 -m pdb。可以看到(Pdb)就可以debug了。看到举例如下:/grub-master$ python -m pdb util/import_unicode.py unicode/UnicodeData.txt unicode/BidiMirroring.txt unicode/ArabicShaping.txt grub-core/unidata.c

2017-02-24 09:18:10 513

原创 nova创建虚拟机时资源的检测

在通过/nova/compute/manager.py:ComputeManager中的_build_and_run_instance来创建虚拟机的时候,会通过claim机制来监视当前的资源是否够创建虚拟机    def _build_and_run_instance(self, context, instance, image, injected_files,            ad

2017-02-24 09:01:42 2243

原创 grub中的import_unicode.py 分析之二

在autogen.sh中会执行下面的python脚本echo "Importing unicode..."${PYTHON} util/import_unicode.py unicode/UnicodeData.txt unicode/BidiMirroring.txt unicode/ArabicShaping.txt grub-core/unidata.c其中这个util/impo

2017-02-23 16:13:15 605

原创 grub中的import_unicode.py 分析之一

在autogen.sh中会执行下面的python脚本echo "Importing unicode..."${PYTHON} util/import_unicode.py unicode/UnicodeData.txt unicode/BidiMirroring.txt unicode/ArabicShaping.txt grub-core/unidata.c其中这个util/impo

2017-02-23 15:28:02 518

原创 grub中的autogen.sh分析

#! /usr/bin/env bashset -e #当有错误发生时,就退出当前脚本。# Set ${PYTHON} to plain 'python' if not set already: ${PYTHON:=python} # 如果没有定义PYHON的话,就让PYTHON=python。export LC_COLLATE=Cunset LC_ALLf

2017-02-23 14:27:22 1334

原创 DMA Coherent Mapping

一般我们通过dma_alloc_coherent 和 dma_free_coherent 来申请和释放coherent memory。申请coherent memory的代价比较大,推荐只有在要申请的memory大于1个page是才推荐用,否则推荐用dma_pool 来申请.static inline void *dma_alloc_coherent(struct device *dev, s

2017-02-22 16:19:43 4655

原创 shell bashdb debug

我是ubuntu的系统首先通过sudo apt install bashdb 按照bashdb然后通过sudo bashdb --debug sh2 来调试sh2 这个shell脚本下面是实际运行的结果tao@tao-ThinkCentre-M8600t-N000:~$ sudo bashdb --debug sh2bash debugger, bashdb, release

2017-02-22 08:45:22 1200

原创 kernel是如何选择iommu的呢?

在arch/arm64/mm/dma-mapping.c 中定义了三种dma的ops,分别是:dummy_dma_ops/swiotlb_dma_ops/iommu_dma_ops 。那kernel是如何选择iommu的呢?如果acpi表中定义了IORT 子表的话,flow如下:acpi_iort_init->iort_init_platform_devicesstatic voi

2017-02-21 16:35:59 6610

原创 dma_mmap_coherent 如何和iommu联系在一起呢?

当在code中调用dma_mmap_coherent时,这是个宏#define dma_mmap_coherent(d, v, c, h, s) dma_mmap_attrs(d, v, c, h, s, 0)在dma_mmap_attrs 中又会掉用get_dma_ops 来得到dma的opsstatic inline intdma_mmap_attrs(struct devic

2017-02-21 16:17:17 3561

原创 ktime实现忙闲等待

可以使用ktime来实现等待。例如下面这段code首先用ktime_get()得到当前时间,然后使用ktime_add_us来得到需要到期的时间。    ktime_t timeout = ktime_add_us(ktime_get(), ARM_SMMU_POLL_TIMEOUT_US);while (ktime_compare(ktime_get(), timeout) >

2017-02-21 15:24:13 2271

原创 suspend通过console debug

当在传递给kernel的cmdline 添加no_console_suspend的时候static int __init console_suspend_disable(char *str){    console_suspend_enabled = false;    return 1;}__setup("no_console_suspend", console_susp

2017-02-21 11:19:20 2119

原创 register_console的理解

前面我们知道注册earlycon和console 最终都是调用register_console 这个函数,这个函数有几点需要注意一下1:可以注册多个console,但是不能重复注册。且earlycon只能有一个。    if (console_drivers)        for_each_console(bcon)            if (WARN(bcon == new

2017-02-21 10:56:24 3144

原创 earlycon

当通过cmdline 传递给kernel earlycon这个参数时候的解析函数如下:static int __init param_setup_earlycon(char *buf){    int err;    /*     * Just 'earlycon' is a valid param for devicetree earlycons;     * don

2017-02-21 10:41:38 2322

原创 修改已经push的commit,但是不增加commit history

如果线修改应经push到仓库的code,可以参考下面的命令 2010  git add grub-core/loader/arm64/linux.c 2011  git commit -m "fix" 2012  git log --oneline  2013  git log -p 2014  git log --oneline  2015  git rebase -i

2017-02-21 10:14:40 2103

原创 当前cpu发生__do_kernel_fault时,其他cpu是如何处理的呢?

在kernel发生translation fault的时候会调用下面的函数static int __kprobes do_translation_fault(unsigned long addr,                      unsigned int esr,                      struct pt_regs *regs){    if (a

2017-02-17 15:15:05 4799

原创 acpi 表中对spcr的parse来初始化串口

在acpi_boot_table_init 中会调用parse_spcr 来从SPCR表中parse console参数,这就不用通过在cmdline中传递了。这个函数首先acpi_get_table_with_size 得到SPCR,然后根据table->interface_type 得到iotype。再根据table->baud_rate得到波特率。int __init parse_s

2017-02-17 11:28:06 2391

原创 kernel debug

首先打开CONFIG_KALLSYMS=yCONFIG_KALLSYMS_ALL=yCONFIG_DEBUG_BUGVERBOSE=yCONFIG_STACKTRACE=y如果kernel panic的时候报start_kernel +32 的地方有问题,这个时候我一般把vmlinux copy到板子上,然后执行下列命令就可以了.[root@CentOS ~]# gdb v

2017-02-16 16:27:01 1095

原创 kernel支持4k/16k/64k pagesize

在从arm64-stub.c 中会进行pagesize的check,从arm64 spec来看,arm64主要支持4k/16/64 这三种pagesizeefi_status_t check_platform_features(efi_system_table_t *sys_table_arg){    u64 tg;    /* UEFI mandates support f

2017-02-16 09:06:32 5610 1

原创 acpi event

在使用netlink时,我们一般会使用genl_register_family 和 genl_register_ops,或者直接使用genl_register_family_with_ops,但是genl_register_ops的作用仅仅是是用户空间收到消息是实际处理的回调函数,如果我们只是向用户空间发送一个字符串的话,只调用genl_register_family 就可以了。例如在acpi

2017-02-14 14:47:29 1574

原创 acpi bus 的scan

在acpi子系统中一般我们首先通过下面的方式来注册handlerstatic struct acpi_scan_handler amba_handler = {    .ids = amba_id_list,    .attach = amba_handler_attach,};void __init acpi_amba_init(void){    amba_re

2017-02-14 14:15:19 1085

原创 psci

在setup_arch 中会启动psci的init    if (acpi_disabled)        psci_dt_init();    else        psci_acpi_init();可见dtb和acpi分别调用不同的函数初始,以acpi为例int __init psci_acpi_init(void){    if (!acpi_psci_p

2017-02-09 17:27:31 4076

原创 cpu hotplug 源码分析

当通过下面的code是cpu offline的话。echo 0 > /sys/devices/system/cpu/cpuX/online具体的code flow如下:int device_add(struct device *dev)->device_create_file而dev_attr_onlline 就是按照下面的方式定义的static ssize_t online_

2017-02-09 14:58:58 3493

原创 efi的sys文件系统接口

在driver/firmware/efi/efi.c 中通过subsys_initcall(efisubsys_init);来初始化efisubsysstatic int __init efisubsys_init(void){    int error;    if (!efi_enabled(EFI_BOOT))        return 0;    /* W

2017-02-08 16:19:23 2128

原创 reboot reason的客制化

kernel的reboot系统调用实现如下:SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd,        void __user *, arg){    struct pid_namespace *pid_ns = task_active_pid_ns(current);    char

2017-02-08 15:53:23 2562

原创 kernel 调用uefi的run time service 关机

当上层调用reboot命令时,就会调用到arch/arm64/kernel/process.c 中的SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd,void __user *, arg){    struct pid_namespace *pid_ns = task_active_pid_ns(curr

2017-02-08 15:27:08 2906

原创 kernel中efi变量初始化

在setup_arch->efi_init->uefi_init->efi_config_parse_tablesint __init efi_config_parse_tables(void *config_tables, int count, int sz,                   efi_config_table_type_t *arch_tables){

2017-02-08 11:57:46 1862

原创 dmi

在arch/arm64/kernel/efi.c 中会对dmi初始化,dmi的全程是Desktop Management Interface.属于smbios的一部分.static int __init arm64_dmi_init(void){    /*     * On arm64, DMI depends on UEFI, and dmi_scan_machine() ne

2017-02-08 11:09:04 2584

原创 uefi+arm64+acpi 组合时boot_command_line的获取

在efi_entry 中会通过下面的code从uefi中拿到cmdline    cmdline_ptr = efi_convert_cmdline(sys_table, image, &cmdline_size);    if (!cmdline_ptr) {        pr_efi_err(sys_table, "getting command line via LOADED_

2017-02-08 10:13:06 2502

原创 arm64+devicetree 组合中的boot_command_line的获取

setup_arch(&command_line)->setup_machine_fdt(__fdt_pointer);需要注意的是*command_line 是指向到 boot_command_line;而boot_command_line是一个静态数组,在arm64的环境下是2048,也就是说bootloader传递给kernel的commandline超过2048就要修改kernel源代码加

2017-02-08 09:51:38 3457

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除