- 博客(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 1367
原创 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 2073
原创 krealloc 源码分析
kernel 中提供了一个函数krealloc,这个函数可以重新申请一块memory,但是会将原来memory中的内容copy过来,比较适合0 size 数组的问题.其使用举例如下: fwspec = krealloc(dev->iommu_fwspec, size, GFP_KERNEL);第一个参数是需要扩大size的指针,以数组为例的话,就是数组头指针,第二个是
2017-02-27 10:52:35 3011
原创 添加当前路径到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 8156
原创 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 2316
原创 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 2429
原创 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 1860
原创 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 3175
原创 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 3798
原创 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 8907 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 5509
原创 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 2248
原创 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 4657
原创 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 1201
原创 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 6614
原创 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 3566
原创 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 2275
原创 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 3149
原创 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 2109
原创 当前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 4807
原创 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 2398
原创 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 5617 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 1087
原创 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 4079
原创 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 3495
原创 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 2129
原创 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 2564
原创 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 2911
原创 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 1863
原创 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 2587
原创 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 3458
EDK_II_UserManual_0_7.pdf
2017-03-24
EDK_II Module Writer_s Guide_0_7.pdf
2017-03-24
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人